Middle
Какво е декоратор?
sobes.tech AI
Отговор от AI
Декораторът е структурен шаблон за дизайн, който позволява динамично добавяне на ново поведение към обекти, като ги обвива в специални декораторски обекти.
Основни принципи:
- Композиция вместо наследяване. Декораторът разширява функционалността на обекта, без да променя неговия клас или да използва наследяване.
- Гъвкавост. Позволява добавяне или премахване на задължения на обекта по време на изпълнение.
- Съвместимост. Декораторите и обвитите обекти имат общ интерфейс, което позволява тяхната взаимна замяна.
Структура:
- Компонент (Component): Интерфейс за обекти, към които може динамично да се добавят нови задължения.
- Конкретен компонент (ConcreteComponent): Реализация на компонента.
- Декоратор (Decorator): Абстрактен клас или интерфейс, който разширява компонента и съдържа препратка към обекта компонента.
- Конкретни декоратори (Concrete Decorators): Реализации на декоратора, които добавят конкретно поведение.
Пример (Python):
// Интерфейс на компонента
class Coffee:
def get_cost(self):
pass
def get_description(self):
pass
// Конкретен компонент
class SimpleCoffee(Coffee):
def get_cost(self):
return 1.0
def get_description(self):
return "Проста кафе"
// Базов декоратор
class CoffeeDecorator(Coffee):
def __init__(self, decorated_coffee):
self._decorated_coffee = decorated_coffee
def get_cost(self):
return self._decorated_coffee.get_cost()
def get_description(self):
return self._decorated_coffee.get_description()
// Конкретен декоратор (Мляко)
class MilkDecorator(CoffeeDecorator):
def get_cost(self):
return self._decorated_coffee.get_cost() + 0.5
def get_description(self):
return self._decorated_coffee.get_description() + ", Мляко"
// Използване
coffee = SimpleCoffee()
print(f"{coffee.get_description()}: ${coffee.get_cost()}") # Проста кафе: 1.0
coffee_with_milk = MilkDecorator(coffee)
print(f"{coffee_with_milk.get_description()}: ${coffee_with_milk.get_cost()}") # Проста кафе, Мляко: 1.5
Предимства:
- По-гъвкав начин за разширяване на функционалността на обектите, отколкото наследяването.
- Избягва разрастването на подкласове, свързани с наследяване.
- Позволява добавяне на няколко "слоя" поведение към един обект.
Недостатъци:
- Може да усложни кода поради голям брой малки обекти.
- Поредността на обвиване може да има значение.
Приложение в QA / автоматизация:
- Добавяне на логиране към съществуващи методи без промяна на техния оригинален код.
- Реализиране на обработка на изключения за определени извиквания.
- Добавяне на тайминг или метрики за производителност.
- Използване на библиотеки за автоматизация на тестове (например, в патърна Page Object за добавяне на проверки или логиране при взаимодействие с елементи).