Sobes.tech
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 за добавяне на проверки или логиране при взаимодействие с елементи).