中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使类之间的交互统一放在中介者类中进行控制,使代码易于维护。
就像现实中的一个媒人作用,当两个年轻人不好意思直接找对象时,可以通过找媒人帮忙进行,就算不合适,也只要告诉媒人进行转达即可,免去了尴尬。
优点:1、降低了类的复杂度,将一对多转化成了一对一。 2、减小了类之间的耦合度,明确各类之间的相互作用。 3、符合迪米特原则。4、提高代码的重用性。
缺点:中介者会庞大,变得复杂难以维护。
类图如下:
示例代码如下:
#include <iostream>
#include <string>
using namespace std;
/* 声明两个关联度很大的类 */
class Woman;
class Man;
/* 中介类 */
class Mediator
{
public:
void setMan(Man *man);
void setWoman(Woman *woman);
void getParter();
public:
Man *pMan;
Woman *pWoman;
};
/* 男人类 */
class Man
{
public:
Man(string name, int sex, int cond, Mediator* m)
{
m_name = name;
m_sex = sex;
m_cond = cond;
mediator = m;
}
string getName()
{
return m_name;
}
int getSex()
{
return m_sex;
}
int getCond()
{
return m_cond;
}
/* 通过设置中介类的条件,找对象 */
void getParter(Woman* p)
{
/* 告诉中介类,我是男方,我看上了女方p,帮我去看看我方的条件,能不能满足 */
mediator->setMan(this);
mediator->setWoman(p);
mediator->getParter();
}
public:
string m_name;
int m_sex;
int m_cond;
Mediator* mediator;
};
class Woman
{
public:
Woman(string name, int sex, int cond, Mediator* m)
{
m_name = name;
m_sex = sex;
m_cond = cond;
mediator = m;
}
string getName()
{
return m_name;
}
int getSex()
{
return m_sex;
}
int getCond()
{
return m_cond;
}
/* 告诉中介类,我是女方,我看上了男方p,帮我去看看我方的条件,能不能满足 */
void getParter(Man* p)
{
mediator->setWoman(this);
mediator->setMan(p);
mediator->getParter();
}
private:
string m_name;
int m_sex;
int m_cond;
Mediator* mediator;
};
void Mediator::setMan(Man *man)
{
this->pMan = man;
}
void Mediator::setWoman(Woman *woman)
{
this->pWoman = woman;
}
void Mediator::getParter()
{
if (pMan->getSex() == pWoman->getSex())
{
cout << "同性恋之间不能结婚" << endl;
return;
}
if (pMan->getCond() == pWoman->getCond())
{
cout << "男方:" << pMan->getName() << "和女方:" << pWoman->getName() <<
" 简直就是绝配" << endl;
}
else
{
cout << "男方: " << pMan->getName() << "和女方:" << pWoman->getName() <<
" 条件不符,不是一对" << endl;
}
return;
}
void main()
{
Mediator* mediator = new Mediator;
Man *pMan = new Man("小刚", 1, 21, mediator);
Woman *pWoman = new Woman("小红", 0, 21, mediator);
Man *pMan2 = new Man("小明", 1, 22, mediator);
pMan2->getParter(pWoman);
pMan->getParter(pWoman);
delete pMan;
delete pMan2;
delete pWoman;
delete mediator;
system("pause");
return;
}
运行结果如下: