composite定義:
將物件以樹形結構組織起來,以達成「部分-整體」 的層次結構,使得客戶端對單個物件和組合物件的使用具有一致性.
composite比較容易理解,想到composite就應該想到樹形結構圖。組合體內這些物件都有共同介面,當組合體乙個物件的方法被呼叫執行時,composite將遍歷(iterator)整個樹形結構,尋找同樣包含這個方法的物件並實現呼叫執行。可以用牽一動百來形容。
所以composite模式使用到iterator模式,和chain of responsibility模式類似。
composite好處:
1.使客戶端呼叫簡單,客戶端可以一致的使用組合結構或其中單個物件,使用者就不必關係自己處理的是單個物件還是整個組合結構,這就簡化了客戶端**。
2.更容易在組合體內加入物件部件. 客戶端不必因為加入了新的物件部件而更改**。
如何使用composite?
首先定義乙個介面或抽象類,這是設計模式通用方式了,其他設計模式對介面內部定義限制不多,composite卻有個規定,那就是要在介面內部定義乙個用於訪問和管理composite組合體的物件們(或稱部件component).
下面的**是以抽象類定義,一般盡量用介面inte***ce,
public abstract class equipment
//刪除部件方法
public boolean remove(equipment equipment)
//注意這裡,這裡就提供一種用於訪問組合體類的部件方法。
public iterator iter()
public equipment(final string name)
} 抽象類equipment就是component定義,代表著組合體類的物件們,equipment中定義幾個共同的方法。
public class disk extends equipment
//定義disk實價為1
public double netprice()
//定義了disk折扣**是0.5 對折。
public double discountprice() }
disk是組合體內的乙個物件,或稱乙個部件,這個部件是個單獨元素( primitive)。
還有一種可能是,乙個部件也是乙個組合體,就是說這個部件下面還有'兒子',這是樹形結構中通常的情況,應該比較容易理解。現在我們先要定義這個組合體:
abstract class compositeequipment extends equipment
public boolean add(equipment equipment)
public double netprice()
public double discountprice()
//注意這裡,這裡就提供用於訪問自己組合體內的部件方法。
//上面disk 之所以沒有,是因為disk是個單獨(primitive)的元素.
public iterator iter()
public double netprice()
public double discountprice()
} public class cabinet extends compositeequipment
public double netprice()
public double discountprice()
} 至此我們完成了整個composite模式的架構。
我們可以看看客戶端呼叫composote**:
cabinet cabinet=new cabinet("tower");
chassis chassis=new chassis("pc chassis");
//將pc chassis裝到tower中 (將盤盒裝到箱子裡)
cabinet.add(chassis);
//將乙個10gb的硬碟裝到 pc chassis (將硬碟裝到盤盒裡)
chassis.add(new disk("10 gb"));
//呼叫 netprice()方法;
system.out.println("netprice="+cabinet.netprice());
system.out.println("discountprice="+cabinet.discountprice());
上面呼叫的方法netprice()或discountprice(),實際上composite使用iterator遍歷了整個樹形結構,尋找同樣包含這個方法的物件並實現呼叫執行.
composite是個很巧妙體現智慧型的模式,在實際應用中,如果碰到樹形結構,我們就可以嘗試是否可以使用這個模式。
以論壇為例,乙個版(forum)中有很多帖子(message),這些帖子有原始貼,有對原始貼的回應貼,是個典型的樹形結構,那麼當然可以使用composite模式,那麼我們進入jive中看看,是如何實現的.
jive解剖
在jive中 forumthread是forummessages的容器container(組合體).也就是說,forumthread類似我們上例中的 compositeequipment.它和messages的關係如圖:
[thread]
|- [message]
|- [message]
|- [message]
|- [message]
|- [message]
我們在forumthread看到如下**:
public inte***ce forumthread
類似compositeequipment, 提供用於訪問自己組合體內的部件方法: 增加 刪除 遍歷.
Java設計模式 組合模式
組合模式 composite使用組合模式的場景 把部分和整體的關係用樹形結構來表示,從而使客戶端可以使用統一的方式處理部分物件和整體物件。開發中的應用場景 作業系統的資源管理器 gui中的容器層次圖 xml檔案解析 oa系統中,組織結構的處理 component abstractfile 抽象構件 ...
JAVA 設計模式 組合模式
用途 組合模式 component 將物件組合成樹形結構以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有唯一性。組合模式是一種結構型模式。結構 圖 組合模式結構圖 component 組合中的物件宣告介面,在適當的情況下,實現所有類共有介面的預設行為。宣告乙個介面用於...
組合模式 java實現
如果把北京總公司比作乙個大樹的話,它的下屬分公司就是這棵樹的分枝 至於各辦事處是更小的分支 而它們的相關職能部門由於沒有分枝了 可以理解為樹葉 儘管天下沒有相同的樹葉 但是同一棵樹上長出來的樹葉樣子也不會相差到哪去 也就是說 若使總部的財務管理功能復用於子公司 最好的辦法是 處理總公司的財務管理功能...