意图
代理模式是一种结构型设计模式。他为其他对象提供一种代理以控制对这个对象的访问。
结构

代理模式结构图
代码示例
#include <iostream>
#include <memory>
#include <string>
// 抽象主题
class Subject {
public:
Subject() {}
virtual ~Subject() {}
virtual void Request() = 0;
};
// 真实主题
class RealSubject : public Subject {
public:
using Ptr = std::shared_ptr<RealSubject>;
RealSubject() : Subject() {}
virtual ~RealSubject() {}
void Request() override {
std::cout << "Real subject request!" << std::endl;
}
};
// 代理
class Proxy : public Subject {
public:
using Ptr = std::shared_ptr<Proxy>;
Proxy() : Subject() {}
virtual ~Proxy() {}
void Request() override {
if (_realSubject.get() == nullptr) {
_realSubject.reset(new RealSubject());
}
DoProxy();
_realSubject->Request();
}
void DoProxy() {
std::cout << "I'm doing proxy!" << std::endl;
}
private:
RealSubject::Ptr _realSubject = nullptr;
};
// use it!
int main() {
Proxy::Ptr proxy(new Proxy());
proxy->Request();
return 0;
}

运行结果
适用性
- 远程代理,为一个对象在不同的地址空间提供局部代表;
- 虚代理,根据需要创建开销很大的对象;
- 保护代理,控制对原始对象的访问;保护代理用于对象应该有不同的访问权限的时候;
- 智能指引取代了简单的指针,它在访问对象时执行一些附加操作:
- 对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它(也称为智能指针);
- 当第一次引用一个持久对象时,将它装入内存;
- 在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。