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()
# Шығу:
# Функцияға дейін
# Сәлем!
# Функциядан кейін