Middle
Kas yra dekoratorius (Decorator) programavimo kontekste ir kaip jis naudojamas?
sobes.tech AI
Atsakymas iš AI
Dekoratorius yra struktūrinis projektavimo šablonas, leidžiantis dinamiškai pridėti naują elgseną arba pareigas objektams be jų struktūros keitimo.
Pagrindinės idėjos:
- Apvynioja esamą objektą, išplečiant jo funkcionalumą.
- Išlaiko apvyniojamo objekto sąsają, užtikrindamas keičiamumą.
- Vengia klasių hierarchijos augimo pridedant naujas elgsenų kombinacijas.
Naudojimas:
- Funkcionalumo "gyvai" išplėtimas: taikomas, kai reikia pridėti arba keisti objekto elgseną programos vykdymo metu.
- Paveldėjimo alternatyva: vietoj kiekvienos elgsenos kombinacijos sukuriant pogrupius, naudojami dekoratoriai. Tai lankstesnis požiūris.
- Elgsenų derinimas: skirtingi dekoratoriai gali būti taikomi vienam ir tam pačiam objektui skirtingais būdais, sukuriant unikalius derinius.
Pavyzdys Python kalba:
# Pagrindinis komponentas
class Component:
def operation(self):
pass
# Konkretus komponentas
class ConcreteComponent(Component):
def operation(self):
return "ConcreteComponent"
# Pagrindinis dekoratorius (laiko nuorodą į apvyniojamo objekto)
class Decorator(Component):
def __init__(self, component):
self._component = component
def operation(self):
return self._component.operation()
# Konkretus dekoratorius A
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
# Konkretus dekoratorius B
class ConcreteDecoratorB(Decorator):
def operation(self):
return f"ConcreteDecoratorB({self._component.operation()})"
# Naudojimas
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))
Python kalboje @ sintaksės cukrus:
def my_decorator(func):
def wrapper():
print("Iki funkcijos")
func()
print("Po funkcijos")
return wrapper
@my_decorator
def say_hello():
print("Labas!")
say_hello()
# Išvestis:
# Iki funkcijos
# Labas!
# Po funkcijos