Decorator-Methode, ein Decorator-Typ in Java

Ich bin gerade dabei, das Dekorationsmuster zu erlernen, und bin auf ein Problem gestoßen, das meiner Meinung nach einfach ist, auf das ich jedoch keine Antwort zu finden scheint. Angenommen, ich habe eine Getränkeklasse, die abstrakt ist. Nehmen wir an, ich habe ein paar konkrete Komponenten, die Beverage erweitern: Americano, Espresso, Latte usw. Und auch eine abstrakte Condiment-Klasse, die Beverage erweitert. Die Klasse Gewürze hat dann mehrere Unterklassen: Milch, Zucker, Soja, Peitsche. Jede der Gewürzunterklassen hat eine cost- und eine getdescription () -Methode, die von Beverage bzw. Condiments geerbt wurden. Meine Frage ist, wie ich verhindern kann, dass eine bestimmte Getränkeinstanz beim Testen mehr als ein Gewürz des gleichen Typs enthält, d. H. Ein Amerikaner wird nur einmal für Soja belastet, auch wenn in der Testklasse zweimal Soja angegeben wurde. Ich weiß, dass ich ein Gewürz in einer Liste speichern und prüfen kann, ob es vorhanden ist, wenn ich ein neues Gewürz hinzufüge. Ich wollte nur herausfinden, ob es eine bessere Option gibt.

Getränkeklasse

public abstract class Beverage {

    String description = "Unknown Beverage";

    public String getDescription() {
        return description;
    }

    public abstract double cost();

}

Würze-Dekorateur

public abstract class CondimentDecorator extends Beverage {

    public abstract String getDescription();

}

DarkRoast-Klasse

public class DarkRoast extends Beverage {

    public DarkRoast() {
        description = "Dark Roast Coffee";
    }

    public double cost() {
        return .99;
    }

}

Soja Klasse

public class Soy extends CondimentDecorator {

    Beverage beverage;

    public Soy(Beverage beverage) {
        this.beverage = beverage;
    }

    public String getDescription() {
        return beverage.getDescription() + ", Soy";
    }

    public double cost() {
        return .15 + beverage.cost();
    }

}

Wenn jemand mir helfen oder mich auf einen guten Artikel oder ein Tutorial hinweisen könnte, würde ich es sehr schätzen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage