针对问题:组合模式使我们在处理树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
组合模式结构图:
组合模式实现代码:
/** * 为树叶或树枝抽象一个接口 * @author bruce * */ public abstract class Component { public abstract void operation(); public void add(Component component){ throw new UnsupportedOperationException(); } public void remove(Component component){ throw new UnsupportedOperationException(); } public Component getChild(int index){ throw new UnsupportedOperationException(); } } /** * 树叶 * @author bruce * */ public class Leaf extends Component{ private String name; public Leaf(String name){ this.name=name; } @Override public void operation() { // TODO Auto-generated method stub System.out.println(name); } } /** * 树枝 * @author bruce * */ public class Composite extends Component{ private List<Component> list=new ArrayList<Component>(); private String name; public Composite(String name){ this.name=name; } @Override public void operation() { // TODO Auto-generated method stub System.out.println(name); /** * for..each 递归调用operation() */ Iterator<Component> iterator=list.iterator(); while(iterator.hasNext()){ Component component=iterator.next(); component.operation(); } } @Override public void add(Component component) { // TODO Auto-generated method stub list.add(component); } @Override public void remove(Component component) { // TODO Auto-generated method stub list.remove(component); } @Override public Component getChild(int index) { // TODO Auto-generated method stub return list.get(index); } } /** * 测试 * @author bruce * */ public class Client { public static void main(String[] args) { Component c=new Composite("C:/"); Component cl=new Leaf("test.java"); Component cc=new Composite("C:/program file/"); Component cclA=new Leaf("QQ.exe"); Component cclB=new Leaf("360.exe"); cc.add(cclA); cc.add(cclB); c.add(cl); c.add(cc); c.operation(); /** * output: * C:/ test.java C:/program file/ QQ.exe 360.exe */ } }