Подробнее на 👉 refactoring.guru
#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());
}
Будет напечатано:
Строим базовую модель автомобиля Строим базовую модель автомобиля, добавляем спортивный пакет