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