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