设计模式:代理
试想这样一个场景:有一天小菜想给女神进行表白,送一个礼物给女神。但是小菜十分害羞,所以就找了一个代理来代替自己做这些事情。这种模式就是我们常用的代理模式。
结构图
首先可以发现将追求者希望实现的功能都抽象为一个接口。然后使得代理都实现这些功能,代理当中需要有一个追求者的对象,在自己的功能函数当中,调用追求者对象的功能函数。这样在外部看来,代理能够伪装成为追求者实现相关的功能。
一些思考
其实代理的作用可以伪装成为一个实际的追求者(数据库之类),使得所有人调用的时候都去访问代理,代理可以做一些控制校验的操作,来保证请求的合理性。
代码
送礼物接口(subject)
//接口;真实的数据库和代理数据都依赖这个接口
class GivePresent {
public:
virtual void request() const = 0;
};
小菜 (realsubject)
class Pursuer :public GivePresent {
public:
virtual void request() const override {
std::cout << "送出礼物\n";
}
};
代理(Proxy)
class ProxyDatabase :public GivePresent {
private:
Pursuer* m_pursuer;
bool checkAccess() const {
//std::cout << "代理在发出请求之前,检查一下是否合理\n";
return true;
}
void log() const {
//std::cout << "日志\n";
}
public:
ProxyDatabase(Pursuer* pursuer) :m_pursuer(pursuer) {}
void request() const override {
if (checkAccess()) {
//std::cout << "通过代理处理请求\n";
m_pursuer->request();
log();
}
else {
//std::cout << "不合理请求进行驳回\n";
}
}
};
主函数
void clientCode(const GivePresent* givepresent) {
givepresent->request();
}
int main()
{
std::cout << "不使用代理直接进行请求\n";
Pursuer zjy; // 卓贾易
clientCode(&zjy);
std::cout << "通过代理进行送礼物\n";
ProxyDatabase dl(&zjy); //代理
clientCode(&dl);
}
结果
总结
今天解决了小菜找女朋友的问题,真是开心的一天啊。现在本菜要去骑车了。