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()
# Выхад:
# Да функцыі
# Прывітанне!
# Пасля функцыі