开始代理模式以前我们先说一下什么是代理。这个词想必生活中听过见过的太多,比如经销商的烟酒代理,洗漱用品代理等,其实经销代理也就是我们常说的批发商,他们从厂家那里拿货,而后卖给实际用户。
经销商的代理好处是什么,为什么厂家不直接卖给用户赚钱呢?
比如说我们常用的笤帚什么的,一家厂家的用户全体是全国乃至全世界所有的用户,它不可能和数以百万乃至千万计中的每一个客户打交道。于是每个地区有一个批发商,批发商和客户打交道,而它只需要和批发商打交道就可以了。全国的省部级别的地方,就三十多个,这样他处理起来是不是一下子方便了很多。这种代理是一种树形的,组织扩散放大型的代理。
现在又出现了互联网时代的代理——电商,每一家电商都可以代理很多的产品,而后通过自家平台直接和客户打交道。这种是反向树,一种集中式的代理。这种代理容易出现客大欺店的情况。在编程上来看,就是一旦这个集中式的中间代理挂掉,所有的服务和用户全部失去联系。风险较大。
现在用编程的角度来简单定义一下代理:为一个对象提供对另外一个对象的访问或控制的行为即为代理。
下面是个简单的示例:
#include<iostream>
using namespace std;
class Interface
{
public:
virtual void SellDolls(){};
virtual void SellFlowers(){};
};
class Company :public Interface
{
public:
Company(const string *name)
{
customername = name;
}
virtual void SellDolls(){ cout<< "把布偶卖给"<<customername->c_str()<< endl; }
virtual void SellFlowers(){ cout<<"把花卖给" <<customername->c_str() << endl; }
private:
const string* customername;
};
class Proxy :public Interface
{
public:
Proxy (const string* customername);
~Proxy();
virtual void SellDolls()
{
m_Company->SellDolls();
}
virtual void SellFlowers()
{
m_Company->SellFlowers();
}
private:
Company *m_Company;
};
Proxy::Proxy(const string *grilname) :m_Company(nullptr)
{
m_Company = new Company(grilname);
}
Proxy::~Proxy()
{
if (m_Company!=nullptr)
{
delete m_Company;
}
}
int main()
{
const string customername = "玛利亚";
Proxy proxy(&customername);
proxy.SellDolls();
proxy.SellFlowers();
return 0;
}
运行结果如下:
另外提个问题,如果有一个程序组件作为客户端和服务端的中间件,帮助转发消息,是不是代理呢。答案是,是的。