《Head First设计模式》在装饰者模式的引导语里面说“给爱用继承的人一个全新的设计眼界”,一直是使用继承,在学习了装饰者模式后才发现组合的威力。
装饰者模式:动态的将责任附加到对象上,想要扩展功能,装饰者提供了有别于继承的另一种选择
使用装饰者模式需要注意装饰对象和装饰类必须是一个超类,装饰对象和装饰抽象类继承超类继承的是类型。
一起去咖啡厅买杯咖啡吧
超类:
public abstract class Beverage {
// 描述
String description = "不确定的类型";
public String getDescription() {
return description;
}
// 价格
public abstract double cost();
}
装饰主体对象(以咖啡为主体,这是一杯浓咖啡):
public class Espresso extends Beverage {
// 咖啡的描述
public Espresso() {
description = "浓咖啡";
}
@Override
public double cost() {
// 价格是十元
return 10;
}
}
装饰主体对象(这是一杯混合咖啡):
public class HouseBlend extends Beverage {
public HouseBlend() {
description = "黑咖啡";
}
@Override
public double cost() {
return 12;
}
}
抽象装饰类:
public abstract class Condiment extends Beverage {
public abstract String getDescription();
}
具体装饰类(给咖啡加点摩卡吧):
public class Mocha extends Condiment {
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
// 使用组合得到描述
return beverage.getDescription() + ", 摩卡";
}
@Override
public double cost() {
// 使用组合得到价格
return 0.5 + beverage.cost();
}
}
具体装饰类(给咖啡加点奶泡吧):
public class Whip extends Condiment {
Beverage beverage;
public Whip(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription() + ", 奶泡";
}
@Override
public double cost() {
return 1 + beverage.cost();
}
}
现在我们开始点咖啡吧:
public class Test {
public static void main(String[] args) {
Beverage beverage = new Espresso();
System.out.println("点一杯浓咖啡:");
System.out.println(beverage.getDescription() + " :¥" + beverage.cost());
Beverage beverage2 = new HouseBlend();
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
System.out.println("\n点一杯摩卡奶泡黑咖啡");
System.out.println(beverage2.getDescription() + " :¥" + beverage2.cost());
}
}
咖啡已经喝完了(~ ̄▽ ̄)~
这个例子是咖啡为主体,用各种调料装饰咖啡,因为组合时可能是纯咖啡与调料组合,也有可能是咖啡与一种或多种调料的组合再和调料进行组合,所以咖啡和调料必须是一个超类,就是类型必须一致。
以上就是我对装饰者模式的了解,有不到之处望各位大神多多指正(。◕ˇ∀ˇ◕)
以上完整代码可以在http://download.csdn.net/download/sjm01234/10200158下载( ˃ᴗ˂ )