代理模式
定义
为其他对象提供一种代理以控制对这对象的访问。 ——《设计模式》GoF
背景
在有些系统中,为了某些对象的纯粹性,只进行了功能相关封装(稳定点),后期添加了其他功能需要对该对象进行额外操作(变化点),为了隔离变化点(也就是不直接在稳定点进行修改,这样会让稳定点也变得不稳定),可以抽象一层代理层;
代码
class ISubject { public: virtual void Handle() = 0; virtual ~ISubject() {} }; // 该类在当前进程,也可能在其他进程当中 class RealSubject : public ISubject { public: virtual void Handle() { // 只完成功能相关的操作,不做其他模块的判断 } }; // 在当前进程当中 只会在某个模块中使用 class Proxy1 : public ISubject { public: Proxy1(ISubject *subject) : _subject(subject) {} virtual void Handle() { // 在访问 RealSubject 之前做一些处理 //if (不满足条件) // return; _subject->Handle(); count++; // 在访问 RealSubject 之后做一些处理 } private: ISubject* _subject; static int count; }; int Proxy1::count = 0; // 在分布式系统当中 skynet actor class Proxy2 : public ISubject { public: virtual void Handle() { // 在访问 RealSubject 之前做一些处理 // 发送到数据到远端 网络处理 同步非阻塞 ntyco c协程 //IResult * val = rpc->call("RealSubject", "Handle"); // 在访问 RealSubject 之后做一些处理 } private: /*void callback(IResult * val) { // 在访问 RealSubject 之后做一些处理 }*/ };
要点
- 远程代理(隐藏一个对象存在不同的地址空间的事实),虚代理(延迟加载lazyload),保护代理(在代理前后做额外操作,权限管理,引用计数等);
- 在分布式系统中,actor模型(skynet)等常用的设计模式;
本质
控制对象访问;
结构图