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

通過前兩個模式的學習,是否是對設計模式有了進一步的認識了呢,如今,咱們繼續衝鴨。git

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

以前咱們見識了鴨子的各個表現會飛、會游泳、會叫、會跳;也看過了氣象臺實時更新的能力,在看板裏把數據更新;接下來咱們一塊兒來喝下咖啡,體驗一把喝咖啡的樂趣。咖啡店裏的生意太好了,須要升級現有的產品,因此店主準備更新訂單系統,以此來知足店內各位顧客。設計模式

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

看出什麼來了嗎?沒錯,就是各個類來知足對咖啡的不一樣要求。那麼,若是店內產品須要升級,好比購買咖啡時,想加入各類調料,例如:蒸奶,豆漿,摩卡或者覆蓋奶泡。咖啡店根據不一樣的調料,收取不一樣的費用,因此有多少種調料,就有多少種類,是這個意思沒錯吧。而後,就會很悲劇,請看下面擴展調料以後的圖編碼


個人天,這是啥,這要是寫了這樣的項目,還不是分分鐘要被哭死,維護這麼多的類。設計

認識裝飾者模式

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

因此,裝飾者要隆重出場。在這裏要採用不同的作法:咱們要以飲料爲主體,而後再運行試以調料來「裝飾」(decorate)飲料。加入某個顧客想要摩卡和奶泡深培咖啡,那麼具體的作法就能夠是:blog

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

以裝飾者構造飲料訂單

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

根據以上信息,咱們知道ip

  • 裝飾者和被裝飾對象有相同的超類型
  • 你能夠用一個或多個裝飾者包裝一個對象
  • 既然裝飾者和被裝飾對象有相同的超類型,因此在任何須要原始對象(被包裝的)的場合,能夠用裝飾過的對象代替它
  • 裝飾者能夠在所委託被裝飾者的行爲以前/或以後,加上本身的行爲,以達到特定的目的---關鍵點
  • 對象能夠在任什麼時候候被裝飾,因此能夠再運行時動態地、不限量地用你喜歡的裝飾者來裝飾對象

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

定義裝飾者模式

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

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

裝飾咱們的飲料

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

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

因此,今天的學習就先到這裏啦。下一篇,會針對類圖進行實際的代碼編寫以及其餘補充性的狀況。你們也能夠先根據代碼,在僞代碼的世界裏實踐下,也利於我們下次的編碼實戰。

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

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

image

相關文章
相關標籤/搜索