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

2021-07-10 13:10:37 字數 924 閱讀 8623

動態的為乙個物件的某些職責新增一些額外的功能,與通過繼承來獲得新功能相比,decorator 更加的靈活

試想一下,如果沒有 decorator,轉而使用繼承,每當想要為乙個物件新增某個功能時,我們就需要生成乙個子類。當需要這些功能的組合時,就要生成更多的具有組合功能的子類。這會產生兩個問題

1. 類**:每當增加乙個新的功能,就需要創造n多個子類,以滿足各種功能組合的需求

2. 不易動態改變:當選中乙個類生成物件後,想要做出改變十分不易

所以,在 decorator 中,並不生成子類,取而代之的是將原有物件嵌入乙個新的物件,這個新的物件完成新的功能。就好像在原有的物件上做了乙個裝飾。這也是此模式的名字由來。這時,當需要多個新的功能組合時,就可以不停嵌入新的物件,以打成目標。

他們在結構上看起來就像這樣:

因為將原有的物件嵌入了新的物件,而對客戶程式而言,這應該是透明的,也就是說,新的物件,應該有原有物件的介面。所以這兩個物件應該有相同的祖先類。所以,decorator的類圖看起來大約是下圖的樣子

從圖中可以清晰的看出,原有物件(textview)和裝飾用的物件(decorator)都繼承於同一基類,這就保證了介面的一致性。同時decorator擁有乙個對基類物件的引用,這樣就完成了嵌入的目的。

在不影響原物件行為的情況下,動態的,透明的,為原物件新增職責

處理可以撤銷的職責

無法生成子類時。一種是生成子類引起類**,另一種是因為類定義被隱藏或類定義為不能繼承

decorator 將請求**給它維護指標的component物件,並可能在其前後新增一些必要的動作

裝飾模式 設計模式系列

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

設計模式系列 裝飾模式

本文屬於設計模式的必讀書籍 head first design patterns 的讀書筆記,有不正確的地方歡迎指正。首先,看看gof對裝飾模式的定義 意圖 動態的給乙個物件新增一些額外的職責。就增加功能來說,裝飾模式比生成子類更加靈活。定義很抽象,讓我們來看看乙個具體的業務場景 在城市的某個 商務...

設計模式(四) 裝飾模式

裝飾模式又被稱為包裝模式。通過對客戶端透明的方式來拓展物件的功能,是繼承關係的一種替代方案 假設,現在要給qq秀裡的人物設計裝扮衣服,每個人可按自己不同的喜好搭配不同的衣服。先建立person類,它裡面有乙個show 展示 也是穿衣服 的方法 public class person public p...