Middle
Ce este un decorator?
sobes.tech AI
Răspuns de la AI
Decoratoarele sunt un pattern structural de proiectare care permite adăugarea dinamică a unui comportament nou obiectelor, învelindu-le în obiecte decorator speciale.
Principii de bază:
- Compoziție în loc de moștenire. Decoratorul extinde funcționalitatea obiectului fără a-i modifica clasa și fără a folosi moștenirea.
- Flexibilitate. Permite adăugarea sau eliminarea responsabilităților obiectului în timpul execuției.
- Compatibilitate. Decoratorii și obiectele învelite au o interfață comună, ceea ce permite utilizarea lor în mod interschimbabil.
Structură:
- Component (Component): Interfață pentru obiecte la care se pot adăuga responsabilități dinamic.
- Component concret (ConcreteComponent): Implementarea Componentului.
- Decorator (Decorator): Clasă sau interfață abstractă care extinde Component și conține o referință la un obiect Component.
- Decoratori concreți (Concrete Decorators): Implementări ale Decoratorului care adaugă comportamente specifice.
Exemplu (Python):
// Interfața componentului
class Coffee:
def get_cost(self):
pass
def get_description(self):
pass
// Component concret
class SimpleCoffee(Coffee):
def get_cost(self):
return 1.0
def get_description(self):
return "Cafea simplă"
// Decorator de bază
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()
// Decorator concret (Lapte)
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() + ", Lapte"
// Utilizare
coffee = SimpleCoffee()
print(f"{coffee.get_description()}: ${coffee.get_cost()}") # Cafea simplă: $1.0
coffee_with_milk = MilkDecorator(coffee)
print(f"{coffee_with_milk.get_description()}: ${coffee_with_milk.get_cost()}") # Cafea simplă, Lapte: $1.5
Avantaje:
- O metodă mai flexibilă de extindere a funcționalității obiectelor decât moștenirea.
- Evită proliferarea subclaselelor legate de moștenire.
- Permite adăugarea mai multor "straturi" de comportament unui singur obiect.
Dezavantaje:
- Poate complica codul din cauza numărului mare de obiecte mici.
- Ordinea învelirii poate fi importantă.
Aplicații în QA / Automatizare:
- Adăugarea de jurnalizare la metodele existente fără a le modifica codul sursă.
- Implementarea gestionării excepțiilor pentru anumite apeluri.
- Adăugarea de temporizare sau metrici de performanță.
- Utilizarea în biblioteci de automatizare a testelor (de exemplu, în pattern-ul Page Object pentru adăugarea de verificări sau jurnalizare în timpul interacțiunii cu elementele).