Sobes.tech
Middle

Программалоо контекстинде декоратор (Decorator) эмне жана ал кандай колдонулат?

sobes.tech AI

AIден жооп

Декоратор — бул структуралык дизайн үлгүсү, ал динамикалык түрдө жаңы жүрүм-турумду же милдеттерди объекттерге кошууга мүмкүндүк берет, алардын түзүмүн өзгөртпөстөн.

Негизги идеялар:

  • Бар объектти каптайт, анын функционалдуулугун кеңейтет.
  • Капталган объекттин интерфейсин сактайт, алмаштырылуучулукка кепилдик берет.
  • Жаңы жүрүм-турумдун комбинацияларын кошууда класстардын хиерархиясынын өсүшүн алдын алат.

Колдонуу:

  1. "Жүрүштүн учунда" кеңейтүү: программаны иштетүү учурунда объекттин жүрүм-турумун кошуу же өзгөртүү керек болгондо колдонулат.
  2. Мураскорлуктун ордуна: ар бир жүрүм-турумдун комбинациясы үчүн подкласс түзүүнүн ордуна, декораторлор колдонулат. Бул көбүрөөк ийкемдүү ыкма.
  3. Жүрүм-турумдардын айкалышы: ар түрдүү декораторлор бир эле объектке ар башка тартипте колдонулушу мүмкүн, уникалдуу комбинациялар түзүү үчүн.

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