装饰者模式,可以动态地把职责附加到已有的对象上面去。又称 Wrapper Pattern,在代码实现的时候,确实有“包装”的意思。
类图
图:来自《Head First Design Patterns》
可以看出,装饰者模式里面,有4个角色:Component抽象类,ConcreteComponent具体类,Decorator抽象类,ConcreteDecorator具体类
图:我的Java源代码的类图
总共10个类
一个Component抽象类
两个ConcreteComponent具体类
一个Decorator抽象类
五个ConcreteDecorator具体类
一个Main测试类
ConcreteDecorator 继承了Decorator抽象类, 组合了Component抽象类。Decorator抽象类继承了Component抽象类,这个继承的目的是:it’s vital that the decorators have the same type as the object they are going to decorate。简而言之,就是为了获得相同的类型,并不是为了获得行为。组合是为了让所有的concreteDecorator可以“互相包装、装饰”
talk is cheap, show me the code
去食堂打菜,经济套餐,假设总共只有5种食物可供选择分别是:手撕包菜,茄子豆角,麻婆豆腐,青椒肉丝,红烧里脊。
一个Component抽象类
package decorator;
public abstract class Meal
{
String description = "Unknown Meal";
public String getDescription()
{
return description;
}
public abstract double cost();
}
两个ConcreteComponent具体类
package decorator;
public class ChineseMeal extends Meal
{
public ChineseMeal()
{
description = "Chinese Meal";
}
@Override
public double cost()
{
return 1.0; // 一次性餐具费用
}
}
package decorator;
public class WesternMeal extends Meal
{
public WesternMeal()
{
description = "Western meal";
}
@Override
public double cost()
{
return 5.0; // 不锈钢刀、叉费用
}
}
一个Decorator抽象类
package decorator;
public abstract class Decorator extends Meal
{
public abstract String getDescription();
}
五个ConcreteDecorator具体类
package