现实需求:你刚刚参力口工作想租房,可以找“房屋中介”;或者,自己刚刚到一个陌生城市找工作,可以找“人才交流中心”帮忙。
中介者模式:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。
优点:
缺点:当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。
主要角色:
案例:小码路上班经常很晚回来,于是买的快递寄到家时候只能告诉快递员放在驿站了哦,小码路作为客户与快递员进行信息交流。
第一步:抽象人类
#include <iostream>
#include <string>
using namespace std;
#define Delete(person) if(person){delete person; person=NULL;}
//声明中介驿站,快递员把快递放到驿站,客户去取
class YiZhan;
//定义抽象人类,快递员和客户都是人类的子类
class Person
{
public:
virtual void SetYiZhan(YiZhan *yizhan){}
virtual void SendMessage(string &message){}
virtual void GetMessage(string &message){}
protected:
YiZhan *_yizhan;
};
第二步:抽象中介类
//定义抽象中介类
class YiZhan
{
public:
virtual void Send(string &message, Person *person){}
virtual void SetKuaiDiYuan(Person *kuaidiyuan){}
virtual void SetKeHu(Person *kehu){}
};
第三步:具体人类
//定义快递员
class KuaiDiYuan:public Person
{
public:
void SetYiZhan(YiZhan *yizhan){
_yizhan = yizhan;
}
void SendMessage(string &message){
_yizhan->Send(message,this);
}
void GetMessage(string &message){
cout<<"客户收到快递员发来快递已经到达,请取件的消息"<<endl;
cout<<message;
}
};
//定义客户类
class KeHu:public Person
{
public:
void SetYiZhan(YiZhan *yizhan){_yizhan = yizhan;}
void SendMessage(string &message){
_yizhan->Send(message,this);
}
void GetMessage(string &message){
cout<<"快递员收到客户的回信,知道了,放在驿站吧"<<endl;
cout<<message;
}
};
第四步:具体中介类
//定义菜鸟驿站,具体中介
class CaiNiaoYiZhan:public YiZhan
{
public:
CaiNiaoYiZhan():_kehu(NULL),_kuaidiyuan(NULL){}
void SetKeHu(Person *kehu){
_kehu=kehu;
}
void SetKuaiDiYuan(Person *kuaidiyuan){
_kuaidiyuan = kuaidiyuan;
}
void Send(string &message, Person *person){
//接收消息的对象为该对象的对应对象
if(person == _kehu)
_kuaidiyuan->GetMessage(message);
else
_kehu->GetMessage(message);
}
private:
Person *_kehu;
Person *_kuaidiyuan;
};
第五步:客户端
int main()
{
YiZhan *yizhan=new CaiNiaoYiZhan();
Person *p1=new KeHu();
Person *p2=new KuaiDiYuan();
yizhan->SetKeHu(p1);
yizhan->SetKuaiDiYuan(p2);
p1->SetYiZhan(yizhan);
p2->SetYiZhan(yizhan);
string s1="我上周买的一本书终于到了 \n";
string s2="好的,那我就放在菜鸟驿站了,记得取啊\n";
p1->SendMessage(s1);
p2->SendMessage(s2);
//p1->SendMessage(string("我上周买的一本书放到哪里了呢? \n"));//这样会报错的,临时变量不能作为非const引用传入
//p2->SendMessage(string("实在抱歉,我记得给你放菜鸟驿站了,你再找找\n"));
Delete(p1);
Delete(p2);
Delete(yizhan);
}
结果显示: