Middle
Čo je dekorátor (Decorator)?
sobes.tech AI
Odpoveď od AI
Dekorátor je šablóna štrukturálneho návrhu, ktorá umožňuje dynamicky pridávať novú funkčnosť objektu bez zmeny jeho štruktúry. Obalí objekt a poskytuje rovnaké rozhranie ako obalovaný objekt, pričom pridáva alebo mení jeho správanie.
Hlavné prvky:
- Komponent (Component): Rozhranie alebo abstraktná trieda, ktorá definuje všeobecnú funkčnosť pre obalované objekty a dekorátory.
- Konkrétny komponent (Concrete Component): Implementácia komponentu, základný objekt, ku ktorému sa pridáva funkčnosť.
- Dekorátor (Decorator): Abstraktná trieda, ktorá implementuje rozhranie Komponentu a obsahuje odkaz na objekt Komponentu.
- Konkrétny dekorátor (Concrete Decorator): Implementácia dekorátora, ktorá pridáva špecifickú funkčnosť pred alebo po volaní metódy obalovaného objektu.
Príklad v Pythone:
# Komponent
class Coffee:
def get_cost(self):
return 5 # Základná cena kávy
def get_description(self):
return "Simple Coffee"
# Konkrétny komponent
class SimpleCoffee(Coffee):
pass
# Dekorátor
class CoffeeDecorator(Coffee):
def __init__(self, coffee):
self._coffee = coffee
def get_cost(self):
return self._coffee.get_cost()
def get_description(self):
return self._coffee.get_description()
# Konkrétny dekorátor
class MilkDecorator(CoffeeDecorator):
def get_cost(self):
return self._coffee.get_cost() + 2 # Pridanie ceny mlieka
def get_description(self):
return self._coffee.get_description() + ", Milk"
# Použitie
# simple_coffee = SimpleCoffee()
# print(f"Cost: {simple_coffee.get_cost()}, Description: {simple_coffee.get_description()}")
# coffee_with_milk = MilkDecorator(simple_coffee)
# print(f"Cost: {coffee_with_milk.get_cost()}, Description: {coffee_with_milk.get_description()}")
Výhody:
- Flexibilita: Funkčnosť sa pridáva počas behu.
- Vyhýbanie sa podtriedam: Umožňuje vyhnúť sa vytváraniu množstva podtried pre každú kombináciu správania.
- Oddelenie zodpovednosti: Každé pridanie správania je presunuté do samostatnej triedy.
Nevýhody:
- Môže zvýšiť počet tried.
- Ladenie môže byť zložitejšie kvôli reťazcu obalov.