Middle
Mis on dekoratiiv?
sobes.tech AI
Vastus AI-lt
Dekoratsioon on struktuuriline disainimuster, mis võimaldab dünaamiliselt lisada objektidele uut käitumist, pakkides neid spetsiaalsetesse dekoratiivsetesse objektidesse.
Peamised põhimõtted:
- Kompositsioon asemel pärandumine. Dekoratsioon laiendab objekti funktsionaalsust, muutmata selle klassi ega kasutades pärandumist.
- Paindlikkus. Võimaldab lisada või eemaldada objekti ülesandeid jooksvalt.
- Ühilduvus. Dekoratsioonid ja pakitud objektid omavad ühise liidest, mis võimaldab neid vahetada.
Struktuur:
- Komponent (Component): Liides objektidele, millele saab dünaamiliselt lisada uusi ülesandeid.
- Konkreetne komponent (ConcreteComponent): Komponendi teostus.
- Dekoratsioon (Decorator): Abstraktne klass või liides, mis laiendab komponenti ja sisaldab viidet komponenti objekti.
- Konkreetne dekoratsioon (Concrete Decorators): Dekoratsiooni teostused, mis lisavad konkreetset käitumist.
Näide (Python):
// Komponendi liides
class Coffee:
def get_cost(self):
pass
def get_description(self):
pass
// Konkreetne komponent
class SimpleCoffee(Coffee):
def get_cost(self):
return 1.0
def get_description(self):
return "Lihtne kohv"
// Põhjadekoratsioon
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()
// Konkreetne dekoratsioon (Piim)
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() + ", Piim"
// Kasutamine
coffee = SimpleCoffee()
print(f"{coffee.get_description()}: ${coffee.get_cost()}") # Lihtne kohv: 1.0
coffee_with_milk = MilkDecorator(coffee)
print(f"{coffee_with_milk.get_description()}: ${coffee_with_milk.get_cost()}") # Lihtne kohv, Piim: 1.5
Eelised:
- Väga paindlik viis laiendada objektide funktsionaalsust kui pärimine.
- Vältib pärilikkusega seotud alamklasside kasvu.
- Võimaldab lisada ühe objekti jaoks mitu "kihti" käitumist.
Miinused:
- Võib keerulisemaks muuta koodi väikeste objektide suure arvu tõttu.
- Pakendamise järjekord võib olla oluline.
Rakendused QA / automatiseerimine:
- Logimise lisamine olemasolevatele meetoditele ilma nende lähtekoodi muutmata.
- Erandite töötlemise rakendamine teatud kutsumustele.
- Ajastamise või jõudlusmõõdikute lisamine.
- Raamatukogude kasutamine testide automatiseerimiseks (näiteks Page Object muster, kontrollide või logimise lisamiseks elementidega suhtlemisel).