MEDIATOR(中介者)
1. 意图
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2.适用性
在下列情况下使用中介者模式 :
• 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
• 一个对象引用其他很多对象并且直接与这些对象通信 ,导致难以复用该对象。
• 想定制一个分布在多个类中的行为,而又不想生成太多的子类。
3.类图
代码:
#pragma once
#include "stdafx.h"
//中介者模式
class Mediator; //声明中介
//抽象对应人
class Person
{
protected:
Mediator *m_mediator; //工作中介
public:
virtual void setMediator(Mediator * Med) = 0;
virtual void SendMessage(string msg) = 0;
virtual void GetMessage(string msg) = 0;
virtual ~Person() {}
};
//中介抽象
class Mediator
{
public:
virtual void SendMsg(string msg, Person * person) = 0;
virtual void SetHr(Person * Hr) = 0;
virtual void SetJobhunter(Person * finder) = 0;
virtual~Mediator(){}
};
//具体找工作者
class Jobhunter : public Person
{
public:
void setMediator(Mediator * Med)
{
m_mediator = Med;
}
void SendMessage(string msg)
{
m_mediator->SendMsg(msg, this);
}
void GetMessage(string msg)
{
cout << "Jobhunter get : " << msg << endl;
}
};
//具体公司
class ByteDanceHr : public Person
{
public:
void setMediator(Mediator * Med)
{
m_mediator = Med;
}
void SendMessage(string msg)
{
m_mediator->SendMsg(msg, this);
}
void GetMessage(string msg)
{
cout << "ByteDanceHr get :" << msg << endl;
}
};
class baiduHr : public Person
{
public:
void setMediator(Mediator * Med)
{
m_mediator = Med;
}
void SendMessage(string msg)
{
m_mediator->SendMsg(msg, this);
}
void GetMessage(string msg)
{
cout << "baiduHr send " << msg << endl;
}
};
class WorkPlatform : public Mediator
{
private:
Person * p_Hr; //对应的公司hr
Person * p_Jobhunter; //求职者
public:
WorkPlatform() :p_Hr(nullptr), p_Jobhunter(nullptr) {}
void SendMsg(string msg, Person * person)
{
if (p_Hr == person)
{
p_Jobhunter->GetMessage(msg);
}
else
{
p_Hr->GetMessage(msg);
}
}
void SetHr(Person * Hr)
{
p_Hr = Hr;
}
void SetJobhunter(Person * finder)
{
p_Jobhunter = finder;
}
};
void process()
{
Mediator * mediator = new WorkPlatform(); //中介者是工作平台
Person * student = new Jobhunter(); //一个找工作的学生
Person * byteDunceHr = new ByteDanceHr(); //我们字节跳动hr
mediator->SetHr(byteDunceHr); //中介记录
mediator->SetJobhunter(student); //中介记录
student->setMediator(mediator);
byteDunceHr->setMediator(mediator);
student->SendMessage("我想去面试你家公司");
byteDunceHr->SendMessage("想来就试试呗,可以来尝试来吧");
}
这个模式与外观模式很相似,但是还是有点区别的。