关于Java:如何从对象中删除装饰器?

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。

  • 现在,咖啡用摩卡和牛奶装饰。

  • 突然间,顾客想用鞭子代替摩卡。


  • 如果不写一个定制的装饰器来处理这个问题,你就不能这样做。你可以重新制作一个减去Mocha装饰器的饮料,而不是去掉装饰器。

    1
    beverage = new Milk(new Espresso());

    你必须自己提供逻辑,比如:

    1
    CondimentDecorator#removeCondiment(Class <? extends CondimentDecorator>)

    让那个方法检查它是否包装了该类的调味品分解器,并直接引用包装好的饮料,绕过装饰器移除。递归调用包装的饮料,它包装的装饰器不匹配。