裝飾者模式:
動態地將責任附加到對象上,若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。
以飲料店配調料爲例:
//測試類
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();
}
}