介紹
裝飾者模式(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());
}
}