定义
中介者模式(mediator),使用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互调用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
代码例子
#include <iostream>
#include <string>
using namespace std;
class medium;
class person
{
public:
person(){}
virtual ~person(){}
virtual void setM(medium* m){}
virtual void get(string msg){}
virtual void send(string msg){}
protected:
medium* m_med;
};
class medium
{
public:
medium(){}
virtual ~medium(){}
virtual void setS(){}
virtual void setB(){}
virtual void send(string msg, person* p){}
};
class Sell : public person //卖方
{
public:
Sell(){}
virtual ~Sell(){}
void setM(medium* m){m_med = m;}
void get(string msg){cout << "sell get message:" << msg << endl;}
void send(string msg){m_med->send(msg, this);}
};
class Consumer : public person //买方
{
public:
Consumer(){}
virtual ~Consumer(){}
void setM(medium* m){m_med = m;}
void get(string msg){cout << "consumer get message:" << msg << endl;}
void send(string msg){m_med->send(msg, this);}
};
class broker : public medium //房产中介
{
public:
broker(){}
virtual ~broker(){}
virtual void setS(person* s){m_S = s;}
virtual void setB(person* b){m_B = b;}
virtual void send(string msg, person* p)
{
if (p == m_S)
{
m_B->get(msg);
}
else
{
m_S->get(msg);
}
}
protected:
person* m_S;
person* m_B;
};
int main()
{
Sell s;
Consumer c;
broker b;
s.setM(&b);
c.setM(&b);
b.setB(&c);
b.setS(&s);
c.send("我想买一套江北新区的房子");
s.send("我有一套精装修房子200W卖");
c.send("便宜点卖给我吧");
return 0;
}
sell get message:我想买一套江北新区的房子
consumer get message:我有一套精装修房子200W卖
sell get message:便宜点卖给我吧
优缺点
中介者模式很容易在系统中使用,也很容易被误用。当系统中出现“多对多”交互复杂的对象群时,不要急于使用中介者模式,而是先反思系统在设计上是不是合理。
针对上面的代码例子,做说明如下
去耦合
medium的出现减少了各个person之间的耦合,使得可以独立地改变和复用各个person和medium。比如,某个person的改变不会影响别人,只需要broker发生变化就可以
结构简明
中介者被抽象成一个类medium,这样由原理关注各个person之间的联系,转移到关注medium这个类,站在了一个更简明、宏观的角度看系统。