How can I remove a decorator from an object?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | public abstract class Beverage { protected String Description; public String getDescription(){ return Description; } public abstract int cost(); } public class Espresso extends Beverage{ public int cost(){ return 2; } public Espresso(){ Description ="Espresso"; } } abstract class CondimentDecorator extends Beverage{ public abstract String getDescription(); } public class Mocha extends CondimentDecorator{ Beverage beverage; public Mocha(Beverage beverage){ this.beverage=beverage; } @Override public String getDescription() { return beverage.getDescription()+", Mocha"; } @Override public int cost() { return beverage.cost()+0.5; } public Beverage remove(Beverage b) { return b; } } ... |
有更多的装潢师喜欢牛奶。大豆。还有咖啡,比如家常菜……等。。
如果我有一个摩卡牛奶装饰的对象,我想删除只是"摩卡"装饰。
1 2 | Beverage beverage = new Mocha(new Espresso()); beverage = new Milk(beverage); |
编辑:场景是
客户在咖啡和牛奶中加入了Expresso。
现在,咖啡用摩卡和牛奶装饰。
突然间,顾客想用鞭子代替摩卡。
如果不写一个定制的装饰器来处理这个问题,你就不能这样做。你可以重新制作一个减去
1 | beverage = new Milk(new Espresso()); |
你必须自己提供逻辑,比如:
1 | CondimentDecorator#removeCondiment(Class <? extends CondimentDecorator>) |
让那个方法检查它是否包装了该类的调味品分解器,并直接引用包装好的饮料,绕过装饰器移除。递归调用包装的饮料,它包装的装饰器不匹配。