装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
通常装饰者模式是采用抽象类,但也可以使用接口,装饰者和装饰对象均继承同一个抽象类。在这里,我们利用继承达到“类型匹配”。
package com.coffee; /* * 饮料类 */ public abstract class Beverage { String description = "Unknown Beverage"; public String getDescription() { return description; } public abstract double cost(); }
package com.coffee; /* * 装饰者类 */ public abstract class CondimentDecorator extends Beverage { public abstract String getDescription(); }
package com.coffee; /* * 具体的饮料:浓缩咖啡 */ public class Espresso extends Beverage { public Espresso() { description = "Espresso"; } public double cost() { return 1.99; } }
package com.coffee; /* * 具体的饮料:HouseBlend 咖啡 */ public class HouseBlend extends Beverage { public HouseBlend() { description = "House Blend Coffee"; } public double cost() { return .89; } }
package com.coffee; /* * 具体的调料: 摩卡 */ 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(); } }
package com.coffee; /* * 测试类 */ public class StarbuzzCoffee { public static void main(String args[]) { Beverage beverage = new Espresso(); System.out.println(beverage.getDescription() + " $" + beverage.cost()); Beverage beverage2 = new Mocha(beverage); System.out .println(beverage2.getDescription() + " $" + beverage2.cost()); } }