1. 程式人生 > >composite - 物件結構型模式

composite - 物件結構型模式

   1.意圖
        將物件組合成樹形結構以表示“部分-整體”的層次結構,composite使得使用者對
        單個物件和組合物件的使用具有一致性。
      2.參與者
      component -為組合中的物件宣告介面
                -在適當的情況下,實現所有類共有介面的預設行為
                -宣告一個介面用於訪問和管理component的子元件
                -(可選)在遞迴結構中定義一個介面,用於訪問父
                                    部件,並在合適的情況下實現它
      Leaf      -在組合中表示葉節點物件
                -在組合中定義圖元物件的行為
      composite -定義由子部件的那些部件的行為
                -儲存子部件
                -在component介面中實現與子部件相關的操作

3.結構

4.程式碼

public abstract class Component {
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	abstract void add(Composite c);
	abstract void remove();//移除當前節點
	abstract void removeAll();//移除當前節點和其後代節點
	abstract void setFather(Composite c);
	abstract List<Composite> getChilds();
	abstract Component getFather();
	abstract Iterator<Composite> createIterable();
	abstract void Traversal();
}


public class Composite extends Component {
	private List<Composite> child;//當child == null時Composite為Leaf
	private Composite father;

	@Override
	void add(Composite c) {
		if (child == null) {
			child = new LinkedList<Composite>();
		}
		c.setFather(this);
		child.add(c);

	}

	@Override
	void remove() {
		if(father != null){
			for(Composite composite:child){
				composite.setFather(father);
				father.getChilds().add(composite);
			}
			father.getChilds().remove(this);
			
		}
	}

	@Override
	Iterator<Composite> createIterable() {
		return child.iterator();
	}

	@Override
	void removeAll() {
		if(father != null){
			father.getChilds().remove(this);
			
		}
	}

	@Override
	void setFather(Composite c) {
		this.father = c;

	}

	@Override
	Component getFather() {
		return father;
	}

	@Override
	List<Composite> getChilds() {
		return child;
	}

	@Override
	void Traversal() {
		System.out.println(this.getName());
		if(child != null){
			for(Composite c:child){
				c.Traversal();
			}
		}
	}

}

public static void main(String[] args) {
		// 建立根節點
		Composite root = new Composite();
		root.setName("中國");
		// 建立省節點
		Composite jx = new Composite();
		jx.setName("江西省");
		Composite gd = new Composite();
		gd.setName("廣東省");
		// 建立市節點
		Composite gz = new Composite();
		gz.setName("廣州市");
		Composite qy = new Composite();
		qy.setName("清遠市");
		Composite ja = new Composite();
		ja.setName("吉安市");
		Composite nc = new Composite();
		nc.setName("南昌市");
		gd.add(gz);
		gd.add(qy);
		
		jx.add(ja);
		jx.add(nc);
		root.add(gd);
		root.add(jx);

		// 層次遍歷
		/*Composite visitor = null;
		Queue<Composite> q = new LinkedBlockingDeque<Composite>();
		q.add(root);
		while (!q.isEmpty()) {
			visitor = q.poll();
			System.out.println(visitor.getName());
			List<Composite> childs = visitor.getChilds();
			if(childs != null){
				q.addAll(visitor.getChilds());
			}
		}*/
		//gd.Traversal();
		gd.removeAll();
		root.Traversal();
	}
}