- 定义
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
- 重点
- 装饰者和被装饰者必须是同种类型,也就是有共同的超类
- 装饰者拥有新的方法或者方法的实现方式
- 实现
基类
public abstract class Beverage { protected String description; public String getDescription(){ return description; } public abstract double cost(); }
装饰者基类
public abstract class CondimentDecorator extends Beverage { public abstract String getDescription(); }
基于基类的原对象
public class HouseBlend extends Beverage { public HouseBlend(){ description = "HouseBlend"; } @Override public double cost() { return 0.89; } }
public class Espresso extends Beverage { public Espresso(){ description = "Espresso"; } @Override public double cost() { return 1.99; } }
基于装饰者的装饰对象
public class Mocha extends CondimentDecorator{ Beverage beverage; public Mocha(Beverage beverage){ this.beverage = beverage; } @Override public String getDescription() { return beverage.getDescription() + ";Mocha"; } @Override public double cost() { return 0.2 + beverage.cost(); } }
public class Whip extends CondimentDecorator { Beverage beverage; public Whip(Beverage beverage){ this.beverage = beverage; } @Override public String getDescription() { return beverage.getDescription() + ";Whip"; } @Override public double cost() { return beverage.cost() + 1.5; } }
测试类
public class Test { public static void main(String[] args){ Beverage beverage = new Espresso(); System.out.println(beverage.getDescription() + "$"+ beverage.cost()); Beverage beverage1 = new Mocha(beverage); System.out.println(beverage1.getDescription() + "$"+ beverage1.cost()); beverage1 = new Mocha(beverage1); System.out.println(beverage1.getDescription() + "$"+ beverage1.cost()); beverage1 = new Whip(beverage1); System.out.println(beverage1.getDescription() + "$"+ beverage1.cost()); } }
结果