裝飾器模式(Decorator Pattern)

介紹

裝飾者模式(Decorator Pattern)是指在不改變原有對象的基礎之上,將功能附加到對 象上,提供了比繼承更有彈性的替代方案(擴展原有對象的功能),屬於結構型模式。

裝飾者模式在我們生活中應用也比較多如給煎餅加雞蛋;給蛋糕加上一些水果;給房子 裝修等,爲對象擴展一些額外的職責。

優點

1、裝飾者是繼承的有力補充,比繼承靈活,不改變原有對象的情況下動態地給一個對象 擴展功能,即插即用。

2、通過使用不同裝飾類以及這些裝飾類的排列組合,可以實現不同效果。

3、裝飾者完全遵守開閉原則。

缺點

1、會出現更多的代碼,更多的類,增加程序複雜性。

2、動態裝飾時,多層裝飾時會更復雜。

使用場景

1、用於擴展一個類的功能或給一個類添加附加職責。

2、動態的給一個對象添加功能,這些功能可以再動態的撤銷。

3、裝飾器模式在源碼中也應用得非常多,在 JDK 中體現最明顯的類就是 IO 相關的類,如 BufferedReader、InputStream、OutputStream。

使用建議

 

具體實現

類圖

代碼

package com.knowledge.system.software_design_pattern.decorator.course_instance;

public abstract class Battercake {
    public   abstract String getMsg();
    public   abstract int getPrice();
}
package com.knowledge.system.software_design_pattern.decorator.course_instance;

public class BaseBattercake extends Battercake {
    @Override
    public String getMsg() {
        return "煎餅";
    }

    @Override
    public int getPrice() {
        return 5;
    }
}
package com.knowledge.system.software_design_pattern.decorator.course_instance;

public  abstract class BattercakeDecorator extends BaseBattercake{

    //靜態代理,委派
    private Battercake battercake;

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

    protected abstract void doSomething();

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

    @Override
    public int getPrice() {
        return battercake.getPrice();
    }
}
package com.knowledge.system.software_design_pattern.decorator.course_instance;

public class EggDecorator extends BattercakeDecorator{
    public EggDecorator(Battercake battercake) {
        super(battercake);
    }

    @Override
    protected void doSomething() {
        System.out.println("加雞蛋");
    }

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

    @Override
    public int getPrice() {
        return super.getPrice()+1;
    }
}
package com.knowledge.system.software_design_pattern.decorator.course_instance;

public class SauageDecorator extends BattercakeDecorator{

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

    @Override
    protected void doSomething() {
        System.out.println("香腸");
    }

    @Override
     public String getMsg() {
        return super.getMsg()+"+1根 香腸";
    }

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

}
package com.knowledge.system.software_design_pattern.decorator.course_instance;

/**
 *
 * 1.OOM關係
 * 2.前置考慮
 * 3.源碼實例:JDK中的輸入輸出流、MyBatis的org.apache.ibatis.cache.Cache、Spring 中的TransactionAwareCacheDecorator 類
 * 4.動態的給一個對象添加功能,這些功能可以再動態的撤銷
 * 5.用於擴展一個類的功能或給一個類添加附加職責
 */
public class Test {
    public static void main(String[] args) {
        System.out.println("裝飾者模式");

        Battercake battercake;
        battercake=new BaseBattercake();
        battercake=new EggDecorator(battercake);
        battercake=new SauageDecorator(battercake);
        battercake=new SauageDecorator(battercake);

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

}

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