Composite模式

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组合模式,将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个

   对象和组合对象的使用具有一致性。
 

猜你喜欢

转载自jaesonchen.iteye.com/blog/2286889