Middle
Čo je to dekorátor?
sobes.tech AI
Odpoveď od AI
Dekorátor je štrukturálny návrhový vzor, ktorý umožňuje dynamicky pridávať nové správanie objektom obalením ich do špeciálnych dekorátorov.
Hlavné princípy:
- Kompozícia namiesto dedičnosti. Dekorátor rozširuje funkčnosť objektu, nemení jeho triedu a nevyužíva dedičnosť.
- Flexibilita. Umožňuje pridávať alebo odstraňovať povinnosti objektu počas behu.
- Kompatibilita. Dekorátory a obalované objekty majú spoločné rozhranie, čo umožňuje ich vzájomnú výmenu.
Štruktúra:
- Komponent (Component): Rozhranie pre objekty, ku ktorým je možné dynamicky pridávať nové povinnosti.
- Konkrétny komponent (ConcreteComponent): Implementácia komponentu.
- Dekorátor (Decorator): Abstraktná trieda alebo rozhranie, ktoré rozširuje komponent a obsahuje odkaz na objekt komponentu.
- Konkrétne dekorátory (Concrete Decorators): Implementácie dekorátora, ktoré pridávajú konkrétne správanie.
Príklad (Python):
// Rozhranie komponentu
class Coffee:
def get_cost(self):
pass
def get_description(self):
pass
// Konkrétny komponent
class SimpleCoffee(Coffee):
def get_cost(self):
return 1.0
def get_description(self):
return "Jednoduchá káva"
// Základný 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étny dekorátor (Mlieko)
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() + ", Mlieko"
// Použitie
coffee = SimpleCoffee()
print(f"{coffee.get_description()}: ${coffee.get_cost()}") # Jednoduchá káva: 1.0
coffee_with_milk = MilkDecorator(coffee)
print(f"{coffee_with_milk.get_description()}: ${coffee_with_milk.get_cost()}") # Jednoduchá káva, Mlieko: 1.5
Výhody:
- Flexibilnejší spôsob rozširovania funkčnosti objektov ako dedičstvo.
- Vyhýba sa rastu podtried spojených s dedičstvom.
- Umožňuje pridávať viac "vrstiev" správania k jednému objektu.
Nevýhody:
- Môže zkomplikovať kód kvôli veľkému množstvu malých objektov.
- Poradie obalovania môže byť dôležité.
Použitie v QA / Automatizácia:
- Pridanie logovania k existujúcim metódam bez zmeny ich pôvodného kódu.
- Implementácia spracovania výnimiek pre určité volania.
- Pridanie časovania alebo metrík výkonu.
- Použitie knižníc na automatizáciu testovania (napríklad v patternu Page Object na pridanie kontrol alebo logovania pri interakcii s prvkami).