裝飾模式的定義 定義: 動態的給一個對象添加一些額外的職責. 就增加功能來說, 裝飾模式相比生成子類更為靈活. 通俗的說, 就是對一個類或方法進行包裝 裝飾模式的通用類圖: 類圖中的四個角色說明如下: 具體實現代碼如下: 抽象裝飾者代碼: 具體裝飾者代碼: 場景類: 裝飾模式應用 裝飾模式的優點: ...
裝飾模式的定義
定義: 動態的給一個對象添加一些額外的職責. 就增加功能來說, 裝飾模式相比生成子類更為靈活.
通俗的說, 就是對一個類或方法進行包裝
裝飾模式的通用類圖:
類圖中的四個角色說明如下:
- Component 抽象構件: Component是一個介面或抽象類, 就是定義我們最核心的角色, 也就是最原始的對象. 在裝飾模式中, 必然有一個最基本、最核心的介面或抽象類充當 Component 抽象構件
- ConcreteComponent 具體構件: ConcreteComponent 是最核心、最原始、最基本的介面或抽象類的實現, 要裝飾的就是它
- Decorator 裝飾角色: 一般是一個抽象類, 實現介面或抽象方法, 它裡面不一定有抽象的方法, 在它的屬性中必然有一個private變數指向Component抽象構件
- 具體裝飾類: ConcreateDecrator是具體的裝飾類, 要把最核心的、最原始的、最基本的東西裝飾成其他東西. 當只有一個裝飾類時, 可以沒有抽象裝飾角色
具體實現代碼如下:
抽象裝飾者代碼:
具體裝飾者代碼:
場景類:
裝飾模式應用
裝飾模式的優點:
- 裝飾類和被裝飾類可以獨立發展, 而不會相互耦合. 也就是說, Component 類無需知道 Decorator 類, Decorator 類是從外部來擴展 Component類的功能, 而Decorator也不用知道具體的構件
- 裝飾模式是繼承關係的一個替代方案. 我們看裝飾類 Decorator, 不管裝飾多少層, 返回的對象還是 Component.
- 裝飾模式可以動態的擴展一個實現類的功能
裝飾模式的缺點:
對於裝飾模式記住一點就夠了: 多層的裝飾是比較複雜的.
裝飾模式的應用場景:
- 需要擴展一個類的功能, 或給一個類增加附加功能
- 需要動態的給一個對象增加功能, 這些功能可以再動態的撤銷
- 需要為一批的兄弟類進行改裝或加裝功能, 當然首選裝飾模式
裝飾模式是對繼承的有力補充. 要知道繼承不是萬能的, 在項目中要考慮諸如易維護、易擴展、易復用等, 而且在一些情況下要是用繼承就會增加很多子類, 而且靈活性非常差, 當然維護也不容易了, 也就是說裝飾模式可以替代繼承, 解決類膨脹的問題. 同時, 繼承是靜態的給類增加功能, 而裝飾模式是動態的增加功能.
裝飾模式還有一個非常好的優點: 擴展性非常好.