23種設計模式 裝飾器模式

2021-08-20 11:08:26 字數 1245 閱讀 2245

7.應用場景

8.現實案例

9. 注意事項

某些情況,當乙個類已經存在,並且可以對外提供核心功能時,但是,某個時刻,希望對這個類進行功能增強(如:增加快取);通常情況,我們可以修改原來的類,並增加對應的增強功能即可;

但是,這種方式違背了「開-閉」原則,需要修改原來的**;而且不夠靈活,如果有某個時刻又不想使用快取,又需要修改原來的**,顯然,這不是乙個很好的解決方案;

裝飾器模式(decorator pattern)允許向乙個現有的物件新增新的功能,同時又不改變其結構。

本質:引入乙個中介類,這個類實現了被裝飾者相同的介面,對外假裝成被裝飾者,並通過引用被裝飾者,在呼叫被裝飾者前後做一些附加功能(如:快取,引數預處理);

不修改原來**的情況下,動態地給乙個物件新增一些額外的職責和功能

本質:動態增加功能;把需要新增加的功能預先製作成零件,在需要時「動態「的新增到物件上;

裝飾器模式相比生成子類更為靈活

本質:引入乙個第三方中介類,這個類實現了被裝飾類的介面,並引用了被裝飾物件,對外假裝成被裝飾物件,對內通過呼叫被裝飾物件完成最終功能,在呼叫被裝飾物件之前之後,可以做一些額外的功能(這也是裝飾模式功能增強的地方);

優點:

最核心的目的:在不修改原**的情況下,動態的為物件增加或減少某些功能

缺點:「與**模式的區別」

在學習裝飾器模式時,會發現它與**模式無論從實現結構,還是功能目的都非常接近;

裝飾器模式側重的是對功能的增強,不改變原功能;

裝飾器模式使用方明確知道自己需要什麼的增強功能,硬編碼使用;

**模式側重於對原功能的改變(特別是訪問許可權的控制)

**模式分為靜態和動態**,動態**是在呼叫方不知情的情況下使用;

如果**模式使用靜態**實現,而且也是側重對功能的增強,那麼他們之間沒有任何區別(如:spring中通過動態**實現快取或日誌)

jdk中的流處理;

bytearrayinputstream

fileinputstream

objectinputstream

pipedinputstream

23種設計模式之裝飾模式

職責 動態的為乙個物件增加乙個新的功能 裝飾模式是乙個用於代替繼承的技術,無須通過繼承增加子類就能擴充套件物件的新功能,使用物件的關聯關係代替繼承關係,更加靈活,同時避免型別體系的快速膨脹。component抽象控制項元件 concretecomponent具體構件角色 真實物件 decorator...

23種設計模式之裝飾模式

定義 動態的給乙個物件新增一些額外的職責.就增加功能來說,裝飾模式相比生成子類更為靈活.通俗的說,就是對乙個類或方法進行包裝 裝飾模式的通用類圖 類圖中的四個角色說明如下 component 抽象構件 component是乙個介面或抽象類,就是定義我們最核心的角色,也就是最原始的物件.在裝飾模式中,...

23種設計模式 裝飾者設計模式

23種設計模式之一,英文叫decorator pattern,又叫包裝模式。裝飾模式是在不必改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。裝飾物件和真實物件有相同的介面。裝飾物件包含乙個真實物件的引用。裝飾物件接受所有來自客戶端的請求。它把這些請求 給真實的物件 裝飾物件可以在 這些...