Компоновщик (Composite) :: Cетевой уголок Majestio

Компоновщик (Composite)


Компоновщик — это структурный паттерн проектирования, который позволяет сгруппировать множество объектов в древовидную структуру, а затем работать с ней так, как будто это единичный объект.

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

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

UML-диаграмма

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

#include <iostream>
#include <string>
#include <vector>

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

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

// Компоновщик для объединения нескольких строителей
class CarBuilderComposite : public CarBuilder {
private:
    std::vector<CarBuilder*> builders;

public:
    void addBuilder(CarBuilder* builder) {
        builders.push_back(builder);
    }

    void build() {
        for (auto builder : builders) {
            builder->build();
        }
    }
};

int main() {
    BasicCarBuilder sedanBuilder;
    BasicCarBuilder suvBuilder;
    BasicCarBuilder sportsCarBuilder;

    CarBuilderComposite carProductionLine;
    carProductionLine.addBuilder(&sedanBuilder);
    carProductionLine.addBuilder(&suvBuilder);
    carProductionLine.addBuilder(&sportsCarBuilder);

    carProductionLine.build();

    return 0;
}
Будет напечатано:
Строим базовую модель автомобиля
Строим базовую модель автомобиля
Строим базовую модель автомобиля
abstract class CarBuilder {
  void build();
}

class BasicCarBuilder implements CarBuilder {
  void build() {
    print('Строим базовую модель автомобиля');
  }
}

class CarBuilderComposite implements CarBuilder {
  List<CarBuilder> builders = [];

  void addBuilder(CarBuilder builder) {
    builders.add(builder);
  }

  void build() {
    for (var builder in builders) {
      builder.build();
    }
  }
}

void main() {
  BasicCarBuilder sedanBuilder = BasicCarBuilder();
  BasicCarBuilder suvBuilder = BasicCarBuilder();
  BasicCarBuilder sportsCarBuilder = BasicCarBuilder();

  CarBuilderComposite carProductionLine = CarBuilderComposite();
  carProductionLine.addBuilder(sedanBuilder);
  carProductionLine.addBuilder(suvBuilder);
  carProductionLine.addBuilder(sportsCarBuilder);

  carProductionLine.build();
}
Будет напечатано:
Строим базовую модель автомобиля
Строим базовую модель автомобиля
Строим базовую модель автомобиля
Рейтинг: 0/5 - 0 голосов