2019独角兽企业重金招聘Python工程师标准>>>
装饰者模式动态地将责任附加到对象上。如要扩展功能,装饰者提供了比继承更有弹性的替代方案。
设计原则:类应该对扩展开放,对修改关闭。
抽象组件Component :
Beverage类(可以是接口也可以是抽象类)
package com.sun;
public abstract class Beverage {
String description = "Unknow Beverage";
public String getDescription(){
return description;
}
public abstract double cost();
}
具体组件ConcreteComponent:具体组件扩展自 Beverage类
DarkRost类
package com.sun;
public class DarkRost extends Beverage {
public DarkRost(){
description = "this is DarkRost";
}
public double cost() {
return 0.88;
}
}
Espresso类
package com.sun;
public class Espresso extends Beverage{
public Espresso(){
description = "Espresso";
}
public double cost(){
return 1.99;
}
}
HouseBlend类
package com.sun;
public class HouseBlend extends Beverage {
public HouseBlend(){
description = "House Blend Coffee";
}
public double cost() {
return .89;
}
}
抽象装饰者Decorator: 必须让 抽象装饰者能够取代Beverage,所以将抽象装饰者扩展自Beverage类
CondimentDecorator类
package com.sun;
public abstract class CondimentDecorator extends Beverage{
public abstract String getDescription();
}
具体装饰者:
Mocha类
package com.sun;
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage){
this.beverage = beverage;
}
public String getDescription() {
/*因为Beverage对象已经被装饰过,所以这里不只是想描述被装饰者(例如DarkRost),而是连同装饰者都描述出来(例如“DarkRoast,Mocha”。所以首先利用委托的做法,得到一个叙述,然后在其后加上附加的叙述。*/
return beverage.getDescription() +",Mocha";
}
public double cost() {
return .20 + beverage.cost();
}
}
Whip类
package com.sun;
public class Whip extends Beverage {
Beverage beverage;
public Whip(Beverage beverage){
this.beverage = beverage;
}
public String getDescription(){
return beverage.getDescription() + ", Whip";
}
public double cost() {
return 0.22 + beverage.cost();
}
}
测试类:StarbuzzCoffee
package com.sun;
public class StarbuzzCoffee {
public static void main(String[] args) {
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription()+"$" + beverage.cost());
Beverage beverage2 = new DarkRost();
beverage2 = new Mocha(beverage2); //用Mocha装饰DarkRost对象
beverage2 = new Whip(beverage2); //用第二个Mocha装饰DarkRost对象
System.out.println(beverage2.getDescription()+"$" + beverage2.cost());
Beverage beverage3 = new HouseBlend();
beverage3 = new Whip(beverage3); //用Whip装饰HouseBlend对象
beverage3 = new Mocha(beverage3); //用Mocha装饰HouseBlend对象
System.out.println(beverage3.getDescription() + "$" +beverage3.cost());
}
}
测试结果:
Espresso$1.99
this is DarkRost,Mocha, Whip$1.3
House Blend Coffee, Whip,Mocha$1.31
可以利用工厂和生成器设计模式,能以更好的方式建立被装饰者对象。