Middle
Бағдарламалау контекстінде декоратор (Decorator) дегеніміз не және ол қалай пайдаланылады?
sobes.tech AI
AI-дан жауап
Декоратор — бұл құрылымдық жобалау үлгісі, ол объектілерге жаңа мінез-құлық немесе міндеттерді динамикалық түрде қосуға мүмкіндік береді, олардың құрылымын өзгертусіз.
Негізгі идеялар:
- Бар объектіні орап, оның функционалдығын кеңейтеді.
- Орап отырған объектінің интерфейсін сақтайды, өзара ауыстыруға мүмкіндік береді.
- Жаңа мінез-құлық комбинацияларын қосқанда сыныптар иерархиясының өсуін болдырмайды.
Қолданылуы:
- "Жүгіру кезінде" функционалдылықты кеңейту: Бұл, егер объектінің мінез-құлқын орындау кезінде қосу немесе өзгерту қажет болса, қолданылады.
- Мұрагерліктің орнына: Әрбір мінез-құлық комбинациясы үшін қосалқы сыныптар құру орнына, декораторлар пайдаланылады. Бұл икемдірек тәсіл.
- Мінез-құлықтарды біріктіру: Әртүрлі декораторлар бір объектіге әртүрлі тәртіпте қолданылуы мүмкін, бұл ерекше комбинациялар жасайды.
Python-да мысал:
# Негізгі компонент
class Component:
def operation(self):
pass
# Нақты компонент
class ConcreteComponent(Component):
def operation(self):
return "ConcreteComponent"
# Негізгі декоратор (орайтын объектке сілтеме сақтайды)
class Decorator(Component):
def __init__(self, component):
self._component = component
def operation(self):
return self._component.operation()
# Нақты декоратор A
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
# Нақты декоратор B
class ConcreteDecoratorB(Decorator):
def operation(self):
return f"ConcreteDecoratorB({self._component.operation()})"
# Қолдану
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-да синтаксистік қантамыр ретінде @:
def my_decorator(func):
def wrapper():
print("Функцияға дейін")
func()
print("Функциядан кейін")
return wrapper
@my_decorator
def say_hello():
print("Сәлем!")
say_hello()
# Шығу:
# Функцияға дейін
# Сәлем!
# Функциядан кейін