Sobes.tech
Middle

Mi az a dekorátor?

sobes.tech MI

Válasz az MI-től

Dekorátor egy strukturális tervezési minta, amely lehetővé teszi, hogy dinamikusan adjunk hozzá új viselkedést az objektumokhoz, speciális dekorátor objektumokba csomagolva őket.

Fő elvek:

  • Kompozíció a öröklés helyett. A dekorátor kibővíti az objektum funkcionalitását anélkül, hogy megváltoztatná annak osztályát vagy öröklődést alkalmazna.
  • Rugalmasság. Lehetővé teszi az objektum feladatai hozzáadását vagy eltávolítását futás közben.
  • Kompatibilitás. A dekorátorok és a becsomagolt objektumok közös interfésszel rendelkeznek, így egymással helyettesíthetők.

Struktúra:

  • Komponens (Component): Interfész az objektumok számára, amelyekhez dinamikusan hozzáadhatók új feladatok.
  • Konkrét komponens (ConcreteComponent): A Komponens implementációja.
  • Dekorátor (Decorator): Absztrakt osztály vagy interfész, amely kibővíti a Komponens-t, és tartalmaz egy hivatkozást a Komponens objektumra.
  • Konkrét dekorátorok (Concrete Decorators): A Dekorátor megvalósításai, amelyek konkrét viselkedést adnak hozzá.

Példa (Python):

// Komponens interfész
class Coffee:
    def get_cost(self):
        pass

    def get_description(self):
        pass

// Konkrét komponens
class SimpleCoffee(Coffee):
    def get_cost(self):
        return 1.0

    def get_description(self):
        return "Egyszerű kávé"

// Alap dekorátor
class CoffeeDecorator(Coffee):
    def __init__(self, decorated_coffee):
        self._decorated_coffee = decorated_coffee

    def get_cost(self):
        return self._decorated_coffee.get_cost()

    def get_description(self):
        return self._decorated_coffee.get_description()

// Konkrét dekorátor (Tej)
class MilkDecorator(CoffeeDecorator):
    def get_cost(self):
        return self._decorated_coffee.get_cost() + 0.5

    def get_description(self):
        return self._decorated_coffee.get_description() + ", Tej"

// Használat
coffee = SimpleCoffee()
print(f"{coffee.get_description()}: ${coffee.get_cost()}") # Egyszerű kávé: 1.0 dollár

coffee_with_milk = MilkDecorator(coffee)
print(f"{coffee_with_milk.get_description()}: ${coffee_with_milk.get_cost()}") # Egyszerű kávé, Tej: 1.5 dollár

Előnyök:

  • Rugalmasabb módja az objektumok funkcionalitásának bővítésének, mint az öröklődés.
  • Elkerüli az öröklődéshez kapcsolódó alosztályok növekedését.
  • Lehetővé teszi több "réteg" viselkedés hozzáadását egy objektumhoz.

Hátrányok:

  • Bonyolíthatja a kódot sok apró objektum miatt.
  • A becsomagolás sorrendje számítógépes lehet.

Alkalmazás QA / Automatizálás terén:

  • Naplózás hozzáadása meglévő metódusokhoz anélkül, hogy módosítanánk azok eredeti kódját.
  • Kivételkezelés megvalósítása bizonyos hívásokhoz.
  • Időzítés vagy teljesítménymutatók hozzáadása.
  • Könyvtárak használata teszt automatizálásban (pl. Page Object mintában ellenőrzések vagy naplózás hozzáadása az elemekkel való interakció során).