import java.util.Iterator; interface IComponent { public void operate(); public void add(IComponent component); public void remove(IComponent component); public Iterator<IComponent> iterator(); public void setDepth(int depth); public int getDepth(); } public class Composite implements IComponent { private String name; private int depth = 0; private List<IComponent> childs = new ArrayList<IComponent>(); public Composite(String name) { this.name = name; } @Override public int getDepth() { return depth; } @Override public void setDepth(int depth) { this.depth = depth; } @Override public void operate() { System.out.println("operate ..."); } @Override public void add(IComponent component) { component.setDepth(this.depth + 1); this.childs.add(component); } @Override public void remove(IComponent component) { this.childs.remove(component); } @Override public Iterator<IComponent> iterator() { return childs.iterator(); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("|-").append(this.name); for (Iterator<IComponent> it = this.iterator(); it.hasNext(); ) { IComponent cp = it.next(); sb.append("\n"); for(int i = 0; i < cp.getDepth(); i++) sb.append(" "); sb.append(cp); } return sb.toString(); } public static void main(String[] args) { IComponent root = new Composite("root"); IComponent folder1 = new Composite("folder1"); IComponent folder2 = new Composite("folder2"); IComponent leaf1 = new Leaf("leaf1"); root.add(folder1); root.add(folder2); root.add(leaf1); IComponent folder11 = new Composite("folder11"); IComponent folder12 = new Composite("folder12"); IComponent leaf11 = new Leaf("leaf11"); folder1.add(folder11); folder1.add(folder12); folder1.add(leaf11); IComponent folder21 = new Composite("folder21"); IComponent folder22 = new Composite("folder22"); IComponent leaf21 = new Leaf("leaf21"); folder2.add(folder21); folder2.add(folder22); folder2.add(leaf21); System.out.print(root); } } class Leaf implements IComponent { private String name; private int depth = 0; public Leaf(String name) { this.name = name; } @Override public int getDepth() { return depth; } @Override public void setDepth(int depth) { this.depth = depth; } @Override public void operate() { System.out.println("operate ..."); } @Override public void add(IComponent component) { throw new UnsupportedOperationException("error in add.Leaf can not has child"); } @Override public void remove(IComponent component) { throw new UnsupportedOperationException("error in remove.Leaf can not has child"); } @Override public Iterator<IComponent> iterator() { return null; } @Override public String toString() { return "|-" + this.name; } }
输出为:
|-root
|-folder1
|-folder11
|-folder12
|-leaf11
|-folder2
|-folder21
|-folder22
|-leaf21
|-leaf1
* Composite组合模式,将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个
对象和组合对象的使用具有一致性。