结构图
模式说明
类设计
模式说明
- 无类级扩展点。扩展方法在抽象接口Component中。
- Component提供Composite和Leaf的抽象接口声明和共有方法。Leaf是Component的特殊形式,Composite是Component的一般树状结构描述。
- 客户端需要知道具体使用哪个Component具体实现类。
- 将对象组合成树形结构以表示‘部分-整体’的层次结构,组合模式使得用户对单个对象的使用具有一致性。
/**
* @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);
}
@Override
public void add(Component component) {
throw new RuntimeException("cannot add at leaf level.");
}
@Override
public void remove(Component component) {
throw new RuntimeException("cannot remove at leaf level.");
}
@Override
public 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);
}
@Override
public void add(Component component) {
children.add(component);
}
@Override
public void remove(Component component) {
children.remove(component);
}
@Override
public 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);
}
}
}