裝飾模式(Decorator Pattern)是一種比較常見的模式。 定義: 動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 裝飾模式類圖如下所示。 裝飾模式有以下4個角色。 抽象構件(Component)角色:用於規範需要裝飾的對象(原始對象)。 具體構件(Con ...
裝飾模式(Decorator Pattern)是一種比較常見的模式。
定義:
- 動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。
裝飾模式類圖如下所示。
裝飾模式有以下4個角色。
- 抽象構件(Component)角色:用於規範需要裝飾的對象(原始對象)。
- 具體構件(ConcreteComponent)角色:實現抽象構件介面,定義一個需要裝飾的原始類。
- 裝飾(Decorator)角色:持有一個構件對象的實例,並定義一個與抽象構件介面一致的介面,
- 具體裝飾角色:負責對構件對象進行裝飾。
Component.java
public interface Component { public void operation(); }
ConcreteComponent.java
public class ConcreteComponent implements Component { @Override public void operation() { System.out.println("業務代碼"); } }
Decorator.java
public abstract class Decorator implements Component { private Component component = null; public Decorator(Component component) { this.component = component; } @Override public void operation() { this.component.operation(); } }
ConcreteDecorator.java
public class ConcreteDecorator extends Decorator { public ConcreteDecorator(Component component) { super(component); } // 定義自己的方法 public void selfMethod() { System.out.println("修飾"); } // 重寫operation @Override public void operation() { this.selfMethod(); super.operation(); } }
Client.java
public class Client { public static void main(String[] args) { Component component = new ConcreteComponent(); // 進行裝飾 component = new ConcreteDecorator(component); component.operation(); } }
優點:
- 裝飾類和被裝飾類可以獨立發展,而不會相互耦合。即Component類無須知道Decorator類,Decorator類是從外部來擴展Component類的功能,而Decorator也不用知道具體的構件。
- 裝飾模式是繼承關係的一個替代方案。裝飾類Decorator,不管裝飾多少層,返回的對象還是Component.
- 裝飾模式可以動態地擴展一個實現類的功能。
缺點:
- 多層的裝飾是比較複雜的。
應用場景:
- 需要擴展一個類的功能,或給一個類增加附加功能。
- 需要動態地給一個對象增加功能,這些功能可以再動態地撤銷。
- 需要為一批類進行改裝或加裝功能。
裝飾模式是對繼承的有力補充。單純使用繼承時,在一些情況下就會增加很多子類,而且靈活性較差,維護也不容易。裝飾模式可以替代繼承,解決類膨脹的問題,如Java基礎類庫中的輸入輸出流相關的類大量使用了裝飾模式。
摘自:
青島東合信息技術有限公司 . 設計模式(Java版) . 電子工業出版社,2012,78-80.