Декоратор (Decorator) :: Cетевой уголок Majestio

Декоратор (Decorator)


Декоратор — это структурный паттерн проектирования, который позволяет динамически добавлять объектам новую функциональность, оборачивая их в полезные «обёртки».

Применимость

Подробнее на 👉 refactoring.guru

UML-диаграмма

Пример реализации

#include <iostream>
#include <string>

// Интерфейс для строительства автомобилей
class CarBuilder {
 public:
  virtual std::string buildCar() = 0;
};

// Конкретная реализация строителя автомобилей
class BasicCarBuilder : public CarBuilder {
 public:
  std::string buildCar() { return "Строим базовую модель автомобиля"; }
};

// Базовый декоратор
class CarDecorator : public CarBuilder {
 protected:
  CarBuilder* carBuilder;

 public:
  CarDecorator(CarBuilder* builder) : carBuilder(builder) {}

  std::string buildCar() { return carBuilder->buildCar(); }
};

// Конкретный декоратор для добавления функциональности к автомобилю
class SportPackageDecorator : public CarDecorator {
 public:
  SportPackageDecorator(CarBuilder* builder) : CarDecorator(builder) {}

  std::string buildCar() {
    std::string car = carBuilder->buildCar();
    return car + ", добавляем спортивный пакет";
  }
};

int main() {
  CarBuilder* basicBuilder = new BasicCarBuilder();
  std::cout << basicBuilder->buildCar() << std::endl;

  CarBuilder* sportPackageBuilder = new SportPackageDecorator(basicBuilder);
  std::cout << sportPackageBuilder->buildCar() << std::endl;

  delete basicBuilder;
  delete sportPackageBuilder;

  return 0;
}
Будет напечатано:
Строим базовую модель автомобиля
Строим базовую модель автомобиля, добавляем спортивный пакет
abstract class CarBuilder {
  String buildCar();
}

class BasicCarBuilder implements CarBuilder {
  String buildCar() {
    return "Строим базовую модель автомобиля";
  }
}

abstract class CarDecorator implements CarBuilder {
  CarBuilder carBuilder;

  CarDecorator(this.carBuilder);

  String buildCar() {
    return carBuilder.buildCar();
  }
}

class SportPackageDecorator extends CarDecorator {
  SportPackageDecorator(CarBuilder carBuilder) : super(carBuilder);

  String buildCar() {
    String car = carBuilder.buildCar();
    return car + ", добавляем спортивный пакет";
  }
}

void main() {
  CarBuilder basicBuilder = BasicCarBuilder();
  print(basicBuilder.buildCar());

  CarBuilder sportPackageBuilder = SportPackageDecorator(basicBuilder);
  print(sportPackageBuilder.buildCar());
}
Будет напечатано:
Строим базовую модель автомобиля
Строим базовую модель автомобиля, добавляем спортивный пакет
Рейтинг: 0/5 - 0 голосов