How do I remove a decorator from an object?
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; } } ...
there is more decorator like Milk .. Soy .. etc. and coffee like HouseBlend .. etc.
If I had a Mocha Milk decorator on an object, I only want to remove the "Mocha" decorator.
Beverage beverage = new Mocha(new Espresso());
beverage = new Milk(beverage);
EDIT: script
-
The customer added an Expresso with mocha and milk.
-
Now Expresso is decorated with mocha and milk.
-
Suddenly the client wants to replace the mocha with a Whip.
+3
source to share
2 answers
You will need to provide logic for yourself, something like:
CondimentDecorator#removeCondiment(Class <? extends CondimentDecorator>)
this method checks if it terminates the CondimentDecorator of this class and references the packaged beverage directly, bypassing the remove decorator. Calling recursively on a wrapped drink that it wrapped with a decorator does not match.
+1
source to share