装饰者模式的重点在于:装饰者和被装饰者必须是一样的类型,也就是拥有共同的超类,这里利用继承达到了“类型匹配”,而不是利用继承获得“行为”。当我们将装饰者与组件结合时,就是加入新的行为,所得到的行为并不是通过继承超类得来的,而是通过组合对象得来的。也就是说为了得到正确的类型而继承超类接口,行为来自于装饰者和基础组件的组合。
public abstract class Beverage {
string description = "unknown";
public String getDesc(){
return descriptioin;
}
public abstract double cost();
}
public abstract class CondimentDecorator extends Beverages{
public abstract String getDesc();
}
public class Espresso extends Beverage {
public Espresso(){
description = "spresso";
}
public double cost(){
return 1.99;
}
}
public class HouseBlend extends Beverage {
public HouseBlend(){
description = "HouseBlend";
}
public double cost(){
return 1.99;
}
}
// 调料代码
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha (Beverage beverage){
this.beverage = beverage;
}
public String getDesc(){
return beverage.getDesc() + ",Mocha";
}
public double cost(){
return 0.20 + beverage.cost();
}
}
... 调料类
// 客户端类
public class StarCoffee {
Beverage beverage = new Espresso();
// Decorator 装饰
Beverage be2 = new DarkRoast();
be2 = new Mocha(be2);
be2 = new Whips(be2);
}
- 装饰者模式 意味着一群装饰者类来包装具体组件
- 装饰者类反映了被装饰的组件类型
- 装饰者可以在被装饰者的行为 前面/后面 加上自己的行为,甚至将被装饰者的行为整个取代掉,从而达到特定的目的。
- 装饰者一般对组件是透明的,除非足见客户依赖于组件的矩形类型。