您的位置:首页 > 其它

设计模式学习(二十五)————中介者模式

2016-10-02 21:56 232 查看
中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互

注意:中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。

下面以联合国处理美国和伊拉克问题作为例子:

#ifndef UNITEDNATIONS
#define UNITEDNATIONS

#include <QString>
#include <QDebug>
#include <QSharedPointer>

class Country;
class UnitedNations   //联合国机构
{
public:
virtual void Declare(QString message, Country* colleague) = 0;
virtual ~UnitedNations() = default;
};

class Country   //国家类
{
public:
explicit Country(UnitedNations* mediator){_mediator = QSharedPointer<UnitedNations>(mediator);}
virtual ~Country() = default;
protected:
QSharedPointer<UnitedNations> _mediator;
};

class USA final : public Country   //美国类
{
public:
explicit USA(UnitedNations* mediator):Country(mediator){}
void Declare(QString message)
{
_mediator->Declare(message,this);
}
void GetMessage(QString message)
{
qDebug()<<"美国获得对方消息:"<<message;
}
};

class Iraq final : public Country   //伊拉克类
{
public:
explicit Iraq(UnitedNations* mediator):Country(mediator){}
void Declare(QString message)
{
_mediator->Declare(message,this);
}
void GetMessage(QString message)
{
qDebug()<<"伊拉克获得对方消息:"<<message;
}
};

class UnitedNationsSecurityCouncil final : public UnitedNations   //联合国安全理事会类
{
public:
void setColleague1(USA * value)
{
_colleague1 = QSharedPointer<USA>(value);
}
void setColleague2(Iraq * value)
{
_colleague2 = QSharedPointer<Iraq>(value);
}
void Declare(QString message, Country *colleague) override
{
if(_colleague1.data() == colleague)
_colleague2->GetMessage(message);
else
_colleague1->GetMessage(message);
}
private:
QSharedPointer<USA> _colleague1;
QSharedPointer<Iraq> _colleague2;
};

#endif // UNITEDNATIONS

#include "unitednations.h"

int main()
{
UnitedNationsSecurityCouncil* UNSC = new UnitedNationsSecurityCouncil;

USA* c1 = new USA(UNSC);
Iraq* c2 = new Iraq(UNSC);

UNSC->setColleague1(c1);
UNSC->setColleague2(c2);

c1->Declare("不准研发核武器,否则要发动战争!");
c2->Declare("我们没有核武器,也不怕侵略。");

return 0;
}


由这个例子可以看出,联合国安全理事会类这个中介者减少了美国类和伊拉克类之间的耦合,由于中介者把对象如何协作进行了抽象,因此关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就站在更宏观的角度看待问题。但是其缺点就是中介者需要管理所有的其他各个类的事物,因此比较复杂,用的时候要谨慎。

最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/peaceWorld_Mediator_pattern_25
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式