天天看點

組合模式之拼湊的美好

        廊坊的風一如既往的在窗外刮着,天地間肆意地飄灑,縱情在一刹那,為何現在隻剩下風吹亂我的發,亂蓬蓬的,還是去超市逛逛吧,買吃的`(*∩_∩*)′,走進華聯超市,熱情的店員招呼着我,開始為我介紹,推薦各種各樣商品,店員向我推薦了他們的會員卡,全場所有項目均八折,每逢節假日打五折,我心想那太劃算了,而且他們總店,分店,加盟店都可以用,是以就辦了張會員卡。今天我們的設計模式就從超市會員卡開始說起。

        這個俨然就是我們設計模式中的組合模式----組合模式有時候又叫做部分-整體模式,它使我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念,客戶程式可以向處理簡單元素一樣來處理複雜元素,進而使得客戶程式與複雜元素的内部結構解耦。看下面的兩幅圖檔:

組合模式之拼湊的美好
組合模式之拼湊的美好

        上面兩幅圖檔我們可以看做是一個檔案結構,對于這樣的結構我們稱之為樹形結構。在《大話設計模式》中我們了解到可以通過調用某個方法來周遊整個樹,當我們找到某個葉子節點後,就可以對葉子節點進行相關的操作。我們可以将這顆樹了解成一個大的容器,容器裡面包含很多的成員對象,這些成員對象即可是容器對象也可以是葉子對象。但是由于容器對象和葉子對象在功能上面的差別,使得我們在使用的過程中必須要區分容器對象和葉子對象,但是這樣就會給客戶帶來不必要的麻煩,對于客戶而言,始終希望能夠一緻的對待容器對象和葉子對象。這就是組合模式的設計動機:組合模式定義了如何将容器對象和葉子對象進行遞歸組合,使得客戶在使用的過程中無須進行區分,可以對他們進行一緻的處理。下面一起來看一下組合模式的結構圖:

組合模式之拼湊的美好

      以上述在華聯超市辦會員卡為例,看看組合模式是如何在代碼中實作:

         組合模式的目的是:讓用戶端不再區分操作的是組合對象還是葉子對象,而是以一個統一的方式來操作。實作這個目标的關鍵之處,是設計一個抽象的元件類,讓它可以代表組合對象和葉子對象。這樣一來,用戶端就不用區分到底是組合對象還是葉子對象了,隻需要全部當成元件對象進行統一的操作就可以了。

繼續閱讀