代理模式,顾名思义,就像买房一样,不能直接找房东买,只能找中介(代理)买;中介可以帮你办一些麻烦的事情,比如交税。
生活中的代理无处不在,因为代理有内部关系,办事方便;代理类就是为其它对象提供代理访问。
有些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用,同时保护了目标对象。
下面这个买房过程代码,很好的体现了代理模式。
#include <iostream>
using namespace std;
// 房子,是房东,中介,买主的公有接口,大家都知道有这么个房子
class houseIf
{
public:
houseIf()
{
cout <<"this is a house..."<<endl;
}
virtual ~houseIf()
{
cout <<"house has been sold..."<<endl;
}
virtual void buyHouse() = 0;
};
// 房东
class landLord: public houseIf
{
public:
landLord()
{
cout << "Constructor: proxy contact landlord\n";
}
virtual ~landLord()
{
cout <<"Destructor: proxy cut-off contact with landlord..."<<endl;
}
//只有从房东这里才能最终得到房子
virtual void buyHouse()
{
cout << " buy house through landlord\n";
}
};
// 中介,含有一个指向房东对象的指针
class realestateProxy: public houseIf
{
public:
realestateProxy(): m_landLordp(NULL)
{
cout << "Constructor: customer contact proxy\n";
}
virtual ~realestateProxy()
{
delete m_landLordp;
m_landLordp = NULL;
cout <<"Destructor: customer cut-off contact with Proxy..."<<endl;
}
virtual void buyHouse()
{
// 需要买房时才去找房东,光咨询不会
if (NULL == m_landLordp)
{
cout << "customer buy house through Proxy\n";
m_landLordp = new landLord();
}
m_landLordp->buyHouse();
//房子买了,中介来帮里处理交税
taxHanding();
}
private:
void taxHanding()
{
cout<<"pay taxes"<<endl;
}
//房东的电话
landLord* m_landLordp;
};
int main()
{
//客户
houseIf* house_p = new realestateProxy();
house_p->buyHouse();
delete house_p;
return 1;
}