1.代理模式定义
为其他对象提供⼀种代理以控制对这对象的访问。
2.代理模式遵循的模式设计原则
3.要点
a.远程代理(隐藏⼀个对象存在不同的地址空间的事实),虚代理(延迟加载lazyload),保护代理(在代理前后做额外操作,权限管理,引⽤计数等);
b.在分布式系统中,actor模型(skynet)等常⽤的设计模式;
4.本质
控制对象访问;
5.代码
在有些系统中,为了某些对象的纯粹性,只进⾏了功能相关封装(稳定点),后期添加了其他功能需要对该对象进⾏额外操作(变化点),为了隔离变化点(也就是不直接在稳定点进⾏修改,这样会让稳定点也变得不稳定),可以抽象⼀层代理层;
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 之后做一些处理
}*/
};