组合模式
允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
使用组合结构,我们能把相同的操作应用在组合和个别对象上。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。
说明:
1、组合模式使添加或者删除子节点变得容易;
场景:
1、想要标识对象的部分-整体结构;
2、想要客户端忽略组合对象和个体对象的差异,客户端将统一使用组合结构中的所有对象;
/** * 为组合中所有对象定义一个接口,不管是组合还是节点 * */ public abstract class Component { public void add(Component component) { new UnsupportedOperationException(); } public void remove(Component component) { new UnsupportedOperationException(); } public String getName() { return null; } public void foreach(){ new UnsupportedOperationException(); } } |
/** * 子节点 * */ public class Leaf extends Component{ String name; public Leaf(String name) { this.name = name; } @Override public void add(Component component) { System.out.println("不存在子节点,无法添加。。。"); } @Override public void remove(Component component) { new UnsupportedOperationException(); } @Override public String getName() { return name; } } |
/** * 组合类 * */ public class Composite extends Component{ String name; private List<Component> child = new ArrayList<Component>(); public Composite(String name) { this.name = name; } @Override public void add(Component component) { child.add(component); } @Override public void remove(Component component) { child.remove(component); } @Override public void foreach(){ for(Component component : child) { System.out.println(component.getName()); } } @Override public String getName() { return name; } } |
public class Client { public static void main(String[] args) { Component component = new Composite("根节点"); Component child = new Composite("一级子节点child"); Component child_1 = new Leaf("一级子节点child之子节点一"); Component child_2 = new Leaf("一级子节点child之子节点二"); child.add(child_1); child.add(child_2); Component child2 = new Composite("一级子节点child2"); component.add(child); component.add(child2); component.foreach(); } } |
参考资料:《Head First 设计模式》
http://www.cnblogs.com/jingmoxukong/p/4221087.html