經過前兩個模式的學習,是不是對設計模式有了進一步的認識了呢,現在,我們繼續沖鴨。 本章可以稱為“給愛用繼承的人一個全新的設計眼界”。這裡我們即將再度探討典型的繼承濫用問題,我們將學到如何使用對象組合的方式,做到在運行時裝飾類。為什麼呢?一旦熟悉了裝飾的技巧,你將能夠在不修改任何底層代碼的情況下,給對 ...
經過前兩個模式的學習,是不是對設計模式有了進一步的認識了呢,現在,我們繼續沖鴨。
本章可以稱為“給愛用繼承的人一個全新的設計眼界”。這裡我們即將再度探討典型的繼承濫用問題,我們將學到如何使用對象組合的方式,做到在運行時裝飾類。為什麼呢?一旦熟悉了裝飾的技巧,你將能夠在不修改任何底層代碼的情況下,給對象賦予新的職責。
之前我們見識了鴨子的各個表現會飛、會游泳、會叫、會跳;也看過了氣象臺實時更新的能力,在看板里把數據更新;接下來我們一起來喝下咖啡,體驗一把喝咖啡的樂趣。咖啡店裡的生意太好了,需要升級現有的產品,所以店主準備更新訂單系統,以此來滿足店內各位顧客。
先來看一張圖,這是原先的店內設計
看出什麼來了嗎?沒錯,就是各個類來滿足對咖啡的不同要求。那麼,如果店內產品需要升級,比如購買咖啡時,想加入各種調料,例如:蒸奶,豆漿,摩卡或者覆蓋奶泡。咖啡店根據不同的調料,收取不同的費用,所以有多少種調料,就有多少種類,是這個意思沒錯吧。然後,就會很悲劇,請看下麵擴展調料之後的圖
我的天,這是啥,這要是寫了這樣的項目,還不是分分鐘要被哭死,維護這麼多的類。
認識裝飾者模式
當前遇到的問題就是:類數量爆炸、設計死板、以及基類加入的新功能並不適用於所有的子類。
所以,裝飾者要隆重出場。在這裡要採用不一樣的做法:我們要以飲料為主體,然後再運行試以調料來“裝飾”(decorate)飲料。加入某個顧客想要摩卡和奶泡深培咖啡,那麼具體的做法就可以是:
- 拿一個深培咖啡(DarkRoast)對象
- 以摩卡(Mocha)對象裝飾它
- 以奶泡(Whip)對象裝飾它
- 調用cost方法,並依賴委托(delegate)將調料的價錢加上去
以裝飾者構造飲料訂單
為了讓讀者更加清晰的瞭解,小編在這裡直接給了書中的圖來表示
根據以上信息,我們知道
- 裝飾者和被裝飾對象有相同的超類型
- 你可以用一個或多個裝飾者包裝一個對象
- 既然裝飾者和被裝飾對象有相同的超類型,所以在任何需要原始對象(被包裝的)的場合,可以用裝飾過的對象代替它
- 裝飾者可以在所委托被裝飾者的行為之前/或之後,加上自己的行為,以達到特定的目的---關鍵點
- 對象可以在任何時候被裝飾,所以可以再運行時動態地、不限量地用你喜歡的裝飾者來裝飾對象
來看看裝飾者模式的定義吧。
定義裝飾者模式
裝飾者模式動態地將責任附加到對象上。若要擴展功能呢,裝飾者提供了比繼承更有彈性的替代方案。
那麼我們如何在現實中實際應用裝飾者模式呢,先來看看根絕角色來分配的類圖
裝飾我們的飲料
從上面的類圖,看出什麼了嗎?想到我們的飲料的類圖怎麼畫了沒呢。接下來,就讓我們照貓畫虎,來畫一個屬於我們的裝飾類類圖
鑒於之前有讀者反映,說出現篇幅過長的情況。小編自己也曾疑惑,到底怎麼更好地控制篇幅。所以,從今天開始,小編在力爭保持思路一慣性的條件下,模塊分的更細緻,篇幅更加適中,讓碎片化時間得到充分的利用。
所以,今天的學習就先到這裡啦。下一篇,會針對類圖進行實際的代碼編寫以及其他補充性的情況。大家也可以先根據代碼,在偽代碼的世界里實踐下,也利於咱們下次的編碼實戰。
PS:代碼已經上傳,需要查看的朋友點擊此處HeadFirstDesign
愛生活,愛學習,愛感悟,愛挨踢