当我们将装饰者与组件组合时,就是在加入新的行为,所得到的薪行为,并不是继承自超类,而是有组合对象的来的。
看demo玩的很happy,感觉也只有这种业务场景能够用到了。也就是一些东西会重复和累加使用,
而且重复累加使用的特性在父类是完成不了的。那么就需要各个子类去完成自己的东西,最后累加到一起。
调料其实不是真实饮料的子类,调料只是为了能够覆盖饮料,把自己加进去。
也就是借助继承。
package cn.partner4java.decorator; /** * 饮料,原始的饮料基础类 * @author partner4java * */ public abstract class Beverage { String description = "Unknown Beverage"; public String getDescription() { return description; } public abstract double cost(); }
package cn.partner4java.decorator; /** * 调料抽象类 -- 实现它来增加调料 * @author partner4java * */ public abstract class CondimentDecorator extends Beverage { public abstract String getDescription(); }
package cn.partner4java.decorator; /** * * @author partner4java * */ public class Espresso extends Beverage { public Espresso(){ description = "Espresso"; } @Override public double cost() { return 1.99; } }
package cn.partner4java.decorator; /** * * @author partner4java * */ public class HouseBlend extends Beverage { public HouseBlend(){ description = "House Blend Coffee"; } @Override public double cost() { return .89; } }
package cn.partner4java.decorator; /** * 加入摩卡这个装饰者 * @author partner4java * */ public class Mocha extends CondimentDecorator { /** 被装饰者 */ Beverage beverage; /** * 强制进来一个被装饰者 * @param beverage 被装饰者 */ public Mocha(Beverage beverage){ this.beverage = beverage; } @Override public String getDescription() { return beverage.getDescription() + ",Mocha"; } @Override public double cost() { return .20 + beverage.cost(); } }
package cn.partner4java.decorator; /** * 加入奶泡这个装饰者 * @author partner4java * */ public class Whip extends CondimentDecorator { /** 被装饰者 */ Beverage beverage; /** * 强制进来一个被装饰者 * @param beverage 被装饰者 */ public Whip(Beverage beverage){ this.beverage = beverage; } @Override public String getDescription() { return beverage.getDescription() + ",Whip"; } @Override public double cost() { return .10 + beverage.cost(); } }
package cn.partner4java.decorator.test; import cn.partner4java.decorator.Beverage; import cn.partner4java.decorator.Espresso; import cn.partner4java.decorator.HouseBlend; import cn.partner4java.decorator.Mocha; import cn.partner4java.decorator.Whip; /** * 测试装饰者模式 * @author partner4java * */ public class TestDecorator { public static void main(String[] args) { Beverage beverage = new Espresso(); System.out.println(beverage.getDescription() + " {1}quot; + beverage.cost()); Beverage beverage2 = new HouseBlend(); beverage2 = new Mocha(beverage2); beverage2 = new Whip(beverage2); System.out.println(beverage2.getDescription() + " {1}quot; + beverage2.cost()); } }