简述
在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户端和目标对象之间起到 中介的作用,并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外服务。
定义
给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英 文叫做
Proxy
或Surrogate
,它是一种对象结构型模式。
角色
Subject:
抽象角色Proxy:
代理角色RealSubject:
真实角色
场景
- 每当需要比简单指针更通用或更复杂的对象引用时
- 远程代理:当需要访问位于远程服务器上的对象时,代理模式可以用来隐藏网络通信的细节
- 虚拟代理:当创建开销较大的对象时,可以使用代理模式来推迟对象的实例化,延迟加载对象
- 安全代理:当需要控制对对象的访问权限时,代理模式可以用于实现访问控制
- 缓存代理:当需要缓存对象的计算结果或请求结果时,代理模式可以用于实现结果的缓存
实现一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//抽象角色类 class Subject { public: virtual ~Subject() { /*...*/ } virtual void request() = 0; //... }; //真实角色类 class RealSubject : public Subject { public: void request() { std::cout << "Real Subject request" << std::endl; } //... } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//代理角色类 class Proxy : public Subject { public: Proxy() { subject = new RealSubject(); } ~Proxy() { delete subject; } void request() { subject->request(); } //... private: RealSubject * subject; }; |
1 2 3 4 5 6 7 |
auto main()->int { Proxy * proxy = new Proxy(); proxy->request(); delete proxy; return 0; } |
实现二
1 2 3 4 5 |
// Subject Interface class Image { public: virtual void display() = 0; }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// RealSubject class RealImage : public Image { private: std::string filename; public: RealImage(const std::string& filename) : filename(filename) { loadImageFromDisk(); } void display() override { std::cout << "Displaying image: " << filename << std::endl; } void loadImageFromDisk() { std::cout << "Loading image from disk: " << filename << std::endl; } }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// Proxy class ProxyImage : public Image { private: RealImage* realImage; std::string filename; public: ProxyImage(const std::string& filename) : filename(filename), realImage(nullptr) {} ~ProxyImage() { if (realImage) { delete realImage; realImage = nullptr; } } void display() override { if (!realImage) { realImage = new RealImage(filename); } realImage->display(); } }; |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 行为型:观察者模式08/27
- ♥ 创建型:单例模式05/16
- ♥ 结构型:享元模式09/24
- ♥ 创建型:建造者模式09/21
- ♥ 架构模式:MVP模式07/28
- ♥ 架构模式:MVC模式07/27