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;
}Last updated
Was this helpful?