《軟體設計精要與模式》讀書筆記(六)-組合模式

來源:互聯網
上載者:User

合成模式有時又叫做部分-整體模式(Part-Whole)。合成模式將對象組織到樹結構中,可以用來描述整體與部分的關係。合成模式可以使用戶端將單純元素與複合元素同等看待。合成模式的實現根據所實現介面的區別分為兩種形式,分別稱為安全模式和透明模式。合成模式可以不提供父物件的管理方法,但合成模式必須在合適的地方提供子物件的管理方法(諸如:add、remove、getChild等)。

透明方式

作為第一種選擇,在Component裡面聲明所有的用來管理子類對象的方法,包括add()、remove(),以及getChild()方法。這樣做的好處是所有的構件類都有相同的介面。在用戶端看來,樹葉類對象與合成類對象的區別起碼在介面層次上消失了,用戶端可以同等同的對待所有的對象。這就是透明形式的合成模式。這個選擇的缺點是不夠安全,因為樹葉類對象和合成類對象在本質上是有區別的。樹葉類對象不可能有下一個層次的對象,因此add()、remove()以及getChild()方法沒有意義,是在編譯時間期不會出錯,而只會在運行時期才會出錯。

那麼什麼是透明方式的合成模式?請參考:Composite Pattern (組合模式)

 

安全方式

第二種選擇是在Composite類裡面聲明所有的用來管理子類對象的方法。這樣的做法是安全的做法,因為樹葉類型的對象根本就沒有管理子類對象的方法,因此,如果用戶端對樹葉類對象使用這些方法時,程式會在編譯時間期出錯。

這個選擇的缺點是不夠透明,因為樹葉類和合成類將具有不同的介面。這兩個形式各有優缺點,需要根據軟體的具體情況做出取捨決定。

那麼什麼是安全方式的合成模式?請參考:Composite Pattern (組合模式)

  1. 使用合成模式時考慮的幾個問題明顯的給出父物件的引用。
  2. 在子物件裡面給出父物件的引用,可以很容易的遍曆所有父物件。有了這個引用,可以方便的應用責任鏈模式。
  3. 在通常的系統裡,可以使用享元模式實現構件的共用,但是由於合成模式的對象經常要有對父物件的引用,因此共用不容易實現。
  4. 有時候系統需要遍曆一個樹枝結構的子構件很多次,這時候可以考慮把遍曆子構件的結果暫時儲存在父構件裡面作為緩衝。
  5. 關於使用什麼資料類型來儲存子物件的問題,在示意性的代碼中使用了ArrayList,在實際系統中可以使用其它聚集或數組等. 用戶端盡量不要直接調用樹葉類中的方法,而是藉助其父類(Component)的多態性完成調用,這樣可以增加代碼的複用性。

何時採用組合模式

1.需求重要體現部分與整體的階層時

2.你希望使用者忽略組合對象與單個對象的不同,使用者將統一地使用組合結構中的所有對象使用效果: 1.Composite模式採用樹形結構來實現普遍存在的對象容器,從而將“一對多”的關係轉化“一對一”的關係,使得客戶代碼可以一致地處理對象和對象容器,無需關心處理的是單個的對象,還是組合的對象容器 2.將“客戶代碼與複雜的對象容器結構”解耦是Composite模式的核心思想,解耦之後,客戶代碼將與純粹的抽象介面——而非對象容器的複內部實現結構——發生依賴關係,從而更能“應對變化”。

3.Composite模式中,是將“Add和Remove等和對象容器相關的方法”定義在“表示抽象對象的Component類”中,還是將其定義在“表示對象容器的Composite類”中,是一個關乎“透明性”和“安全性”的兩難問題,需要仔細權衡。這裡有可能違背物件導向的“單一職責原則”,但是對於這種特殊結構,這又是必須付出的代價。ASP.NET控制項的實現在這方面為我們提供了一個很好的示範。

4.Composite模式在具體實現中,可以讓父物件中的子物件反向追溯;如果父物件有頻繁的遍曆需求,可使用緩衝技巧來改善效率。

Composite模式的幾個要點

  • Composite模式採用樹形結構來實現普遍存在的對象容器,從而將“一對多”的關係轉化為“一對一”的關係,使得客戶代碼可以一致地處理對象和對象容器,無需關心處理的是單個的對象,還是組合的對象容器。將“客戶代碼與複雜的對象容器結構”
  • 解耦是Composite模式的核心思想,解耦之後,客戶代碼將與純粹的抽象介面——而非對象容器的複內部實現結構——發生依賴關係,從而更能“應對變化”
  • Composite模式中,是將“Add和Remove等和對象容器相關的方法”定義在“表示抽象對象的Component類”中,還是將其定義在“表示對象容器的Composite類”中,是一個關乎“透明性”和“安全性”的兩難問題,需要仔細權衡。這裡有可能違背物件導向的“單一職責原則”,但是對於這種特殊結構,這又是必須付出的代價。ASP.NET控制項的實現在這方面為我們提供了一個很好的示範
  •  Composite模式在具體實現中,可以讓父物件中的子物件反向追溯;如果父物件有頻繁的遍曆需求,可使用緩衝技巧來改善效率。介面和實作類別的檔案一定要分開.建議一個類放在一個檔案中!

其它可參考:

NET設計模式(11):組合模式(Composite Pattern)

.Net中的設計模式——Composite模式

Core Design Patterns(4) Composite 組合模式

參考

9. Composite 組合(結構型模式)

建議看看這篇

Composite Pattern (組合模式)

 

設計模式學習筆記十七:組合模式(Composite Pattern) 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.