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