结构型模式-组合

来源:互联网 发布:c类网络的子网掩码 编辑:程序博客网 时间:2024/04/28 06:23
结构图


模式说明
  1. 无类级扩展点。扩展方法在抽象接口Component中。
  2. Component提供Composite和Leaf的抽象接口声明和共有方法。Leaf是Component的特殊形式,Composite是Component的一般树状结构描述。
  3. 客户端需要知道具体使用哪个Component具体实现类。
  4. 将对象组合成树形结构以表示‘部分-整体’的层次结构,组合模式使得用户对单个对象的使用具有一致性。
客户端
/** * @param args * -root * ---Leaf A * ---Leaf B * ---Composite X * -----Leaf XA * -----Leaf XB * -----Composite XY * -------Leaf XYA * -------Leaf XYB * ---Leaf C */public static void main(String[] args) {Component root = new Composite("root");root.add(new Leaf("Leaf A"));root.add(new Leaf("Leaf B"));Component comp = new Composite("Composite X");comp.add(new Leaf("Leaf XA"));comp.add(new Leaf("Leaf XB"));root.add(comp);Component comp2 = new Composite("Composite XY");comp2.add(new Leaf("Leaf XYA"));comp2.add(new Leaf("Leaf XYB"));comp.add(comp2);root.add(new Leaf("Leaf C"));Component leaf = new Leaf("Leaf D");root.add(leaf);root.remove(leaf);root.display(1);}


类设计
public abstract class Component {private String name;protected Component(String name) {this.name = name;}public final String getName() {return this.name;}public abstract void add(Component component);public abstract void remove(Component component);public abstract void display(int depth);}public class Leaf extends Component {protected Leaf(String name) {super(name);}@Overridepublic void add(Component component) {throw new RuntimeException("cannot add at leaf level.");}@Overridepublic void remove(Component component) {throw new RuntimeException("cannot remove at leaf level.");}@Overridepublic void display(int depth) {char[] chars = new char[depth];Arrays.fill(chars, '-');System.out.println(new String(chars) + getName());}}public class Composite extends Component {private List<Component> children = new ArrayList<Component>();protected Composite(String name) {super(name);}@Overridepublic void add(Component component) {children.add(component);}@Overridepublic void remove(Component component) {children.remove(component);}@Overridepublic void display(int depth) {char[] chars = new char[depth];Arrays.fill(chars, '-');System.out.println(new String(chars) + getName());for (Component component : children) {component.display(depth + 2);}}}


0 0