Sobes.tech
Middle

Co je to dekorátor?

sobes.tech AI

Odpověď od AI

Dekorátor je strukturální návrhový vzor, který umožňuje dynamicky přidávat nové chování objektům tím, že je obalí speciálními dekorátory.

Hlavní principy:

  • Kompozice místo dědičnosti. Dekorátor rozšiřuje funkčnost objektu, aniž by měnil jeho třídu nebo používal dědičnost.
  • Flexibilita. Umožňuje přidávat nebo odstraňovat povinnosti objektu během běhu.
  • Kompatibilita. Dekorátory a obalované objekty mají společné rozhraní, což umožňuje jejich vzájemnou výměnu.

Struktura:

  • Komponenta (Component): Rozhraní pro objekty, ke kterým lze dynamicky přidávat nové povinnosti.
  • Konkrétní komponenta (ConcreteComponent): Implementace komponenty.
  • Dekorátor (Decorator): Abstraktní třída nebo rozhraní, které rozšiřuje komponentu a obsahuje odkaz na objekt komponenty.
  • Konkrétní dekorátory (Concrete Decorators): Implementace dekorátora, které přidávají konkrétní chování.

Příklad (Python):

// Rozhraní komponenty
class Coffee:
    def get_cost(self):
        pass

    def get_description(self):
        pass

// Konkrétní komponenta
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étní dekorátor (Mléko)
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() + ", Mléko"

// Použití
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, Mléko: 1.5

Výhody:

  • Flexibilnější způsob rozšiřování funkčnosti objektů než dědičnost.
  • Vyhýbá se růstu podtříd spojených s dědičností.
  • Umožňuje přidávat více "vrstvy" chování k jednomu objektu.

Nevýhody:

  • Může zkomplikovat kód kvůli velkému množství malých objektů.
  • Pořadí obalování může být důležité.

Použití v QA / Automatizace:

  • Přidání logování ke stávajícím metodám bez změny jejich původního kódu.
  • Implementace zpracování výjimek pro určité volání.
  • Přidání časování nebo metrik výkonu.
  • Použití knihoven pro automatizaci testování (například v patternu Page Object pro přidání kontrol nebo logování při interakci s prvky).