設計模式系列 裝飾模式

2022-03-12 07:17:25 字數 899 閱讀 5514

本文屬於設計模式的必讀書籍《head first design patterns》的讀書筆記,有不正確的地方歡迎指正。

首先,看看gof對裝飾模式的定義:

意圖:動態的給乙個物件新增一些額外的職責。就增加功能來說,裝飾模式比生成子類更加靈活。

定義很抽象,讓我們來看看乙個具體的業務場景:

在城市的某個**商務區,乙個小小的咖啡館,生意興隆,在收銀台常常排的長長的隊伍,顧客也多有抱怨。老闆了解到客戶的需求之後,發現如果有個如超市的收銀機會很大的提高收款的效率,於是找到某家it公司,請求開發一套收銀系統。

需求:咖啡館烤4種咖啡,然後,顧客可以在咖啡中新增巧克力,牛奶,摩卡等輔料。****是按照咖啡的種類和新增的輔料計算。

首先,反應到大腦中的類圖如下:

馬上,你可能會意識到這個結構式有問題的,也就是如果有新的輔料加入進來,就需要修改父類,明顯的違背了「開-閉」的設計原則。

那麼,這個設計的問題出在**呢?答案就是物件的所有行為都是在編譯器被定義下來了,無法再執行期動態的修改,導致如果有新的元素加入,導致必須要修改類。這裡需要一種物件可以在執行期間動態的加入的行為的功能。我們再來看看裝飾模式的定義:

動態的給乙個物件新增一些額外的職責。就增加功能來說,裝飾模式比生成子類更加靈活。

下面看看gof給出的關於裝飾模式的類圖

設計完成後的收銀系統類圖如下:

裝飾模式 設計模式系列

裝飾模式 動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。優點 把類中的裝飾功能從類中搬移去除,這樣可以簡化原有的類。可以有效地把類的核心職責和裝飾功能區分開,而且可以去除相關類中重複的裝飾邏輯。使用場景 下面以乙個小demo為例講解 tshirts shoe kuz...

設計模式系列(四) 裝飾模式

動態的為乙個物件的某些職責新增一些額外的功能,與通過繼承來獲得新功能相比,decorator 更加的靈活 試想一下,如果沒有 decorator,轉而使用繼承,每當想要為乙個物件新增某個功能時,我們就需要生成乙個子類。當需要這些功能的組合時,就要生成更多的具有組合功能的子類。這會產生兩個問題 1.類...

設計模式系列之 裝飾模式

小y 你最喜歡幹什麼?比爾 雷澤 最喜歡衝關打爆大機。小y 比爾,你想對觀眾說些什麼?比爾 雷澤 想挑戰我,隨時奉陪!一顆不夠,給你來三顆!小y 比爾 雷澤作為魂斗羅這麼經典的人物,原來也是乙個粗狂耿直boy呀。為了儲存住他的光輝形象和讓大家更加了解他,小y決定把比爾 雷澤的攻擊技能裝飾一番介紹給大...