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