C#物件導向設計模式第十講:Decorator 裝飾模式(結構型模式)

來源:互聯網
上載者:User

(根據MSDN Webcast相關課程整理)

假設情境:遊戲中的坦克不僅具有類型的不同,可能同一種坦克也會有不同,如我們可能會希望為某種類型的坦克,如T50,增加(擴充)一種或多種新功能。如果增加紅外夜視功能,水陸兩棲功能或衛星定位功能等等。通常我們可能會採用繼承的方法,擴充出新的子類型(如T50紅外版新類型)來實現新功能的擴充。顯然,這樣做有一個明顯的弊端:同時具有以上特徵的或部分功能的坦克,這樣就會產生N多種新的組合,子類的數目呈指數級膨脹。從而過多的使用了繼承來實現子類的特性。

因此,當特性的變化呈橫向變化時,我們希望動態實現(運行時)功能的增多,避免功能擴充帶來子類膨脹的問題,從而使變化的影響降到最低。

裝飾模式旨在解決主體類在多個方向的功能擴充的問題。

中,Decorator抽象類別有時也可以省略,其子類直接從Component類中繼承,並將組合一個Component對象,同時實現具體方法。

GoF:動態給一個對象增加一些額外的功能,就增加功能而言,Decorator模式比產生子類更加靈活。

坦克抽象類別及其子類,這是縱向的變化,我們可以考慮建立型模式來產生新對象:

擴充功能,裝飾類及其子類,這是橫向功能的變化,關鍵是不僅繼承了Tank,而且還組合了一個Tank對象,這樣新產生的被裝飾的Tank就可以一方具體原有的特性,而且還可以具有新裝飾的功能。而Tank類對Decorator類是透明的,反之不然。

Is a 和 has a同時使用,就現實了簡單的裝飾模式 do as。

面對坦克類型自身的縱向變化和擴充功能的橫向變化,將擴充功能一個一個的添加到現有類型上,從而得到具有新功能的新類型。

.Net架構中裝飾模式的應用:

Stream抽象類別實現了FileStream類,NetworkStream類和MemoryStream類等實體類,同時也具有裝飾對象子類:BufferedStream和CryptStream等。兩個裝飾類中分別包含了Stream類。

《完》

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.