Menu
Coddy logo textTech

Decorator-Muster

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 96 von 110.

Das Decorator-Pattern ermöglicht es Ihnen, Objekten dynamisch neue Verhaltensweisen hinzuzufügen, indem Sie diese in spezielle Objekte, sogenannte Decorator, einhüllen. Im Gegensatz zur Vererbung, die Verhalten zur Kompilierzeit hinzufügt, hängen Decorator zusätzliche Verantwortlichkeiten zur Laufzeit an, ohne die ursprüngliche Klasse zu verändern.

Die Kernidee ist, dass sowohl das ursprüngliche Objekt als auch Dekoratoren dieselbe Schnittstelle implementieren.

Ein Decorator umhüllt das ursprüngliche Objekt, delegiert an dieses und fügt davor oder danach eigenes Verhalten hinzu:

abstract class Coffee {
  String getDescription();
  double getCost();
}

class SimpleCoffee implements Coffee {
  @override
  String getDescription() => 'Simple Coffee';

  @override
  double getCost() => 2.0;
}

class MilkDecorator implements Coffee {
  final Coffee _coffee;
  MilkDecorator(this._coffee);

  @override
  String getDescription() => '${_coffee.getDescription()}, Milk';

  @override
  double getCost() => _coffee.getCost() + 0.5;
}

class SugarDecorator implements Coffee {
  final Coffee _coffee;
  SugarDecorator(this._coffee);

  @override
  String getDescription() => '${_coffee.getDescription()}, Sugar';

  @override
  double getCost() => _coffee.getCost() + 0.2;
}

void main() {
  Coffee coffee = SimpleCoffee();
  coffee = MilkDecorator(coffee);
  coffee = SugarDecorator(coffee);

  print(coffee.getDescription());  // Simple Coffee, Milk, Sugar
  print(coffee.getCost());         // 2.7
}

Jeder Decorator umhüllt das vorherige Objekt und erweitert es. Sie können mehrere Decorator in beliebiger Kombination stapeln und so ein flexibles Verhalten erzeugen, ohne für jede mögliche Kombination eine Unterklasse erstellen zu müssen. Dieses Muster ist ideal, wenn Sie Objekten Funktionen hinzufügen müssen, ohne andere Objekte derselben Klasse zu beeinflussen.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Pizza-Bestellsystem mithilfe des Decorator-Musters! Du erstellst eine Basispizza, die mit verschiedenen Belägen erweitert werden kann, wobei jeder Belag das vorherige Element umschließt und sowohl die Beschreibung als auch den Preis ergänzt.

Du organisierst deinen Code in zwei Dateien:

  • pizza.dart: Diese Datei enthält deine Pizza-Schnittstelle und alle Decorator-Klassen. Beginne mit einer abstrakten Klasse Pizza, die zwei Methoden definiert: String getDescription() und double getPrice(). Erstelle anschließend eine Klasse PlainPizza, die Pizza implementiert – sie gibt Plain Pizza als Beschreibung zurück und kostet 8.0. Erstelle nun drei Decorator-Klassen, die jeweils eine Pizza umschließen und erweitern:
    • CheeseDecorator – fügt der Beschreibung , Cheese und dem Preis 1.5 hinzu
    • PepperoniDecorator – fügt der Beschreibung , Pepperoni und dem Preis 2.0 hinzu
    • MushroomDecorator – fügt der Beschreibung , Mushrooms und dem Preis 1.25 hinzu
    Jeder Decorator sollte Pizza implementieren, eine Pizza in seinem Konstruktor akzeptieren und an die umschlossene Pizza delegieren, bevor er seinen eigenen Beitrag hinzufügt.
  • main.dart: Importiere deine Pizzadatei und zeige, wie Decorators kombiniert werden, um eine individuelle Bestellung zu erstellen. Beginne mit einer PlainPizza, umschließe sie dann mit CheeseDecorator, umschließe diese anschließend mit PepperoniDecorator und umschließe schließlich alles mit MushroomDecorator. Gib die Beschreibung der fertigen Pizza aus und gib anschließend Total: $ gefolgt vom Preis aus.

Beachte, wie jeder Decorator auf dem vorherigen aufbaut – du erstellst eine vollständig belegte Pizza, indem du einfache Decorators mit jeweils einer einzigen Verantwortung kombinierst!

Erwartete Ausgabe:

Plain Pizza, Cheese, Pepperoni, Mushrooms
Total: $12.75

Probier es selbst

import 'pizza.dart';

void main() {
  // TODO: Erstelle eine PlainPizza
  
  // TODO: Umhülle sie mit CheeseDecorator
  
  // TODO: Umhülle das mit PepperoniDecorator
  
  // TODO: Umhülle alles mit MushroomDecorator
  
  // TODO: Gib die Beschreibung der fertigen Pizza aus
  
  // TODO: Gib "Total: $" gefolgt vom Preis aus
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Dart-Compiler