关于装饰者模式:
装饰者和被装饰对象有相同的超类型;
你可以用一个或者多个装饰者包装一个对象;
既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象的场合,可以用装饰过的对象代替它;
装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为以达到特定的目的;
对象可以在任何时候被装饰,所以可以在运行时动态地,不限量地使用你喜欢的装饰者来装饰对象。
装饰者模式的说明:
动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
举个例子:
星巴克的咖啡和调料:星巴克有多种咖啡,每种咖啡可以加上各种不同的调料,如何计算价钱又方便以后扩展。
类:
public abstract class Beverage {
String description = "Unknow Beverage";
public String getDescription(){
return description;
}
public abstract double cost();
}
类:
public abstract class CondimentDecorator extends Beverage{
public abstract String getDescription();
}
类:
public class Espresso extends Beverage {
public Espresso(){
description = "Espresso";
}
public double cost()
{
return 1.09;
}
}
类:
public class HouseBlend extends Beverage{
public HouseBlend(){
description ="House Blend Coffee";
}
public double cost(){
return .89;
}
}
类:
public class Mocha extends CondimentDecorator{
Beverage beverage;
public Mocha(Beverage beverage){
this.beverage = beverage;
}
public String getDescription(){
return beverage.getDescription()+",Mocha";
}
public double cost(){
return .20+beverage.cost();
}
}
省略一些实现。
测试类:
public class StarbuzzCoffee {
public static void main(String args[])
{
Beverage beverage = new Espresso();
beverage = new Mocha(beverage);
beverage = new Mocha(beverage);
System.out.println(beverage.getDescription()+"$"+beverage.cost());
}
}