用一个给女孩子送礼物的例子,来讲述代理模式。
女孩子一般会比较害羞,所以追女孩子的方式是通过闺蜜转交的间接方式来给女孩子送礼物。 闺蜜是代表追求者送礼物,闺蜜只需要引用追求者,给被追求者转交礼物和话语即可。
直接上程序,比较简单:
#include<iostream> #include<string> using namespace std; class Girl { public: void setName(string name) { this->name = name; } string getName() { return name; } private: string name; }; class GiveGift { public: virtual void giveFlowers()=0; }; class Pursuit : public GiveGift { public: Pursuit(Girl *girl) { this->girl = girl; } void giveFlowers() { cout << girl->getName() << "---You are so beautiful like flowers, I love u!" << endl; } private: Girl *girl; }; //BFF--best friend forever class ProxyBFF : public GiveGift { public: ProxyBFF(Girl *girl) { this->pursuit = new Pursuit(girl); } void giveFlowers() { pursuit->giveFlowers(); } void showMyself() { cout << "我是闺蜜,我的名字是: " << name << endl; } void setName(string name) { this->name = name; } private: Pursuit *pursuit; string name; }; int main() { Girl *girl = new Girl(); girl->setName("吴巧梅"); ProxyBFF *proxy = new ProxyBFF(girl); proxy->setName("余莹莹"); proxy->showMyself(); proxy->giveFlowers(); return 0; }运行结果:
zy@zy:~/code/designpattern/proxyPattern$ ./a.out 我是闺蜜,我的名字是: 余莹莹 吴巧梅---You are so beautiful like flowers, I love u!
分析:
代理通过添加一个中间层的方式,体现了面向对象的单一职责的思想。
正向代理和反向代理:
上面送礼物其实是正向代理的一个例子,也就是代理代表的是client,就像使用的代理,在浏览器里填一个代理服务器,然后上网都是通过代理服务器转发。
而反向代理,是和服务器位于一体的,代理的是server端,客户端并不知道反向代理服务器的存在,客户端请求,先到达代理服务器,代理服务器根据请求再去后台服务器去获取数据返还给客户端,可以将不同的业务放在不同的服务器上,从而达到负载均衡。nginx既可以做正向代理也就可以做反向代理服务器。
使用代理模式实现智能指针:
原文地址:http://blog.csdn.net/zy416548283/article/details/44264159