1、定义一个接口,作为组合的枢纽进行传递 package com.org.composite;//定义接口:用来指定说明要完成那些行为动作public interface Component { public void doSomething(); }
2、定义一个实现类,作为树形结构的最低端,实际操作的也是该对象 package com.org.composite;//实现Component接口,该类主要用来做一些业务逻辑或者其他动作的行为,实际存储操作的也是该对象public class Leaf implements Component{ @Override public void doSomething() { System.out.println("Leaf doSomething"); }}
3、定义另一个实现类,作为树形结构的最顶端,作为组合模式中的实现者,里面包含组合的增删改查等操作方法,接口实现的方法作为两个实现类的互通方法 package com.org.composite;import java.util.ArrayList;import java.util.List;//实现Component接口,用来做对象Leaf的增删改查,但这种方式是隐式的,实际操作的是Leaf。此时该对象可看作是Leaf,只不过不直接提供Leaf而是采用这种树形结构方法来进行组合传递public class Composite implements Component{ List<Component> childs = new ArrayList<Component>(); public void add(Component child) { this.childs.add(child); } public void remove(Component child) { this.childs.remove(child); } public Component getChild(int i) { return this.childs.get(i); } public void doSomething() { //这里还包含迭代的思想,如果child是Leaf,则直接调用Leaf的doSomething方法,如果是Component的child,则此时的doSomething方法是Component //中的方法,相当于迭代循环 for (Component child : childs) child.doSomething(); } }
4、开始测试 package com.org.composite;public class Client { public static void main(String[] args) { /** * composite1 * / \ * leaf1 composite2 * / \ * leaf2 leaf3 * Component为中间枢纽,将Leaf向上造型后利用Component来做操作,然后利用接口的特性即可操作Composite方法 * * */ Component leaf1=new Leaf(); Component leaf2=new Leaf(); Component leaf3=new Leaf(); Composite composite1=new Composite(); Composite composite2=new Composite(); composite2.add(leaf2); composite2.add(leaf3); composite1.add(leaf1); composite1.add(composite2); composite1.doSomething(); } }