Sobes.tech
Middle

Šta je dekorator?

sobes.tech АИ

Одговор од АИ

Dekorator je strukturni obrazac dizajna koji omogućava dinamičko dodavanje novog ponašanja objektima, obavijajući ih u posebne dekoratore.

Glavni principi:

  • Kompozicija umesto nasleđivanja. Dekorator proširuje funkcionalnost objekta, ne menjajući njegovu klasu i ne koristeći nasleđivanje.
  • Fleksibilnost. Omogućava dodavanje ili uklanjanje obaveza objekta tokom izvršavanja.
  • Kompatibilnost. Dekoratori i obavijeni objekti imaju zajednički interfejs, što omogućava njihovu zamenu.

Struktura:

  • Komponenta (Component): Interfejs za objekte kojima se može dinamički dodavati nove obaveze.
  • Konkreta komponenta (ConcreteComponent): Implementacija Komponente.
  • Dekorator (Decorator): Apstraktna klasa ili interfejs koji proširuje Komponentu i sadrži referencu na objekat Komponente.
  • Konkreti dekoratori (Concrete Decorators): Implementacije Dekoratora, dodajući specifično ponašanje.

Primer (Python):

// Interfejs komponente
class Coffee:
    def get_cost(self):
        pass

    def get_description(self):
        pass

// Konkreta komponenta
class SimpleCoffee(Coffee):
    def get_cost(self):
        return 1.0

    def get_description(self):
        return "Jednostavna kafa"

// Osnovni dekorator
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()

// Konkreti dekorator (Mleko)
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() + ", Mleko"

// Upotreba
coffee = SimpleCoffee()
print(f"{coffee.get_description()}: ${coffee.get_cost()}") # Jednostavna kafa: 1.0

coffee_with_milk = MilkDecorator(coffee)
print(f"{coffee_with_milk.get_description()}: ${coffee_with_milk.get_cost()}") # Jednostavna kafa, Mleko: 1.5

Prednosti:

  • Fleksibilniji način proširenja funkcionalnosti objekata nego nasleđivanje.
  • Izbegava rast podklasa povezanih sa nasleđivanjem.
  • Omogućava dodavanje više "slojeva" ponašanja jednom objektu.

Nedostaci:

  • Može zakomplikovati kod zbog velikog broja malih objekata.
  • Redosled obavijanja može biti važan.

Primena u QA / Automatizacija:

  • Dodavanje logovanja postojećim metodama bez izmene njihovog izvornog koda.
  • Implementacija obrade izuzetaka za određene pozive.
  • Dodavanje tajminga ili metrika performansi.
  • Korišćenje biblioteka za automatizaciju testiranja (npr. u Patternu Page Object za dodavanje provera ili logovanja pri interakciji sa elementima).