🕵️
Введение в паттерны
  • Введение в паттерны
  • Паттерны
    • Оглавление
    • Порождающие паттерны
      • Фабричный метод
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Абстрактная фабрика
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Прототип
        • Реализации на С++
        • Реализации на Kotlin
        • Реализации на Java
        • Возможные реализации для решения конкретных задач на С++
      • Строитель
        • Реализации на С++
        • Реализации на Kotlin
      • Одиночка
        • Реализации на C++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Пул объектов
        • Реализации на С++
    • Структурные паттерны
      • Адаптер
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач
      • Декоратор
        • Реализации на С++
        • Реализации на Kotlin
      • Компоновщик
        • Реализации на С++
      • Мост
        • Реализации на С++
      • Заместитель
        • Реализации на С++
        • Реализации на Kotlin
      • Фасад
        • Реализации на С++
      • Приспособленец
        • Реализации на С++
    • Поведенческие паттерны
      • Стратегия
        • Реализации на С++
        • Реализации на Kotlin
      • Команда
        • Реализации на С++
        • Реализации на Kotlin
      • Цепочка обязанностей
        • Реализации на С++
        • Реализации на Kotlin
      • Подписчик-издатель
        • Реализации на С++
        • Реализации на Kotlin
      • Посетитель
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
      • Посредник
        • Реализации на С++
        • Реализации на Kotlin
      • Шаблонный метод
        • Реализации на С++
      • Опекун
        • Реализации на С++
      • Итератор
        • Реализации на С++
        • Реализации на Kotlin
      • Свойство
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
  • Введение в идиомы
  • Идиомы
    • Оглавление
    • RAII
    • Type erasure
      • Контейнеры с type erasure
    • CRTP
    • Статический полиморфизм
    • Shrink to fit
    • Proxy
    • Erase remove
    • Decltype (auto)
    • Copy and swap
    • Safe bool
    • Scope guard
    • Addressof
Powered by GitBook
On this page
  • Назначение
  • Решаемые задачи
  • Пример реализации идиомы Proxy

Was this helpful?

  1. Идиомы

Proxy

Заместитель

Назначение

Идиома Proxy позволяет клиентскому коду работать с заместителем таким же образом, как с реальным объектом, не внося в него изменений.

Реализуется идиома при помощи шаблонов и наследования.

Заместитель может быть реализован как класс, который имеет тот же интерфейс, что и оригинальный объект, но может выполнять дополнительные действия перед вызовом методов оригинального объекта.

Паттерн Proxy и идиома Proxy на C++ являются разными концепциями.

  • Паттерн Proxy

Паттерн Proxy является одним из классических порождающих паттернов проектирования. Он предоставляет структуру для создания объекта-посредника, который выступает в роли замены или обертки для реального объекта. Прокси имитирует интерфейс реального объекта, позволяя себе встраиваться в клиентский код без изменения его логики.

Главная цель паттерна Proxy - контроль доступа к реальному объекту и предоставление дополнительной функциональности при его обращении.

  • Идиома Proxy

Идиома Proxy является практикой или подходом к реализации классов-оберток или прокси-классов для достижения определенных целей. Идиома Proxy используется для предоставления прокси-объектов, которые оборачивают реальные объекты и добавляют дополнительное поведение без изменения интерфейса реальных объектов.

Решаемые задачи

  • управление доступом к ресурсам или сервисам

  • кэширование данных

  • проведение логирования и аудита

  • обеспечение защищенного соединения между клиентом и сервером

Пример реализации идиомы Proxy

// Интерфейс для оригинального объекта и прокси
class Object 
{
public:
    virtual void DoSomething() = 0;
};
// Реализация оригинального объекта
class RealObject : public Object 
{
public:
    RealObject() 
    {
    // Здесь может быть дорогостоящая инициализация объекта
    std::cout << "RealObject: Created." << std::endl;
    }
    void DoSomething() override 
    {
    // Здесь может быть дорогостоящая операция
    std::cout << "RealObject: Doing something." << std::endl;
    }
};
// Прокси для оригинального объекта
class ObjectProxy : public Object {
public:
    ObjectProxy() : real_object_(nullptr) {}
    void DoSomething() override 
    {
        // Создаем оригинальный объект только при первом вызове его метода
        if (!real_object_) 
        {
            std::cout << "ObjectProxy: Creating real object." << std::endl;
            real_object_ = new RealObject();
        }    
    // Выполняем операцию на оригинальном объекте
    std::cout << "ObjectProxy: Doing something." << std::endl;
    real_object_ -> DoSomething();
    }
    ~ObjectProxy() 
    {
        delete real_object_;
    }
private:
    RealObject * real_object_;
};
int main() 
{
    std::vector<ObjectProxy > objects(10);
    // Выполняем операцию для каждого объекта
    for (Object & obj : objects) 
        obj.DoSomething();    
    return 0;
}
PreviousShrink to fitNextErase remove

Last updated 1 year ago

Was this helpful?