java組合模式

2021-06-21 10:22:35 字數 2846 閱讀 9207

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實現

如果把北京總公司比作乙個大樹的話,它的下屬分公司就是這棵樹的分枝 至於各辦事處是更小的分支 而它們的相關職能部門由於沒有分枝了 可以理解為樹葉 儘管天下沒有相同的樹葉 但是同一棵樹上長出來的樹葉樣子也不會相差到哪去 也就是說 若使總部的財務管理功能復用於子公司 最好的辦法是 處理總公司的財務管理功能...