Middle
Kas ir dekorators (Decorator) programmēšanas kontekstā un kā tas tiek izmantots?
sobes.tech AI
Atbilde no AI
Dekorators ir struktūras dizaina paraugs, kas ļauj dinamiski pievienot jaunu uzvedību vai pienākumus objektiem bez to struktūras modifikācijas.
Galvenās idejas:
- Ietin esošo objektu, paplašinot tā funkcionalitāti.
- Saglabā ietīto objekta interfeisu, nodrošinot aizvietojamību.
- Novērš klases hierarhijas pieaugumu, pievienojot jaunas uzvedības kombinācijas.
Izmantošana:
- Funkcionalitātes "uz vietas" paplašināšana: tiek izmantots, kad nepieciešams pievienot vai mainīt objekta uzvedību programmas izpildes laikā.
- Mantošanas alternatīva: vietā, lai izveidotu apakšklases katrai uzvedības kombinācijai, tiek izmantoti dekoratori. Tas ir elastīgāks pieejas veids.
- Uzvedības kombinācija: dažādi dekoratori var tikt piemēroti vienam un tam pašam objektam dažādā secībā, radot unikālas kombinācijas.
Piemērs Python:
# Bāzes komponenta
class Component:
def operation(self):
pass
# Konkrēts komponenta
class ConcreteComponent(Component):
def operation(self):
return "ConcreteComponent"
# Bāzes dekorators (glabā atsauci uz ietīto objektu)
class Decorator(Component):
def __init__(self, component):
self._component = component
def operation(self):
return self._component.operation()
# Konkrēts dekorators A
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
# Konkrēts dekorators B
class ConcreteDecoratorB(Decorator):
def operation(self):
return f"ConcreteDecoratorB({self._component.operation()})"
# Lietošana
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 @ sintakses cukurs:
def my_decorator(func):
def wrapper():
print("Pirms funkcijas")
func()
print("Pēc funkcijas")
return wrapper
@my_decorator
def say_hello():
print("Sveiki!")
say_hello()
# Izvade:
# Pirms funkcijas
# Sveiki!
# Pēc funkcijas