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