軟件設計模式——裝飾器模式

一、定義

裝飾器模式是爲已有的模式動態地添加額外的功能的一種模式。允許向一個現有的對象添加新的功能,但是不影響其結構。作爲現有對象的一個包裝。這種模式創建了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。

二、設計類圖

三、作用

一般的,我們爲了擴展一個類經常使用繼承方式實現,由於繼承爲類引入靜態特徵,並且隨着擴展功能的增多,子類會很膨脹。動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更爲靈活。

四、代碼實現

/**
 * 基礎的接口
 * @Author: [email protected]
 * @Date: 2019-11-12 09:22
 */
public interface Apple {
	void res();
}
/**
 * 實現接口具體的類
 *
 * @Author: [email protected]
 * @Date: 2019-11-12 09:23
 */
public class ConcreteApple implements Apple {
    @Override
    public void res() {
        System.out.println("普通蘋果");
    }
}
/**
 * 裝飾器基類
 *
 * @Author: [email protected]
 * @Date: 2019-11-12 09:24
 */
public abstract class Decorator implements Apple {

    protected Apple apple;

    public Decorator(Apple apple) {
        this.apple = apple;
    }

    @Override
    public void res() {
        apple.res();
    }
}
/**
 * 具體的裝飾類的實現類
 *
 * @Author: [email protected]
 * @Date: 2019-11-12 09:26
 */
public class ConcreteDecoratorA extends Decorator {

    public ConcreteDecoratorA(Apple apple) {
        super(apple);
    }

    public void resA() {
        System.out.println("被裝飾器A擴展的功能,我是紅色的蘋果.");
    }

    @Override
    public void res() {
        super.res();
        //在重寫原有方法時 裝飾了一個resA方法
        resA();
    }
}
/**
 * 具體的裝飾類的實現類
 *
 * @Author: [email protected]
 * @Date: 2019-11-12 09:27
 */
public class ConcreteDecoratorB extends Decorator {

    public ConcreteDecoratorB(Apple apple) {
        super(apple);
    }

    public void resB() {
        System.out.println("被裝飾器B擴展的功能,我是綠色的蘋果.");
    }

    @Override
    public void res() {
        super.res();
        resB();
    }
}
/**
 * 主類測試
 *
 * @Author: [email protected]
 * @Date: 2019-11-12 09:28
 */
public class Main {
    public static void main(String[] args) {
        Apple apple = new ConcreteApple();
        //原來的方法
        apple.res();

        //裝飾出紅色的蘋果
        ConcreteDecoratorA decoratorA = new ConcreteDecoratorA(apple);
        decoratorA.res();

        //裝飾後的方法 裝飾出綠色的蘋果
        ConcreteDecoratorB decoratorB = new ConcreteDecoratorB(apple);
        decoratorB.res();
    }
}

輸出結果:

普通蘋果
普通蘋果
被裝飾器A擴展的功能,我是紅色的蘋果.
普通蘋果
被裝飾器B擴展的功能,我是綠色的蘋果.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章