Middle
Mi az a dekorátor (Decorator)?
sobes.tech MI
Válasz az MI-től
A dekorátor egy strukturális tervezési minta, amely lehetővé teszi, hogy dinamikusan új funkcionalitásokat adjunk egy objektumhoz anélkül, hogy megváltoztatnánk annak szerkezetét. Körülveszi az objektumot, ugyanazt az interfészt biztosítva, mint a körülvett objektum, miközben hozzáad vagy módosítja annak viselkedését.
Fő elemek:
- Komponens (Component): Interfész vagy absztrakt osztály, amely meghatározza az általános funkcionalitást a körülvett objektumok és dekorátorok számára.
- Konkrét komponens (Concrete Component): A komponens megvalósítása, az alapobjektum, amelyhez funkcionalitás adható.
- Dekorátor (Decorator): Absztrakt osztály, amely megvalósítja a komponens interfészét és tartalmaz egy hivatkozást egy komponens objektumra.
- Konkrét dekorátor (Concrete Decorator): A dekorátor megvalósítása, amely specifikus funkcionalitást ad hozzá az adott metódus hívása előtt vagy után.
Példa Pythonban:
# Komponens
class Coffee:
def get_cost(self):
return 5 # Alapár
def get_description(self):
return "Egyszerű kávé"
# Konkrét komponens
class SimpleCoffee(Coffee):
pass
# Dekorátor
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()
# Konkrét dekorátor
class MilkDecorator(CoffeeDecorator):
def get_cost(self):
return self._coffee.get_cost() + 2 # A tej költségének hozzáadása
def get_description(self):
return self._coffee.get_description() + ", Tej"
# Használat
# simple_coffee = SimpleCoffee()
# print(f"Költség: {simple_coffee.get_cost()}, Leírás: {simple_coffee.get_description()}")
# tejjel ellátott kávé = MilkDecorator(simple_coffee)
# print(f"Költség: {tejjel ellátott kávé.get_cost()}, Leírás: {tejjel ellátott kávé.get_description()}")
Előnyök:
- Rugalmasság: A funkcionalitás futásidőben adható hozzá.
- Alosztályok elkerülése: Elkerülhető, hogy minden viselkedés kombinációjára külön alosztályt hozzunk létre.
- Felelősségek szétválasztása: Minden viselkedés hozzáadása külön osztályban történik.
Hátrányok:
- Növelheti az osztályok számát.
- A hibakeresés bonyolultabb lehet a burkoló lánc miatt.