大话设计模式读书笔记(十六) 组合模式
组合模式:
组合模式(Composite):将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
组合模式UMl结构图:
java代码实现:
/** *Compoent为组合中的对象声明一个接口 *在适当情况下,实现所有类共有接口的默认行为。 *声明一个接口用于访问和管理Compoent的子部件 */ public abstract class Compoent { protected String name; public Compoent(String name) { super(); this.name = name; } //通常用add和remove方法来提供增加和移除树叶或树枝的功能 public abstract void add(Compoent c); public abstract void reomve(Compoent c); public abstract void display(int depth); }
//Leaf在组合表示树叶节点,树叶没有子节点 public class Leaf extends Compoent{ public Leaf(String name) { super(name); } /** * 由于树叶没有再增加分支和树叶,所以Add和remove方法再实现他们没有意义 * 但这样做可以消除叶节点和枝节点在抽象层次的区别,他们具备完全一致的接口 */ @Override public void add(Compoent c) { System.out.println("不能再增加子节点"); } @Override public void reomve(Compoent c) { System.out.println("没有子节点可以被移除"); } @Override public void display(int depth) { //叶节点的具体方法,此处是显示其名称和级别 System.out.println("-"+depth+name); } }
public class Composite extends Compoent{ private List<Compoent> childen = new ArrayList<Compoent>(); public Composite(String name) { super(name); } @Override public void add(Compoent c) { childen.add(c); } @Override public void reomve(Compoent c) { childen.remove(c); } @Override public void display(int depth) { //显示其枝节点名称,并对其下级遍历 System.out.println("-"+depth+name); for (Compoent compoent : childen) { compoent.display(depth+2); } } }
public class Mian { public static void main(String[] args) { //生成跟节点root ,根上长有两个子节点LeafA和LeafB Composite root = new Composite("root"); root.add(new Leaf("Leaf A")); root.add(new Leaf("Leaf B")); //根上长有一个分支compositex,分支上长有两篇树叶Leaf XA和Leaf XB Composite compositex = new Composite("Composite X"); compositex.add(new Leaf("Leaf XA")); compositex.add(new Leaf("Leaf XB")); root.add(compositex); //分支compositex上长有另一个分支compositeXy //并且另一个分支compositeXy上又长有两个树叶Leaf XYA和Leaf XYB Composite compositeXy = new Composite("Composite XY"); compositeXy.add(new Leaf("Leaf XYA")); compositeXy.add(new Leaf("Leaf XYB")); compositex.add(compositeXy); //树根root上又长了两片树叶Leaf C和Leaf D //但是Leaf D没长牢,被风吹走了 root.add(new Leaf("Leaf C")); Leaf leaf = new Leaf("Leaf D"); root.add(leaf); root.reomve(leaf); //显示大树的样子 root.display(1); } }
组合模式使用场景:
当你发现需求中是体现部分与整体层次的结构时,以及你希望客户忽略组合对象和单个对象的不同,同一地使用组合结构的所有对象时,就应该考虑组合模式。