composite - 物件結構型模式
阿新 • • 發佈:2018-12-18
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(); } }