中介者模式(Mediator Pattern)的定义
(1)定义:用一个中介对象来封装一系统对象交互。中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
①中介者模式主要用来将同事类之间网状结构变为星状结构,使同事类之间的关系变的清晰一些。
②所有对象只跟中介者对象进行通信,相互之间不再有联系,这样也能够集中控制这些对象的交互关系。
(2)中介者模式的结构和说明
①Mediator: 中介者接口。在里面定义各个同事之间交互需要的方法,可以是公共的通信方法,比如changed方法,大家都可以用(一般会传入同事类的this指针),也可以是小范围的交互方法。
②ConcreteMediator:具体中介者实现对象。这需要了解并维扩各个同事对象,并负具体的协调各同事对象的交互关系。
③Colleague:同事类的定义,通常实现为抽象类,主要负责约束同事对象的类型,并能实现一些具体同事类之间的公共功能。同时,一般会持有中介者的引用。
④ConcreteColleague:具体的同事类,实现自己的业务,在需要与其他同事通信的时候,就与持有的中介者通信,中介者会负责与其他的同事交互。
【编程实验】班级QQ群
//示意图
//UML图
//行为模式——中介者模式
//场景:班级通信
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class CStudent;//前向声明
//*******************************************抽象中介者**************************************
//抽象中介者
class CMediator{
public:
virtual void AddClassMate(CStudent* stu) = 0;//加入
virtual void DownNotify(CStudent* stu) = 0;//通知
virtual void ChatWith(CStudent* stu1, CStudent* stu2) = 0;//两个同学私下交流
};
//*******************************************抽象同事类**************************************
//抽象同事类
class CStudent{
private:
string strName;
string strContent;
protected:
CMediator* pMediator;
public:
CStudent(CMediator* mediator, string name = ""){
pMediator = mediator; strName = name; pMediator->AddClassMate(this);
}
string& GetName(){return strName;}
string& GetContent(){return strContent;}
virtual void Talk() = 0;
void UpInform(){Talk(); pMediator->DownNotify(this);}
};
//具体的同事类
class CMonitor : public CStudent{//班长
public:
CMonitor(CMediator* mediator, string name = "") : CStudent(mediator, name){}
void Talk(){cout << "班长说:" << GetContent() << endl;}
};
class CYouthLeague : public CStudent{//团支书
public:
CYouthLeague(CMediator* mediator, string name = "") : CStudent(mediator, name){}
void Talk(){cout << "团支书说:" << GetContent() << endl;}
};
//具体的同事类:同学A
class CStudentA : public CStudent{
public:
CStudentA(CMediator* mediator, string name = "") : CStudent(mediator, name){}
void Talk(){cout << "学生A 说:" << GetContent() << endl;}
};
class CStudentB : public CStudent{//学生B
public:
CStudentB(CMediator* mediator, string name = "") : CStudent(mediator, name){}
void Talk(){cout << "学生B 说:" << GetContent() << endl;}
};
//具体的中介者(如QQ通讯平台)
class CQQ : public CMediator{
private:
vector<CStudent*> vStudent;
public:
void AddClassMate(CStudent* stu){vStudent.push_back(stu);}
void DownNotify(CStudent* stu){
//student发出通知,其他同学回复
for(vector<CStudent*>::iterator it = vStudent.begin(); it != vStudent.end(); it++){
if((*it) != stu){ //其他同学的回复
(*it)->Talk();
}
}
}
void ChatWith(CStudent* stu1, CStudent* stu2){//私下交流
stu1->Talk();//学生1说话
stu2->Talk();//学生2回答
}
};
void QQChat()
{
CQQ oQQ;//***********************初始化QQ聊天环境********************
CMonitor oMonitor(&oQQ, "Monitor");
CYouthLeague oYouthLeague(&oQQ, "YouthLeague");
CStudentA oStudentA(&oQQ, "StudentA");
CStudentB oStudentB(&oQQ, "StudentB");
cout << "***************班级发通知********************" << endl;
oMonitor.GetContent() = "明天下午2点开年段会,收到请回复^^。";
oYouthLeague.GetContent() = "知道了,肯定到!!";
oStudentA.GetContent() = "收到了,一定准时到!!";
oStudentB.GetContent() = "收到了,但明天要去面试,特请假一下!!";
oMonitor.UpInform();//开始发通知
//下面是两个同学的私下交流
cout << endl << endl << "*******************两个同学私下交流**************" << endl;
oMonitor.GetContent() = "你觉得咱们地理老师课讲得怎么样?";
oStudentA.GetContent() = "我觉得讲的不够生动,还点名,不太好!!!";
oQQ.ChatWith(&oMonitor, &oStudentA);
}