Behavior.Mediator中介者模式:UpInform + DownNotify网状结构转星状结构

中介者模式(Mediator Pattern)的定义

(1)定义:用一个中介对象来封装一系统对象交互。中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

     

  ①中介者模式主要用来将同事类之间网状结构变为星状结构,使同事类之间的关系变的清晰一些。

  ②所有对象只跟中介者对象进行通信,相互之间不再有联系,这样也能够集中控制这些对象的交互关系

(2)中介者模式的结构和说明

 

  ①Mediator: 中介者接口。在里面定义各个同事之间交互需要的方法,可以是公共的通信方法,比如changed方法,大家都可以用(一般会传入同事类的this指针),也可以是小范围的交互方法。

  ②ConcreteMediator:具体中介者实现对象。这需要了解并维扩各个同事对象,并负具体的协调各同事对象的交互关系。

  ③Colleague:同事类的定义,通常实现为抽象类,主要负责约束同事对象的类型,并能实现一些具体同事类之间的公共功能。同时,一般会持有中介者的引用

  ④ConcreteColleague:具体的同事类,实现自己的业务,在需要与其他同事通信的时候,就与持有的中介者通信,中介者会负责与其他的同事交互。

【编程实验】班级QQ群

//示意图

    

//UML图


//行为模式——中介者模式
//场景:班级通信

#include 
#include 
#include 

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 vStudent;
public:
	void AddClassMate(CStudent* stu){vStudent.push_back(stu);}
	void DownNotify(CStudent* stu){
		//student发出通知,其他同学回复
		for(vector::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);
}

你可能感兴趣的:(Behavior.Mediator中介者模式:UpInform + DownNotify网状结构转星状结构)