JAVA設計模式之 裝飾模式【Decorator Pattern】

小呂-ICE發表於2015-03-09

一、概述
動態地給一個物件增加一些額外的職責,就增加物件功能來說,裝飾模式比生成子類實現更為靈活。裝飾模式是一種物件結構型模式。裝飾模式是一種用於替代繼承的技術,使用物件之間的關聯關係取代類之間的繼承關係。在裝飾模式中引入了裝飾類,在裝飾類中既可以呼叫待裝飾的原有類的方法,還可以增加新的方法,以擴充原有類的功能。

二、適用場景
裝飾原有物件、在不改變原有物件的情況下擴充套件增強新功能/新特徵.。當不能採用繼承的方式對系統進行擴充套件或者採用繼承不利於系統擴充套件和維護時可以使用裝飾模式。

三、UML類圖
這裡寫圖片描述

四、參與者
①Component(抽象構件):它是具體構件和抽象裝飾類的共同父類,宣告瞭在具體構件中實現的業務方法。
②ConcreteComponent(具體構件):它是抽象構件類的子類,用於定義具體的構件物件(被裝飾者),實現了在抽象構件中宣告的方法,裝飾器可以給它增加額外的職責(方法)。
③Decorator(抽象裝飾類):它也是抽象構件類的子類,用於給具體構件增加職責,但是具體職責在其子類中實現。它維護一個指向抽象構件物件的引用,通過該引用可以呼叫裝飾之前構件物件的方法,並通過其子類擴充套件該方法,以達到裝飾的目的。
④ConcreteDecorator(具體裝飾類):它是抽象裝飾類的子類,負責向構件新增新的職責。每一個具體裝飾類都定義了一些新的行為,它可以呼叫在抽象裝飾類中定義的方法,並可以增加新的方法用以擴充物件的行為。

五、用例學習
1、角色:抽象構件 Component.java

/**
 * 設計模式之 裝飾模式<br/>
 * 角色:抽象構件<br/>
 * 被裝飾的物件抽象類<br/>
 * @author lvzb.software@qq.com
 *
 */
public abstract class Component {

    public abstract void operation();
}

2、角色:具體構件類 ConcreteComponent.java

/**
 * 設計模式之 裝飾模式<br/>
 * 角色:具體構件類<br/>
 * 抽象構件類的子類,定義具體的構件物件,也就是具體的被裝飾物件<br/>
 * @author  lvzb.software@qq.com
 *
 */
public class ConcreteComponent extends Component {

    @Override
    public void operation() {
        System.out.println("我是具體的構件類(被裝飾物件),這是我的原有方法");
    }

}

3、角色:抽象裝飾類 Decorator.java

/**
 * 設計模式之 裝飾模式<br/>
 * 角色:抽象裝飾類<br/>
 * 也是抽象構件類的子類,目的是能夠進行多次裝飾<br/>
 * 作用:引入抽象構件類, 給具體構件類增加職責,但是具體職責在其子類中實現<br/>
 * @author lvzb.software@qq.com
 *
 */
public class Decorator extends Component {

    // 維持一個對抽象構件物件的引用
    private Component component;

    // 注入一個抽象構件型別的物件
    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void operation() {
        // 呼叫原有業務方法
        component.operation();
    }

}

4、角色:具體裝飾類 ConcreteDecoratorA.java

/**
 * 設計模式之 裝飾模式<br/>
 * 角色:具體裝飾類<br/>
 * 向構件新增新的具體的職責、擴充原有物件的行為
 * @author lvzb.software@qq.com
 *
 */
public class ConcreteDecoratorA extends Decorator {

    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        // 呼叫增強業務方法,對原有物件進行裝飾、擴充套件、增強
        addedBehavior();
    }

    private void addedBehavior(){
        System.out.println("我是具體的裝飾類A,我可以增強原有物件方法");
    }

}

5、角色:具體裝飾類 ConcreteDecoratorB.java

/**
 * 設計模式之 裝飾模式<br/>
 * 角色:具體裝飾類<br/>
 * 向構件新增新的具體的職責、擴充原有物件的行為
 * @author  lvzb.software@qq.com
 *
 */
public class ConcreteDecoratorB extends Decorator {

    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        // 呼叫增強業務方法,對原有物件進行裝飾、擴充套件、增強
        addedOtherBehavior();
    }

    private void addedOtherBehavior(){
        System.out.println("我是具體的裝飾類B,我也可以增強原有物件方法");
    }
}

6、客戶端測試類 Client.java

public class Client {

    public static void main(String[] args) {
        Component component,decoratorA;
        component = new ConcreteComponent();

        decoratorA = new ConcreteDecoratorA(component);
        // 對原有具體構件類ConcreteComponent的增強行為
        decoratorA.operation();

        System.out.println("---------------------------\n");

        System.out.println("---對原有構件物件進行 decoratorA、decoratorB 二次裝飾---");
        // 如果需要對原有構件物件裝飾後的decoratorA物件上進行再次裝飾
        Component decoratorB;
        decoratorB = new ConcreteDecoratorB(decoratorA);
        decoratorB.operation();
    }

}

7、執行結果:

我是具體的構件類(被裝飾物件),這是我的原有方法
我是具體的裝飾類A,我可以增強原有物件方法
---------------------------

---對原有構件物件進行 decoratorA、decoratorB 二次裝飾---
我是具體的構件類(被裝飾物件),這是我的原有方法
我是具體的裝飾類A,我可以增強原有物件方法
我是具體的裝飾類B,我也可以增強原有物件方法

六、其他

相關文章