Sobes.tech
Middle

Šta je dekorator (Decorator) u kontekstu programiranja i kako se koristi?

sobes.tech АИ

Одговор од АИ

Декоратор је структурни образац дизајна који омогућава динамичко додавање новог понашања или одговорности објектима без измене њихове структуре.

Главне идеје:

  • Обавија постојећи објекат и проширује његову функционалност.
  • Чува интерфејс објекта који се обавија, обезбеђујући заменљивост.
  • Избегава раст класа при додавању нових комбинација понашања.

Користи се:

  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()

# Конкретни декоратор А
class ConcreteDecoratorA(Decorator):
    def operation(self):
        return f"ConcreteDecoratorA({self._component.operation()})"

# Конкретни декоратор Б
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()
# Излаз:
# Пре функције
# Здраво!
# После функције