Заместитель — структурный шаблон проектирования, который предоставляет объект, который контролирует доступ к другому объекту, перехватывая все вызовы

Проблема: необходимо управлять доступом к объекту так, чтобы не создавать громоздкие объекты «по требованию».

Решение: создать суррогат громоздкого объекта. «Заместитель» хранит ссылку, которая позволяет заместителю обратиться к реальному субъекту (объект класса «Заместитель» может обращаться к объекту класса «Субъект», если интерфейсы «Реального Субъекта» и «Субъекта» одинаковы).

Поскольку интерфейс «Реального Субъекта» идентичен интерфейсу «Субъекта», так, что «Заместителя» можно подставить вместо «Реального Субъекта».

«Заместитель» контролирует доступ к «Реальному Субъекту», может отвечать за создание или удаление «Реального Субъекта».

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

При необходимости запросы могут быть переадресованы «Заместителем» «Реальному Субъекту».

Class IMath

{

public:

virtual double add(double, double) = 0;

virtual double sub(double, double) = 0;

virtual double mul(double, double) = 0;

virtual double div(double, double) = 0;

};

/**

 * "Real Subject"

 */

Class Math: public IMath

{

public:

virtual double add(double x, double y)

{

   return x + y;

}

   

virtual double sub(double x, double y)

{

   return x - y;

}

   

virtual double mul(double x, double y)

{

   return x * y;

}

   

virtual double div(double x, double y)

{

   return x / y;

}

};

/**

 * "Proxy Object"

 */

Class MathProxy: public IMath

{

public:

MathProxy()

{

   math = new Math();

}

virtual ~MathProxy()

{

   delete math;

}

virtual double add(double x, double y)

{

   return math->add(x, y);

}

   

virtual double sub(double x, double y)

{

   return math->sub(x, y);

}

   

virtual double mul(double x, double y)

{

   return math->mul(x, y);

}

   

virtual double div(double x, double y)

{

   return math->div(x, y);

}

   

private:

IMath *math;

};

#include <iostream>

using std::cout;

using std::endl;

Int main()

{

// Create math proxy

IMath *proxy = new MathProxy();

   

// Do the math

cout << "4 + 2 = " << proxy->add(4, 2) << endl;

cout << "4 - 2 = " << proxy->sub(4, 2) << endl;

cout << "4 * 2 = " << proxy->mul(4, 2) << endl;

cout << "4 / 2 = " << proxy->div(4, 2) << endl;

delete proxy;

return 0;

}

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

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: