中介者模式(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; }
运行结果如下: