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.