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