用一个给女孩子送礼物的例子,来讲述代理模式。
女孩子一般会比较害羞,所以追女孩子的方式是通过闺蜜转交的间接方式来给女孩子送礼物。 闺蜜是代表追求者送礼物,闺蜜只需要引用追求者,给被追求者转交礼物和话语即可。
直接上程序,比较简单:
#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