为其他对象提供一种代理以控制对这个对象的访问。
#include <cstdlib>
#include <iostream>
#include <memory>
/* 定义RealSubject和Proxy的公用接口 */
class Subject {
public:
virtual void Request() = 0;
};
/* 定义Proxy所代表的真实实体 */
class RealSubject : public Subject {
public:
RealSubject() = default;
void Request() override { std::cout << "Real Request!\n"; }
};
/* 保存一个指针使得代理可以访问实体 */
class Proxy : public Subject {
public:
Proxy() { realsub = std::make_unique<RealSubject>(); }
void Request() override { realsub->Request(); }
private:
std::unique_ptr<RealSubject> realsub;
};
auto main()->int {
std::unique_ptr<Proxy> proxy = std::make_unique<Proxy>();
proxy->Request();
return 0;
}
一般,代理模式用于以下场景:
- 远程代理:为一个对象在不同的地址空间提供局部代表,这可以隐藏一个对象存在于不同地址空间的事实。
- 虚拟代理:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。(比如浏览网页时,里面有很多文字和图片,图片有时候是一张一张地加载出来。那些未打开的图片框就是通过虚拟代理替代了真实的图片,此时代理存储了真是图片的路径和尺寸)
- 安全代理:控制真实对象访问时的权限。
- 智能指引:当调用真实的对象时,代理处理另外一些事。可以通过代理来附加一些行为。