Middle
Šta je dekorator (Decorator)?
sobes.tech АИ
Одговор од АИ
Декоратор је структурни образац дизајна који омогућава динамичко додавање нових функционалности објекту, без промене његове структуре. Он обавија објекат, пружајући исти интерфејс као и објекат који обавија, али додаје или мења његово понашање.
Главни елементи:
- Компонента (Component): Интерфејс или апстрактна класа која дефинише заједничку функционалност за објекте који се обавијају и декораторе.
- Конкретна компонента (Concrete Component): Имплементација компоненте, основни објекат којем се додаје функционалност.
- Декоратор (Decorator): Апстрактна класа која имплементира интерфејс компонете и садржи референцу на објекат компонете.
- Конкретни декоратор (Concrete Decorator): Имплементација декоратора који додаје специфичну функционалност пре или после позива методе обавијеног објекта.
Пример у Python-у:
# Компонента
class Coffee:
def get_cost(self):
return 5 # Основна цена кафе
def get_description(self):
return "Једноставна кафа"
# Конкретна компонента
class SimpleCoffee(Coffee):
pass
# Декоратор
class CoffeeDecorator(Coffee):
def __init__(self, coffee):
self._coffee = coffee
def get_cost(self):
return self._coffee.get_cost()
def get_description(self):
return self._coffee.get_description()
# Конкретни декоратор
class MilkDecorator(CoffeeDecorator):
def get_cost(self):
return self._coffee.get_cost() + 2 # Додаје цену млека
def get_description(self):
return self._coffee.get_description() + ", Млеко"
# Коришћење
# simple_coffee = SimpleCoffee()
# print(f"Цена: {simple_coffee.get_cost()}, Опис: {simple_coffee.get_description()}")
# кафа са млеком = MilkDecorator(simple_coffee)
# print(f"Цена: {кафа са млеком.get_cost()}, Опис: {кафа са млеком.get_description()}")
Предности:
- Флексибилност: Функционалност се додаје током извршавања.
- Избегавање подкласа: Омогућава избегавање стварања многих подкласа за сваки комбиновани понашање.
- Раздвајање одговорности: Свако додавање понашања реализује се у посебној класи.
Недостаци:
- Може повећати број класа.
- Дебаговање може постати тежи због ланца обвијања.