Заместитель (Proxy) :: Cетевой уголок Majestio

Заместитель (Proxy)


Заместитель — это структурный паттерн проектирования, который позволяет подставлять вместо реальных объектов специальные объекты-заменители. Эти объекты перехватывают вызовы к оригинальному объекту, позволяя сделать что-то до или после передачи вызова оригиналу.

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

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

UML-диаграмма

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

#include <iostream>

// Интерфейс для строительства автомобилей

class CarBuilder {
 public:
  virtual void buildEngine() = 0;
  virtual void buildBody() = 0;
  virtual void buildInterior() = 0;
};

// Конкретная реализация строителя автомобилей

class BasicCarBuilder : public CarBuilder {
 public:
  void buildEngine() {
    std::cout << "Строим двигатель для автомобиля" << std::endl;
  }

  void buildBody() { std::cout << "Строим кузов для автомобиля" << std::endl; }

  void buildInterior() {
    std::cout << "Строим интерьер для автомобиля" << std::endl;
  }
};

// Прокси для строителя автомобилей

class CarBuilderProxy : public CarBuilder {
 private:
  CarBuilder* carBuilder;

 public:
  CarBuilderProxy() { carBuilder = new BasicCarBuilder(); }

  void buildEngine() {
    std::cout << "Проверяем доступ" << std::endl;
    carBuilder->buildEngine();
    std::cout << "Завершаем проверку" << std::endl;
  }

  void buildBody() {
    std::cout << "Проверяем доступ" << std::endl;
    carBuilder->buildBody();
    std::cout << "Завершаем проверку" << std::endl;
  }

  void buildInterior() {
    std::cout << "Проверяем доступ" << std::endl;
    carBuilder->buildInterior();
    std::cout << "Завершаем проверку" << std::endl;
  }
};

int main() {
  CarBuilderProxy proxy;
  proxy.buildEngine();
  proxy.buildBody();
  proxy.buildInterior();

  return 0;
}
Будет напечатано:
Проверяем доступ
Строим двигатель для автомобиля
Завершаем проверку
Проверяем доступ
Строим кузов для автомобиля
Завершаем проверку
Проверяем доступ
Строим интерьер для автомобиля
Завершаем проверку
abstract class CarBuilder {
  void buildEngine();
  void buildBody();
  void buildInterior();
}

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

  void buildBody() {
    print('Строим кузов для автомобиля');
  }

  void buildInterior() {
    print('Строим интерьер для автомобиля');
  }
}

class CarBuilderProxy implements CarBuilder {
  late CarBuilder carBuilder;

  CarBuilderProxy() {
    carBuilder = BasicCarBuilder();
  }

  void buildEngine() {
    print('Проверяем доступ');
    carBuilder.buildEngine();
    print('Завершаем проверку');
  }

  void buildBody() {
    print('Проверяем доступ');
    carBuilder.buildBody();
    print('Завершаем проверку');
  }

  void buildInterior() {
    print('Проверяем доступ');
    carBuilder.buildInterior();
    print('Завершаем проверку');
  }
}

void main() {
  CarBuilderProxy proxy = CarBuilderProxy();
  proxy.buildEngine();
  proxy.buildBody();
  proxy.buildInterior();
}
Будет напечатано:
Проверяем доступ
Строим двигатель для автомобиля
Завершаем проверку
Проверяем доступ
Строим кузов для автомобиля
Завершаем проверку
Проверяем доступ
Строим интерьер для автомобиля
Завершаем проверку
Рейтинг: 5/5 - 1 голосов