1. 程式人生 > >結構型模式之裝飾模式

結構型模式之裝飾模式

活性 @override java基礎 cor span decorator 不用 解決 system

裝飾模式(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.

結構型模式之裝飾模式