23種設計模式之裝飾模式

裝飾模式的定義

定義: 動態的給一個對象添加一些額外的職責. 就增加功能來說, 裝飾模式相比生成子類更為靈活.

通俗的說, 就是對一個類或方法進行包裝

裝飾模式的通用類圖:

23種設計模式之裝飾模式

類圖中的四個角色說明如下:

  1. Component 抽象構件: Component是一個接口或抽象類, 就是定義我們最核心的角色, 也就是最原始的對象. 在裝飾模式中, 必然有一個最基本、最核心的接口或抽象類充當 Component 抽象構件
  2. ConcreteComponent 具體構件: ConcreteComponent 是最核心、最原始、最基本的接口或抽象類的實現, 要裝飾的就是它
  3. Decorator 裝飾角色: 一般是一個抽象類, 實現接口或抽象方法, 它裡面不一定有抽象的方法, 在它的屬性中必然有一個private變量指向Component抽象構件
  4. 具體裝飾類: ConcreateDecrator是具體的裝飾類, 要把最核心的、最原始的、最基本的東西裝飾成其他東西. 當只有一個裝飾類時, 可以沒有抽象裝飾角色

具體實現代碼如下:

23種設計模式之裝飾模式

23種設計模式之裝飾模式

抽象裝飾者代碼:

23種設計模式之裝飾模式

具體裝飾者代碼:

23種設計模式之裝飾模式

場景類:

23種設計模式之裝飾模式

裝飾模式應用

裝飾模式的優點:

  1. 裝飾類和被裝飾類可以獨立發展, 而不會相互耦合. 也就是說, Component 類無需知道 Decorator 類, Decorator 類是從外部來擴展 Component類的功能, 而Decorator也不用知道具體的構件
  2. 裝飾模式是繼承關係的一個替代方案. 我們看裝飾類 Decorator, 不管裝飾多少層, 返回的對象還是 Component.
  3. 裝飾模式可以動態的擴展一個實現類的功能

裝飾模式的缺點:

對於裝飾模式記住一點就夠了: 多層的裝飾是比較複雜的.

裝飾模式的應用場景:

  1. 需要擴展一個類的功能, 或給一個類增加附加功能
  2. 需要動態的給一個對象增加功能, 這些功能可以再動態的撤銷
  3. 需要為一批的兄弟類進行改裝或加裝功能, 當然首選裝飾模式

裝飾模式是對繼承的有力補充. 要知道繼承不是萬能的, 在項目中要考慮諸如易維護、易擴展、易複用等, 而且在一些情況下要是用繼承就會增加很多子類, 而且靈活性非常差, 當然維護也不容易了, 也就是說裝飾模式可以替代繼承, 解決類膨脹的問題. 同時, 繼承是靜態的給類增加功能, 而裝飾模式是動態的增加功能.

裝飾模式還有一個非常好的優點: 擴展性非常好.


分享到:


相關文章: