Middle
Kas ir dekorators?
sobes.tech AI
Atbilde no AI
Dekorators ir struktūras dizaina šablons, kuris leidžia dinamiškai pridėti naują elgesį objektams, juos apvyniojant specialiais dekoratoriaus objektais.
Pagrindiniai principai:
- Kompozicija vietoj paveldėjimo. Dekoratorius išplečia objekto funkcionalumą, nekeisdamas jo klasės ir nenaudodamas paveldėjimo.
- Lankstumas. Leidžia pridėti arba pašalinti objekto užduotis vykdymo metu.
- Suderinamumas. Dekoratoriai ir apvynioti objektai turi bendrą sąsają, leidžiančią juos keisti vienas kitu.
Struktūra:
- Komponentas (Component): Sąsaja objektams, kuriems galima dinamiškai pridėti naujų užduočių.
- Konkrečios komponentas (ConcreteComponent): Komponento įgyvendinimas.
- Dekoratorius (Decorator): Abstrakti klasė arba sąsaja, kuri išplečia komponentą ir turi nuorodą į komponento objektą.
- Konkrečios dekoratoriai (Concrete Decorators): Dekoratoriaus įgyvendinimai, pridedantys konkretų elgesį.
Pavyzdys (Python):
// Komponento sąsaja
class Coffee:
def get_cost(self):
pass
def get_description(self):
pass
// Konkrečios komponentas
class SimpleCoffee(Coffee):
def get_cost(self):
return 1.0
def get_description(self):
return "Vienkārša kafija"
// Pagrindinis dekoratorius
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()
// Konkrečios dekoratorius (Pienas)
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() + ", Pienas"
// Naudojimas
coffee = SimpleCoffee()
print(f"{coffee.get_description()}: ${coffee.get_cost()}") # Vienkārša kafija: 1.0
coffee_with_milk = MilkDecorator(coffee)
print(f"{coffee_with_milk.get_description()}: ${coffee_with_milk.get_cost()}") # Vienkārša kafija, Pienas: 1.5
Privalumai:
- Labai lankstus būdas išplėsti objektų funkcionalumą nei paveldėjimas.
- Vengia paveldėjimo susijusių pogrupių augimo.
- Leidžia pridėti kelis "sluoksnius" elgesio vienam objektui.
Trūkumai:
- Gali sudėtinginti kodą dėl daugybės mažų objektų.
- Apvyniojimo tvarka gali būti svarbi.
Taikymas QA / automatizavime:
- Pridėti žurnalavimą prie esamų metodų be jų šaltinio kodo keitimo.
- Įgyvendinti išimčių apdorojimą tam tikriems iškvietimams.
- Pridėti laiko matavimą ar našumo metrikas.
- Naudoti bibliotekas testų automatizavimui (pavyzdžiui, Page Object šablone, pridėti patikrinimus ar žurnalavimą sąveikaujant su elementais).