7.應用場景
8.現實案例
9. 注意事項
某些情況,當乙個類已經存在,並且可以對外提供核心功能時,但是,某個時刻,希望對這個類進行功能增強(如:增加快取);通常情況,我們可以修改原來的類,並增加對應的增強功能即可;
但是,這種方式違背了「開-閉」原則,需要修改原來的**;而且不夠靈活,如果有某個時刻又不想使用快取,又需要修改原來的**,顯然,這不是乙個很好的解決方案;
裝飾器模式(decorator pattern)允許向乙個現有的物件新增新的功能,同時又不改變其結構。
本質:引入乙個中介類,這個類實現了被裝飾者相同的介面,對外假裝成被裝飾者,並通過引用被裝飾者,在呼叫被裝飾者前後做一些附加功能(如:快取,引數預處理);
不修改原來**的情況下,動態地給乙個物件新增一些額外的職責和功能
本質:動態增加功能;把需要新增加的功能預先製作成零件,在需要時「動態「的新增到物件上;
裝飾器模式相比生成子類更為靈活
本質:引入乙個第三方中介類,這個類實現了被裝飾類的介面,並引用了被裝飾物件,對外假裝成被裝飾物件,對內通過呼叫被裝飾物件完成最終功能,在呼叫被裝飾物件之前之後,可以做一些額外的功能(這也是裝飾模式功能增強的地方);
優點:
最核心的目的:在不修改原**的情況下,動態的為物件增加或減少某些功能
缺點:「與**模式的區別」
在學習裝飾器模式時,會發現它與**模式無論從實現結構,還是功能目的都非常接近;
裝飾器模式側重的是對功能的增強,不改變原功能;
裝飾器模式使用方明確知道自己需要什麼的增強功能,硬編碼使用;
**模式側重於對原功能的改變(特別是訪問許可權的控制)
**模式分為靜態和動態**,動態**是在呼叫方不知情的情況下使用;
如果**模式使用靜態**實現,而且也是側重對功能的增強,那麼他們之間沒有任何區別(如:spring中通過動態**實現快取或日誌)
jdk中的流處理;
bytearrayinputstream
fileinputstream
objectinputstream
pipedinputstream
23種設計模式之裝飾模式
職責 動態的為乙個物件增加乙個新的功能 裝飾模式是乙個用於代替繼承的技術,無須通過繼承增加子類就能擴充套件物件的新功能,使用物件的關聯關係代替繼承關係,更加靈活,同時避免型別體系的快速膨脹。component抽象控制項元件 concretecomponent具體構件角色 真實物件 decorator...
23種設計模式之裝飾模式
定義 動態的給乙個物件新增一些額外的職責.就增加功能來說,裝飾模式相比生成子類更為靈活.通俗的說,就是對乙個類或方法進行包裝 裝飾模式的通用類圖 類圖中的四個角色說明如下 component 抽象構件 component是乙個介面或抽象類,就是定義我們最核心的角色,也就是最原始的物件.在裝飾模式中,...
23種設計模式 裝飾者設計模式
23種設計模式之一,英文叫decorator pattern,又叫包裝模式。裝飾模式是在不必改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。裝飾物件和真實物件有相同的介面。裝飾物件包含乙個真實物件的引用。裝飾物件接受所有來自客戶端的請求。它把這些請求 給真實的物件 裝飾物件可以在 這些...