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()
# Изход:
# Преди функцията
# Здравей!
# След функцията