前言
类应该对扩展开放,对修改关闭。在不修改现有代码的情况下,就可搭配新的行为。
概括
1、装饰者和被装饰者有相同的父类
2、你可以用一个或者多个装饰者包装一个对象
3、既然装饰者和被装饰者对象有相同的超类型,所以在任何需要原始对象(被包装)的场合,都可以用装饰过的对象代替它。
4、装饰者可以在所委托被装饰者的行为之前、之后加上自己的行为,以达到特定目的。
5、对象可以再任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。
装饰者模式动态地将责任附加在对象上,若要扩展功能,装饰者提供了比继承更富有弹性的替代方案。
举例
//Beverage class
//抽象类,description属性以及getDescription已经实现,cost方法需要子类实现
public abstract class Beverage{
String description="Unknown Beverage";
public String getDescription(){
return description;
}
public avstract double cost();
}
//装饰者抽象类
public abstract class CondimentDecorator extends Beverage{
public abstract String getDescription();//每个装饰者都要实现这个方法
//父类中没有Beverage对象,由子类装饰者管理
}
//Espresso饮料 被装饰的元素
public class Espresso extends Beverage{
public Espresso(){
description="Espresso";
}
public double cost(){
return 1.99;
}
}
//HouseBlend饮料
public class HouseBlend extends Beverage{
public HouseBlend(){
description="HouseBlend";
}
public double cost(){
return .89;
}
}
//装饰者 例1
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 .2+beverage.cost();
}
}
//测试
public class StarbarksCoffee{
public static void main(String[] args){
Beverage beverage=new Espresso();
beverage=new Mocha(beverage);//用Mocha装饰
beverage=new Whip(beverage);//用Whip装饰
System.out.println(beverage.getDescription()+"$"+beverage.cost());
}
}