裝飾者模式—gof的23個之一
前言:同樣來自《head first 設計模式》,不涉及任何商務往來,僅為學習使用,作為參照筆記。『『裝飾者模式』——動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。
汗,發布了一天,才發現題目寫錯了。意外……
裝飾者模式類圖
與普通繼承相比,執行時擴充套件,遠比編譯時期的繼承威力大。
補充:關聯:a擁有b,b是a的變數。
依賴:a使用b,b在a的方法中。
牢記,**應該如同晚霞中的蓮花一樣地關閉(免於改變),如同晨曦中的蓮花一樣地開放(能夠擴充套件)。
開放-關閉原則
設計原則:類應該對擴充套件開放,對修改關閉。
一、我們的目標是允許類容易擴充套件,在不修改現有**的情況下,就可搭配新的行為。如能實現這樣的目標,有什麼好處呢?這樣的設計具有彈性可以應對改變,可以接受新的功能來應對改變的需求。
回顧觀察者模式(在第2章)……通過加入新的觀察者,我們可以在任何時候擴充套件subject(主題),而且不需向主題中新增**。
二、裝飾者模式—完全遵循開發-關閉原則。
三、不能處處遵循開放-關閉原則。遵循開放-關閉原則,通常會引入新的抽象層次,增加**的複雜度。你需要把注意力集中在設計中最有可能改變的地方,然後應用開放-關閉原則。
四、「裝飾(decorate)飲料」(裝飾者模式可以用以下思路。)
1、拿乙個深焙咖啡(darkroast)物件。
2、以摩卡(mocha)物件裝飾它。
3 以奶泡(whip)物件裝飾它。
4 呼叫cost()方法,並依賴委託(delegate)將調料的價錢加上去。
如何裝飾乙個物件?(暗示:把裝飾者物件當成「包裝者」。)
「委託」如何與此搭配使用?
五、重要知識點歸納:
1、裝飾者和被裝飾物件有相同的超型別。
2、你可以用乙個或多個裝飾者包裝乙個物件。
3、既然裝飾者和被裝飾物件有相同的超型別,所以在任何需要原始物件(被包裝的)的場合,可以用裝飾過的物件代替它。
4、裝飾者可以在所委託被裝飾者的行為之前與/或之後,加上自己的行為,以達到特定的目的。(不太好理解。)
5、物件可以在任何時候被裝飾,所以可以在執行時動態地、不限量地用你喜歡的裝飾者來裝飾物件。
附一些小解釋:
component 元件 condiment調料
concrete 具體
decorator 裝飾者
六、重點點出
裝飾者和被裝飾者必須是一樣的型別,也就是有共同的超類,這是相當關鍵的地方。在這裡,我們利用繼承達到「型別匹配」,而不是利用繼承獲得「行為」。(重點)
當我們將裝飾者與元件組合時,就是在加入新的行為。所得到的新行為,並不是繼承自超
類,而是由組合物件得來的。(重點)
繼承beverage抽象類(超類),是為了有正確的型別,而不是繼承它的行為。行為來自裝飾者和基礎元件,或與其他裝飾者之間的組合關係。
七、繼承與組合
利用繼承,類的行為只能在編譯時靜態決定。
利用組合,類的行為可以在任何時候變化。
八、beverage類常用抽象類,而不是介面。(原理,不知道,一種習慣吧!!)
裝飾者模式在io中運用
九、小知識點歸納:(部分優、缺點)
優點:裝飾者模式有能力為設計注入彈性。
缺點:(1)在設計中加入大量的小類。
(2)型別問題。裝飾者模式依賴某些特殊典型,在插入裝飾者時,必須要小心。
(3)採用裝飾者在例項化元件時,將增加**的複雜度。 (
最後乙個問題,工廠factory和生成器builder模式會幫其改善。)
十、回顧要點
1、繼承屬於擴充套件形式之一,但不見得是達到彈性設計的最佳方式。
2、在我們的設計中,應該允許行為可以被擴充套件,而無須修改現有的**。
3、組合和委託可用於在執行時動態地加上新的行為。
Gof 裝飾者模式
繼續打卡設計模式 今天來聊一下裝飾者設計模式 先提出這樣乙個實際問題 咖啡種類 單品咖啡 espresso 義大利濃咖啡 shortblack longblack 美式咖啡 decaf 無因咖啡 相對應與咖啡的種類。我們還可以新增不同的調料。例如milk,soy,chocolate 這個時候使用者來...
GOF23 建造者模式
建造者模式定義 建造者模式分離了物件子元件的構造 由builder構造 和裝配 由director裝配 從而可以構造出複雜的物件。適用環境 某個物件構建過程比較複雜。實現物件的建立和裝配解耦,讓客戶端使用者只需要關心自己得到的產品而不是關心產品時怎樣具體產生的 這一點類似工廠模式。一 工廠模式與建造...
設計模式GOF23 建造者模式
建造者模式 builder 是建立者模式的一種,是一種負責建立物件的模式。在實際開發中,有的時候我們需要建立的物件十分複雜,有時候需要很多步奏來處理。建造者模式的任務就是分離和物件子元件的單獨構造 由builder負責 和裝配 由director負責 從而構造出複雜的物件。使用的場景就是構造比較複雜...