组合模式是指将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
也就说是,对树形结构中任意一个结点内容访问(包括其所有子节点),只使用一个方法。
树形结构:通俗的讲就是对象中可以有多个对象,组成一个树形结构。
1,结点抽象类
public abstract class Component { protected String name; public Component(String name) { this.name = name; } public abstract void operation(); public void add(Component c) { throw new UnsupportedOperationException(); } public void remove(Component c) { throw new UnsupportedOperationException(); } public Component getChild(int i) { throw new UnsupportedOperationException(); } public List<Component> getChildren() { return null; } }
2,组合结点
public class Composite extends Component { private List<Component> components = new ArrayList<>(); public Composite(String name) { super(name); } @Override public void operation() { System.out.println("组合节点"+name+"的操作"); //调用所有子节点的操作 for (Component component : components) { component.operation(); } } @Override public void add(Component c) { components.add(c); } @Override public void remove(Component c) { components.remove(c); } @Override public Component getChild(int i) { return components.get(i); } @Override public List<Component> getChildren() { return components; } }
3,叶子结点
public class Leaf extends Component { public Leaf(String name) { super(name); } @Override public void operation() { System.out.println("叶节点"+name+"的操作"); } }
4,测试
public class CompositePattern { public static void main(String[] args) { //创建根节点对象 Component component = new Composite("component"); //创建两个组合节点对象 Component composite1 = new Composite("composite1"); Component composite2 = new Composite("composite2"); //将两个组合节点对象添加到根节点 component.add(composite1); component.add(composite2); //给第一个组合节点对象添加两个叶子节点 Component leaf1 = new Leaf("leaf1"); Component leaf2 = new Leaf("leaf2"); composite1.add(leaf1); composite1.add(leaf2); //给第二个组合节点对象添加一个叶子节点和一个组合节点 Component leaf3 = new Leaf("leaf3"); Component composite3 = new Composite("composite3"); composite2.add(leaf3); composite2.add(composite3); //给第二个组合节点下面的组合节点添加两个叶子节点 Component leaf4 = new Leaf("leaf4"); Component leaf5 = new Leaf("leaf5"); composite3.add(leaf4); composite3.add(leaf5); //执行所有节点的操作 //component.operation(); composite3.operation(); //对某个子结点操作 } }
5,打印结果
组合节点composite3的操作
叶节点leaf4的操作
叶节点leaf5的操作
Process finished with exit code 0