中介者模式(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;
}

运行结果如下: