Проблема: необходимо управлять доступом к объекту так, чтобы не создавать громоздкие объекты «по требованию».
Решение: создать суррогат громоздкого объекта. «Заместитель» хранит ссылку, которая позволяет заместителю обратиться к реальному субъекту (объект класса «Заместитель» может обращаться к объекту класса «Субъект», если интерфейсы «Реального Субъекта» и «Субъекта» одинаковы).
Поскольку интерфейс «Реального Субъекта» идентичен интерфейсу «Субъекта», так, что «Заместителя» можно подставить вместо «Реального Субъекта».
«Заместитель» контролирует доступ к «Реальному Субъекту», может отвечать за создание или удаление «Реального Субъекта».
«Субъект» определяет общий для «Реального Субъекта» и «Заместителя» интерфейс, так, что «Заместитель» может быть использован везде, где ожидается «Реальный Субъект».
При необходимости запросы могут быть переадресованы «Заместителем» «Реальному Субъекту».
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)