对装饰模式的理解:
在装饰模式中的各个角色有:
(1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
(2)具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
(3)装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
(4)具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。
public abstract class Beverage {//基类,饮料
String description = "Unknow description";
public String getDescription(){
return description;
}
public abstract double cost();
}
public class Espresso extends Beverage{/组成饮料的一种材料
public Espresso(){
description = "Espresso";
}
@Override
public double cost() {
return 1.99;
}
}
public class HouseBlend extends Beverage{//组成饮料的一中材料
public HouseBlend(){
description = "HouseBlend";
}
@Override
public double cost() {
return .89;
}
}
public abstract class CondimentDecorate extends Beverage{
public abstract String getDescription();
}
public class Mecha extends CondimentDecorate {//组合几种材料的饮料
Beverage beverage;
public Mecha(Beverage b){
this.beverage = b;
}
@Override
public String getDescription() {
return beverage.getDescription() + "Mecha";
}
@Override
public double cost() {
return .20 + beverage.cost();
}
}
public class CoffeTest {//测试用例
public static void main(String[] args){
Beverage beverage = new HouseBlend();
beverage = new Mecha(beverage);
System.out.print(beverage.getDescription() + "$" + beverage.cost());
}
}
装饰模式的UML图:
为何非要Decorator这个类?
装饰模式的实例图:
对装饰模式内部运行机制的理解:其实就是一层层包装