Sobes.tech
Middle

Ce este un decorator?

sobes.tech AI

Răspuns de la AI

Decoratoarele sunt un șablon structural de proiectare care permite adăugarea dinamică a noi funcționalități unui obiect, fără a-i modifica structura. Acesta învelește obiectul, oferindu-i aceeași interfață ca și obiectul învelit, dar adăugând sau modificând comportamentul său.

Elemente principale:

  • Componentă (Component): Interfață sau clasă abstractă care definește funcționalitatea comună pentru obiectele învelite și decoratori.
  • Component concret (Concrete Component): Implementarea componentei, obiectul de bază la care se adaugă funcționalitate.
  • Decorator (Decorator): Clasă abstractă care implementează interfața componentei și conține o referință la un obiect componentă.
  • Decorator concret (Concrete Decorator): Implementarea decoratorului, care adaugă funcționalitate specifică înainte sau după apelarea metodei obiectului învelit.

Exemplu în Python:

# Componentă
class Coffee:
    def get_cost(self):
        return 5 # Costul de bază al cafelei
    
    def get_description(self):
        return "Cafea simplă"

# Component concret
class SimpleCoffee(Coffee):
    pass

# Decorator
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()

# Decorator concret
class MilkDecorator(CoffeeDecorator):
    def get_cost(self):
        return self._coffee.get_cost() + 2 # Adaugă costul laptelui

    def get_description(self):
        return self._coffee.get_description() + ", Lapte"

# Utilizare
# simple_coffee = SimpleCoffee()
# print(f"Cost: {simple_coffee.get_cost()}, Descriere: {simple_coffee.get_description()}")

# cafea_cu_lapte = MilkDecorator(simple_coffee)
# print(f"Cost: {cafea_cu_lapte.get_cost()}, Descriere: {cafea_cu_lapte.get_description()}")

Avantaje:

  • Flexibilitate: Funcționalitatea poate fi adăugată în timpul execuției.
  • Evitarea subclasei: Permite evitarea creării multor subclase pentru fiecare combinație de comportamente.
  • Separarea responsabilităților: Fiecare adăugare de comportament se face într-o clasă separată.

Dezavantaje:

  • Poate crește numărul de clase.
  • Debugging-ul poate deveni mai dificil din cauza lanțului de învelișuri.