Middle
Was ist ein Decorator (Decorator)?
sobes.tech KI
Antwort von AI
Der Decorator ist ein strukturelles Entwurfsmuster, das es ermöglicht, einem Objekt dynamisch neue Funktionalitäten hinzuzufügen, ohne seine Struktur zu verändern. Es umhüllt das Objekt, wobei die gleiche Schnittstelle wie das umhüllte Objekt bereitgestellt wird, während es sein Verhalten erweitert oder ändert.
Hauptbestandteile:
- Komponente (Component): Schnittstelle oder abstrakte Klasse, die die gemeinsame Funktionalität für umhüllte Objekte und Decorators definiert.
- Konkrete Komponente (Concrete Component): Implementierung der Komponente, das Basiselement, dem Funktionalität hinzugefügt wird.
- Decorator (Decorator): Abstrakte Klasse, die die Schnittstelle der Komponente implementiert und eine Referenz auf ein Komponentenobjekt enthält.
- Konkreter Decorator (Concrete Decorator): Implementierung des Decorators, der spezifische Funktionalität vor oder nach dem Aufruf der Methode des umhüllten Objekts hinzufügt.
Beispiel in Python:
# Komponente
class Coffee:
def get_cost(self):
return 5 # Grundpreis des Kaffees
def get_description(self):
return "Einfacher Kaffee"
# Konkrete Komponente
class SimpleCoffee(Coffee):
pass
# Decorator
class CoffeeDecorator(Coffee):
def __init__(self, coffee):
self._coffee = coffee
def get_cost(self):
return self._coffee.get_cost()
def get_description(self):
return self._coffee.get_description()
# Konkreter Decorator
class MilkDecorator(CoffeeDecorator):
def get_cost(self):
return self._coffee.get_cost() + 2 # Fügt die Milchkosten hinzu
def get_description(self):
return self._coffee.get_description() + ", Milch"
# Verwendung
# simple_coffee = SimpleCoffee()
# print(f"Kosten: {simple_coffee.get_cost()}, Beschreibung: {simple_coffee.get_description()}")
# coffee_with_milk = MilkDecorator(simple_coffee)
# print(f"Kosten: {coffee_with_milk.get_cost()}, Beschreibung: {coffee_with_milk.get_description()}")
Vorteile:
- Flexibilität: Funktionalität kann zur Laufzeit hinzugefügt werden.
- Vermeidung von Unterklassen: Es wird vermieden, viele Unterklassen für jede Verhaltenskombination zu erstellen.
- Aufgabentrennung: Jede Hinzufügung von Verhalten erfolgt in einer eigenen Klasse.
Nachteile:
- Kann die Anzahl der Klassen erhöhen.
- Das Debuggen kann durch die Kette der Umhüllungen erschwert werden.