開放原則:類應該對擴展開放,對修改關閉。ide
- 上篇博客中的觀察者模式中,經過加入新的觀察者,咱們能夠在任什麼時候候擴展主題(Subject),並且不需向主題中添加代碼。測試
- 裝飾者模式也徹底遵循開放原則。this
裝飾者模式:動態地將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。spa
記住:是你,還有你,一切拜託你。code
是你:包裝類繼承(或實現)被包裝類對象
還有你:包裝類包含被包裝類的一個實例blog
一切拜託你:非加強方法所有拜託 被包裝類的實例來完成繼承
加強方法:根據需求重寫方法ip
代碼get
/** * 飲料 * @author oy * @date 2019年8月28日 下午11:07:33 * @version 1.0.0 */ public abstract class Beverage { public String description; public String getDescription() { return description; } public abstract double cost(); // 其餘方法 public abstract String method1(); }
CondimentDecorator
/** * 裝飾類 = 飲料 + 調料 * @author oy * @date 2019年8月28日 下午11:13:55 * @version 1.0.0 */ public abstract class CondimentDecorator extends Beverage { public abstract String getDescription(); // 空實現 public String method1() { return ""; } }
Espresso
/** * 濃縮咖啡 */ public class Espresso extends Beverage { public Espresso() { description = "Espresso"; } @Override public double cost() { return 1.0; } @Override public String method1() { return "Espresso method1()"; } }
HouseBlend
/** * House Blend Coffee*/ public class HouseBlend extends Beverage { public HouseBlend() { description = "House Blend Coffee"; } @Override public double cost() { return 2.0; } @Override public String method1() { // TODO Auto-generated method stub return "HouseBlend method1()"; } }
Mocha
/** * 具體的裝飾類:是你,還有你,一切拜託你。*/ public class Mocha extends CondimentDecorator {//是你:Mocha是Beverage類型 Beverage beverage; // 還有你:Mocha包含Beverage的對象實例 public Mocha(Beverage beverage) { this.beverage = beverage; } @Override public String getDescription() { return beverage.getDescription() + ", Mocha"; } // 一切拜託你:Beverage的不須要加強的方法所有拜託給beverage對象來處理 @Override public String method1() { return beverage.method1(); } // 重寫加強方法 @Override public double cost() { return 0.20 + beverage.cost(); } }
Whip
/** * 具體的裝飾類:是你,還有你,一切拜託你。 * @author oy * @date 2019年9月1日 上午10:06:53 * @version 1.0.0 */ public class Whip extends CondimentDecorator {//是你 Beverage beverage; // 還有你 public Whip(Beverage beverage) { this.beverage = beverage; } @Override public String getDescription() { return beverage.getDescription() + ", Whip"; } @Override public String method1() { return beverage.method1(); } // 加強方法 @Override public double cost() { return 0.30 + beverage.cost(); } }
測試代碼
public static void main(String[] args) { Beverage beverage = new Espresso(); System.out.println(beverage.getDescription() + " $" + beverage.cost()); System.out.println(beverage.method1()); // 用摩卡裝飾Espresso(濃縮飲料) Beverage mocha = new Mocha(beverage); System.out.println(mocha.getDescription() + " $" + mocha.cost()); System.out.println(mocha.method1()); // 還能夠繼續裝飾mocha mocha = new Whip(mocha); System.out.println(mocha.getDescription() + " $" + mocha.cost()); System.out.println(mocha.method1()); }
打印結果:
Espresso $1.0 Espresso method1() Espresso, Mocha $1.2 Espresso method1() Espresso, Mocha, Whip $1.5 Espresso method1()