装饰者模式:
动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
以饮料店配调料为例:
//测试类
public class StarbuzzCoffee {
public static void main(String[] args) {
Beverage beverage = new Espresso();//点一杯没有任何调料的咖啡
System.out.println(beverage.getDescription()+"$"+beverage.cost());//打印描述和价格
Beverage beverage2 = new HouseBlend();//点一杯摩卡、奶泡搭配的HouseBlend
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
System.out.println(beverage2.getDescription()+"$"+beverage2.cost());//打印描述和价格
}
}
public abstract class Beverage {//饮料超类
String description = "Unknown Beverage";
public String getDescription() {
return description;
}
public abstract double cost();
}
public class Espresso extends Beverage{//饮料
public Espresso() {
description = "Espresso";
}
public double cost() {
return 1.99;
}
}
public class HouseBlend extends Beverage{//饮料
public HouseBlend() {
description = "HouseBlend";
}
public double cost() {
return .98;
}
}
public abstract class CondimentDecorator extends Beverage{//装饰者超类
public abstract String getDescription();
}
public class Mocha extends CondimentDecorator{
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage=beverage;
}
public String getDescription() {
return beverage.getDescription()+",Mocha";
}
public double cost() {
return .20+beverage.cost();
}
}
public class Whip extends CondimentDecorator{
Beverage beverage;
public Whip(Beverage beverage) {
this.beverage=beverage;
}
public String getDescription() {
return beverage.getDescription()+",Whip";
}
public double cost() {
return .30+beverage.cost();
}
}
装饰者模式
原文:https://www.cnblogs.com/jungledove/p/11838980.html