Middle
Mis on dekoratsioon (Decorator) programmeerimise kontekstis ja kuidas seda kasutatakse?
sobes.tech AI
Vastus AI-lt
Dekoratiiv on struktuuriline disainimuster, mis võimaldab dünaamiliselt lisada objekti käitumist või kohustusi ilma nende struktuuri muutmata.
Peamised ideed:
- Kattub olemasoleva objekti, laiendades selle funktsionaalsust.
- Säilitab kattuva objekti liidese, tagades vahetatavuse.
- Vältib klassihierarhia kasvamist uute käitumise kombinatsioonide lisamisel.
Kasutamine:
- Funktsionaalsuse "elus" laiendamine: kasutatakse, kui on vaja lisada või muuta objekti käitumist programmi täitmise ajal.
- Päriluse alternatiiv: asemel, et luua iga käitumise kombinatsiooni jaoks alamklasse, kasutatakse dekoraatoreid. See on paindlikum lähenemine.
- Käitumiste kombineerimine: erinevad dekoratsioonid võivad olla rakendatud samale objekti erinevas järjekorras, luues unikaalseid kombinatsioone.
Näide Pythonis:
# Põhikomponent
class Component:
def operation(self):
pass
# Konkreetne komponent
class ConcreteComponent(Component):
def operation(self):
return "ConcreteComponent"
# Põhiline dekoratsioon (hoiab viidet kattuvale objekti)
class Decorator(Component):
def __init__(self, component):
self._component = component
def operation(self):
return self._component.operation()
# Konkreetne dekoratsioon A
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
# Konkreetne dekoratsioon B
class ConcreteDecoratorB(Decorator):
def operation(self):
return f"ConcreteDecoratorB({self._component.operation()})"
# Kasutamine
simple = ConcreteComponent()
print(simple.operation()) # ConcreteComponent
decorated_a = ConcreteDecoratorA(simple)
print(decorated_a.operation()) # ConcreteDecoratorA(ConcreteComponent)
decorated_b_a = ConcreteDecoratorB(decorated_a)
print(decorated_b_a.operation()) # ConcreteDecoratorB(ConcreteDecoratorA(ConcreteComponent))
Pythonis @ süntaksisuhkur:
def my_decorator(func):
def wrapper():
print("Enne funktsiooni")
func()
print("Pärast funktsiooni")
return wrapper
@my_decorator
def say_hello():
print("Tere!")
say_hello()
# Väljund:
# Enne funktsiooni
# Tere!
# Pärast funktsiooni