01 定義
裝飾者模式:動態(tài)的將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。
02 情景
現(xiàn)有深焙咖啡(10.0元)和家??Х龋?1.0元),可以添加各種調味:牛奶(1.0元)、摩卡(1.5元)、巧克力(2.0元)等等。不管添加了什么,最后都還是咖啡。
03 類圖

DecoratorPattern.png
04 Class
// 飲料的抽象類
public abstract class Beverage {
protected String description = "";
public String getDescription(){
return description;
}
public abstract double cost();
}
// 深焙咖啡
public class DarkRoast extends Beverage {
public DarkRoast(){
description = "Dark roast";
}
@Override
public double cost() {
return 10.0;
}
}
// 家??Х?public class HouseBlend extends Beverage {
public HouseBlend(){
description = "House blend";
}
@Override
public double cost() {
return 11.0;
}
}
// 調味品 裝飾者 抽象類
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
// 牛奶 裝飾者
public class MilkDecorator extends CondimentDecorator {
private Beverage beverage;
public MilkDecorator(Beverage beverage){
this.beverage = beverage;
description = "Milk";
}
@Override
public String getDescription() {
return beverage.getDescription() +","+ description;
}
@Override
public double cost() {
return beverage.cost() + 1.0;
}
}
// 摩卡 裝飾者
public class MochaDecorator extends CondimentDecorator {
private Beverage beverage;
public MochaDecorator(Beverage beverage){
this.beverage = beverage;
description = "Mocha";
}
@Override
public String getDescription() {
return beverage.getDescription() +","+ description;
}
@Override
public double cost() {
return beverage.cost() + 1.5;
}
}
05 測試
// 定一杯Dark roast,不加調料。
Beverage beverage01 = new DarkRoast();
System.out.println(beverage01.getDescription() + " $" + beverage01.cost());
// 定一杯Dark roast,加牛奶和摩卡
Beverage beverage02 = new DarkRoast();
beverage02 = new MilkDecorator(beverage02);
beverage02 = new MochaDecorator(beverage02);
System.out.println(beverage02.getDescription() + " $" + beverage02.cost());

TestResult.png