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()
# Чыгуу:
# Мурун функция
# Салам!
# Аягында функция