标题把代理模式和中介模式写在一起,是因为二者具有一定的相似性。
首先,什么是代理?现实中我们所说的代理一般都是指某一家厂商的代理,比如你买A公司的产品,你就可以找他们的代理M。在这里我们所指的M代理是对A公司来说的,M的职责是帮助A公司完成销售的任务~~当然,代理不仅限于此,但通过这个我们可以窥探一下代理模式的功能——帮助某一特定对象将某些职责/功能封装起来,以代理类的形式向外提供。具体实现的话,就是在代理类中关联厂商类,并向外提供需要的职责函数,该函数是以关联的厂商类来实现的。
那什么是中介?我们去租房/买房,很多情况是直接找房产中介,或者你想要卖房/出租房,也可以去找房产中介。对于房东或者租客而言,中介是二者之间的纽带。中介连接了多个对象之间的相互联系。具体实现的话,中介类里面关联租房/房东类,租房/房东类里面也关联中介类,租房/房东类实现的租房或出租的功能函数,是通过调用中介类的函数来传递信息,中介类的该函数也会判断传递过来的房东/租房类信息,并对该信息需要的房东/租房类发出通知。
下面以买房为例来介绍一下代理/中介模式。
先给出代理模式的:
#include<iostream>
class BuyHouse
{
public:
virtual void buyHouse(int money) = 0;
};
class YourSelf:public BuyHouse //我是实际购房者
{
public:
void buyHouse(int money)
{
std::cout << "我花"<< money<<"万来买符合我要求的房子" << std::endl;
}
};
class Proxy:public BuyHouse //精通房价并帮助购房的人
{
public:
Proxy(YourSelf *wanter) :buyer(wanter)
{
}
int getHouseMoney()
{
std::cout << "中介查了本市较好地段的学区房,并从价格,小区物业,房子质量等因素综合考虑,和售房处以288万的价格敲定了符合要求的房子" << std::endl;
return 300;
}
void buyHouse(int money)
{
buyer->buyHouse(300);
}
private:
YourSelf * buyer;
};
void main()
{
YourSelf *buyHousePeople=new YourSelf;//我是一个购房者
Proxy *intermediary = new Proxy(buyHousePeople);//我联系了一个中介帮我买房
intermediary->buyHouse(intermediary->getHouseMoney()); //我通过中介,付钱买了房子
delete buyHousePeople;
delete intermediary;
system("pause");
return;
}
上述实例堪堪可以视为代理模式,(其实并不恰当,因为这个例子其实适合作为中介模式的实例),在这里,不考虑代理(房产中介)可能面向的多个卖家或者买家,只是以你这个单独的买房者的角度看——你有一个需求(无论是买还是卖),交给了你找的代理,他通过关联你的方法来对外提供了这个需求,这就是代理模式。
然后给出中介模式的:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Mediator;
//需求者
class Needer
{
public:
Needer(Mediator *mediator):m_mediator(mediator)
{
}
virtual void noticeMediator(string message) //客户找中介,告知需求
{
}
virtual void mediatorNotice(string message) //中介实现需求,通知客户
{
}
protected:
Mediator *m_mediator;
};
//中介记录需求的本本
class Record
{
public:
Record(Needer *needer, string need) :m_needer(needer), m_need(need) {}
Needer *m_needer;
string m_need;
};
//中介
class Mediator
{
public:
virtual void saveRenter(Needer *needer, string message)
{
}
virtual void saveLessor(Needer *needer, string message)
{
}
virtual Record * findJustNeeder(string message)
{
return NULL;
}
virtual void noticeNeeder(Needer *needer, string message)
{
}
protected:
vector <Record *> renterRecord;
vector <Record *> LessorRecord;
};
//租房者
class Renter:public Needer
{
public:
Renter(Mediator *mediator) :Needer(mediator)
{
}
void noticeMediator(string message)
{
m_mediator->saveRenter(this, message);
m_mediator->noticeNeeder(this, message);
}
void mediatorNotice(string message)
{
cout << "短信发给我的需求消息:" << message << endl;
}
};
//出租者
class Lessor :public Needer
{
public:
Lessor(Mediator *mediator) :Needer(mediator)
{
}
void noticeMediator(string message)
{
m_mediator->saveLessor(this, message);
m_mediator->noticeNeeder(this, message);
}
void mediatorNotice(string message)
{
cout << "短信发给我的需求消息:" << message << endl;
}
};
//房产中介
class HouseMediator :public Mediator
{
void saveRenter(Needer *needer, string message)
{
Record *new_record = new Record(needer, message);
renterRecord.push_back(new_record);
}
void saveLessor(Needer *needer, string message)
{
Record *new_record = new Record(needer, message);
LessorRecord.push_back(new_record);
}
Record * findJustNeeder(string message)
{
cout << "根据需求,从我的小本本上查找合适的租房者或者出租者,返回合适的需求者,如果没有返回个空" << endl;
return NULL; //注意,这里简写了
}
void noticeNeeder(Needer *needer, string message)
{
Record *needRecord;
needRecord =findJustNeeder(message);
if (needRecord == NULL)
{
needer->mediatorNotice("暂时没有合适的");
}
else
{
needer->mediatorNotice(needRecord->m_need);
}
}
};
void main()
{
Mediator *mediator = new HouseMediator(); //我是一个房产中介
Needer * renterNeed = new Renter(mediator); //今天有一个租房者找到了我
renterNeed->noticeMediator("我想要租A小区的租金为2000元一个月的性价比高的房子"); //他告诉我需要,我先把他记在了我的小本本上,然后帮他查了一下,发现暂时还没有,但以后如果有我会主动通知他
//**别忘了析构,比较懒,没有写析构函数,这里需要delete一下**
system("pause");
}
上述代码就是中介模式的例子。其实到了这里就可以理清楚中介模式和代理模式了,没有刚开始学的时候那种傻傻分不清楚的感觉。