本文從一個給定的實現了組合(Composite)模式的例子開始,說明怎么在這個數據結構上實現業務邏輯代碼。依次介紹了非面向對象的方式、在組合結構中加入方法、使用訪問者(Visitor)模式以及用改進后的訪問者(Visitor)模式來實現相同的業務邏輯代碼,并且對于每種實現分別給出了優缺點。
讀者定位于具有java程序開發和設計模式經驗的開發人員。
讀者通過本文可以學到如何在組合(Composite)模式中實現各種不同的業務方法及其優缺點。
組合(Composite)模式
組合模式是結構型模式中的一種。GOF的《設計模式》一書中對使用組合模式的意圖描述如下:將對象組合成樹形結構以表示"部分-整體"的層次結構。Composite使得用戶對單個對象和組合對象的使用具有一致性。
組合模式應用廣泛。根據GOF中對組合模式的定義,Composite模式一般由Component接口、Leaf類和Composite類組成。現在需要對一個軟件產品治理系統的實體建模:某公司開發了一系列軟件集(SoftwareSet),包含了多種品牌(Brand)的軟件產品,就象IBM提供了Lotus、WebsPhere等品牌。每個品牌下面又有各種產品(PRodUCt),如IBM的Lotus下面有Domino Server/Client產品等。建模后的類圖如下(代碼可以參見隨本文帶的附件中,包com.test.entity下所有的源文件):
如圖所示:
?。?)接口SoftwareComponent就是對應于組合模式中的Component接口,它定義了所有類共有接口的缺省行為
(2)AbsSoftwareComposite類對應于Composite類,并且是抽象類,所有可以包含子節點的類都擴展這個類。這個類的主要功能是用來存儲子部件,實現了接口中的方法,部分可以重用的代碼寫在此類中
?。?)SoftwareSet類繼續于AbsSoftwareComposite類,對應于軟件集,軟件集下直接可以包含品牌(Brand),也可以直接包含不屬于任何品牌的產品(Product)
?。?)Brand類繼續于AbsSoftwareComposite類,對應于品牌,包含了品牌名屬性,并且用來存儲Product類的實例
?。?)Product類就是對應的Leaf類,表示葉子節點,葉子節點沒有子節點
用不同的方法實現業務邏輯
數據結構建立好之后,需要在這個數據結構上添加方法實現業務邏輯。比如現在的這個例子中,有這樣的需求:給定一些用戶選擇好的產品,需要計算出這些選中后軟件的總價格。下面開始介紹如何使用各種不同的方法來實現這個業務邏輯。
非面向對象的編程方式
這種方式下,編程思路最簡單:遍歷SoftwareSet實例中的所有節點,假如遍歷到的當前對象是Product的話就累加,否則繼續遍歷下一層直到全部遍歷完畢。代碼片斷如下:
新聞熱點
疑難解答