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

Dimple91發表於2019-04-03

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

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

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

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

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

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

設計模式之裝飾者模式(一)
我的天,這是啥,這要是寫了這樣的專案,還不是分分鐘要被哭死,維護這麼多的類。

認識裝飾者模式

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

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

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

以裝飾者構造飲料訂單

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

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

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

根據以上資訊,我們知道

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

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

定義裝飾者模式

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

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

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

裝飾我們的飲料

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

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

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

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

PS:程式碼已經上傳,需要檢視的朋友點選此處HeadFirstDesign

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

image

相關文章