裝飾器模式 Decorator Pattern

裝飾者模式(Decorator Pattern)是指在不改變元祐對象的基礎上將功能附加到對象上,提供了比繼承更有彈性的方案(即擴展原有對象的功能),屬於結構型模式。裝飾者模式適用於以下場景:

  1. 擴展一個類的功能或給一個類添加附加的職責。
  2. 動態的給一個對象添加功能,這些功能可以再動態地撤銷。

以日常生活中一個小例子來講解裝飾者模式的應用。如:我們在平時的上班的早上,很多人可能都是起的比較晚,走在路上隨便買點煎餅來對付。

1、首先創建一個煎餅的抽象類

public abstract class Battercake {
    protected abstract String getMsg();
    protected abstract int getPrice();
}

2、創建一個基本的煎餅類

public class BaseBattercake extends Battercake {

    @Override
    protected String getMsg() {
        return "煎餅果子";
    }

    @Override
    protected int getPrice() {
        return 5;
    }
}

3、創建一個抽象的套餐裝飾者類(爲什麼要創建這個呢?因爲有人要加雞蛋,有人要加火腿,有人要加多個[不固定])

public abstract class BattercakeDecorator extends Battercake {

    /** 靜態代理 */
    private Battercake battercake;

    public BattercakeDecorator(Battercake battercake) {
        this.battercake = battercake;
    }

    @Override
    protected String getMsg() {
        return this.battercake.getMsg();
    }

    @Override
    protected int getPrice() {
        return this.battercake.getPrice();
    }
}

4、創建一個加雞蛋的煎餅裝飾器

public class EggDecorator extends BattercakeDecorator {

    public EggDecorator(Battercake battercake) {
        super(battercake);
    }

    @Override
    protected String getMsg() {
        return super.getMsg() + "+1個雞蛋";
    }

    @Override
    protected int getPrice() {
        return super.getPrice() + 1;
    }
}

5、創建一個加火腿的裝飾器

public class SausageDecorator extends BattercakeDecorator {

    public SausageDecorator(Battercake battercake) {
        super(battercake);
    }

    @Override
    protected String getMsg() {
        return super.getMsg() + "+1個火腿";
    }

    @Override
    protected int getPrice() {
        return super.getPrice() + 2;
    }
}

6、所有的步驟都已經寫完了,現在用一個測試類來測試是否有效。

public class Test {

    public static void main(String[] args) {

        Battercake battercake = null;
        // 基本套餐
        battercake = new BaseBattercake();
        // 加一個雞蛋
        battercake = new EggDecorator(battercake);
        // 加個火腿
        battercake = new SausageDecorator(battercake);
        // 再加個雞蛋
        battercake = new EggDecorator(battercake);

        System.out.println(battercake.getMsg() + ",總價格:" + battercake.getPrice());
    }
}

打印的結果如下:

煎餅果子+1個雞蛋+1個火腿+1個雞蛋,總價格:9

從上面的打印結果可知,裝飾者模式的作用爲動態的添加或者或者撤銷某一項功能。由於每人的要求不同,從而可以根據各自的要求制定相應的計劃獲得需要的結果。

而在次示例中,原有的煎餅類BaseDecorator 並沒有改變,當我們想要一些新的功能的時候只需要利用一個裝飾器就可以了,這就是裝飾器模式獨特的地方。

 

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