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).