装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案
接下来举一个例子来说明,这个例子是Head Frist 设计模式中的一个例子
场景:在星巴克的咖啡销售系统中,提供咖啡和调料的组合,并且在用户选好了咖啡和调料之后自动计算价格
某客户点了 浓缩咖啡加摩卡加牛奶的组合
首先是饮料类的抽象类
package com.zw.mymaven;
//饮料的抽象类
public abstract class Beverage {
String description = "Unknown Beverage";
//描述
public String getdescribtion() {
return description;
}
//花 费
public abstract double cost();
}调料类的抽象类
package com.zw.mymaven;
//调料类,也是装饰者类
public abstract class CondimentDecorrator {
//这里要重写getDescribtion的原因
//所谓装饰者类 其实就是包含被装饰者的类
//那么被装饰者和装饰者中的共有的还没定义的方法在这里定义
public abstract String getDescribtion();
}
浓缩咖啡类
package com.zw.mymaven;
//浓缩咖啡的饮料类的实现
public class Espresso extends Beverage {
public Espresso() {
description = "这是一杯浓缩咖啡";
}
@Override
public double cost() {
return 1;
}
}摩卡类
package com.zw.mymaven;
public class Moka extends CondimentDecorrator {
Beverage beverage;
public Moka(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescribtion() {
return beverage.getdescribtion() + "加了摩卡,";
}
public double cost() {
return beverage.cost() + 2;
}
}
牛奶类
package com.zw.mymaven;
public class Milk extends CondimentDecorrator {
Beverage beverage;
public Milk(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescribtion() {
return beverage.getdescribtion() + "加了牛奶,";
}
public double cost() {
return beverage.cost() + 3;
}
}测试类
package com.zw.mymaven;
public class Test3 {
public static void main(String[] args) {
// 点一杯浓缩咖啡
Beverage espresso = new Espresso();
// 加入摩卡
espresso = new Moka(espresso);
// 加入牛奶
espresso = new Milk(espresso);
System.out.println(espresso.getdescribtion() + "花费了" + espresso.cost());
}
}