設計模式之裝飾者模式(一)


經過前兩個模式的學習,是不是對設計模式有了進一步的認識了呢,現在,我們繼續沖鴨。

本章可以稱為“給愛用繼承的人一個全新的設計眼界”。這里我們即將再度探討典型的繼承濫用問題,我們將學到如何使用對象組合的方式,做到在運行時裝飾類。為什么呢?一旦熟悉了裝飾的技巧,你將能夠在不修改任何底層代碼的情況下,給對象賦予新的職責。

之前我們見識了鴨子的各個表現會飛、會游泳、會叫、會跳;也看過了氣象台實時更新的能力,在看板里把數據更新;接下來我們一起來喝下咖啡,體驗一把喝咖啡的樂趣。咖啡店里的生意太好了,需要升級現有的產品,所以店主准備更新訂單系統,以此來滿足店內各位顧客。

先來看一張圖,這是原先的店內設計

看出什么來了嗎?沒錯,就是各個類來滿足對咖啡的不同要求。那么,如果店內產品需要升級,比如購買咖啡時,想加入各種調料,例如:蒸奶,豆漿,摩卡或者覆蓋奶泡。咖啡店根據不同的調料,收取不同的費用,所以有多少種調料,就有多少種類,是這個意思沒錯吧。然后,就會很悲劇,請看下面擴展調料之后的圖


我的天,這是啥,這要是寫了這樣的項目,還不是分分鍾要被哭死,維護這么多的類。

認識裝飾者模式

當前遇到的問題就是:類數量爆炸、設計死板、以及基類加入的新功能並不適用於所有的子類。

所以,裝飾者要隆重出場。在這里要采用不一樣的做法:我們要以飲料為主體,然后再運行試以調料來“裝飾”(decorate)飲料。加入某個顧客想要摩卡和奶泡深培咖啡,那么具體的做法就可以是:

  1. 拿一個深培咖啡(DarkRoast)對象
  2. 以摩卡(Mocha)對象裝飾它
  3. 以奶泡(Whip)對象裝飾它
  4. 調用cost方法,並依賴委托(delegate)將調料的價錢加上去

以裝飾者構造飲料訂單

為了讓讀者更加清晰的了解,小編在這里直接給了書中的圖來表示

根據以上信息,我們知道

  • 裝飾者和被裝飾對象有相同的超類型
  • 你可以用一個或多個裝飾者包裝一個對象
  • 既然裝飾者和被裝飾對象有相同的超類型,所以在任何需要原始對象(被包裝的)的場合,可以用裝飾過的對象代替它
  • 裝飾者可以在所委托被裝飾者的行為之前/或之后,加上自己的行為,以達到特定的目的---關鍵點
  • 對象可以在任何時候被裝飾,所以可以再運行時動態地、不限量地用你喜歡的裝飾者來裝飾對象

來看看裝飾者模式的定義吧。

定義裝飾者模式

裝飾者模式動態地將責任附加到對象上。若要擴展功能呢,裝飾者提供了比繼承更有彈性的替代方案。

那么我們如何在現實中實際應用裝飾者模式呢,先來看看根絕角色來分配的類圖

裝飾我們的飲料

從上面的類圖,看出什么了嗎?想到我們的飲料的類圖怎么畫了沒呢。接下來,就讓我們照貓畫虎,來畫一個屬於我們的裝飾類類圖

鑒於之前有讀者反映,說出現篇幅過長的情況。小編自己也曾疑惑,到底怎么更好地控制篇幅。所以,從今天開始,小編在力爭保持思路一慣性的條件下,模塊分的更細致,篇幅更加適中,讓碎片化時間得到充分的利用。

所以,今天的學習就先到這里啦。下一篇,會針對類圖進行實際的代碼編寫以及其他補充性的情況。大家也可以先根據代碼,在偽代碼的世界里實踐下,也利於咱們下次的編碼實戰。

PS:代碼已經上傳,需要查看的朋友點擊此處HeadFirstDesign

愛生活,愛學習,愛感悟,愛挨踢

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM