Sobes.tech
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.