和父母一起散步

2016/10/2 愉快的一天

Posted by WangXiaoDong on October 2, 2016

时间:2016年10月2日 天气:晴:sunny:


Author:冬之晓:angry:
Email: 347916416@qq.com

    今天,天气放晴了,有一点热。早晨一早,就和爸爸妈妈到外面散步。来到了妈妈一直想去的“九州池”,
    其实就是在我们家附近的一个房地产开发区的别名,这边的房子普遍都是6k一平方米,妈妈现在非常喜欢看房子,
    因为近年来房价一直在飙升。但是我对房子不太感兴趣,哎,看来我没啥眼光,估计以后也赚不了什么钱。
    其实还有一个原因就是从小家人总是把所有东西都为我考虑好,然后现在的我就会总是在生活中少考虑到很多东西,
    现在我虽然年纪很大了,但是仍然独立能力比较差,我得想想办法了!
    中午,田田姐姐和姐夫请姥姥、我和炎炎姐姐一起去吃饭。

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

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

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

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

#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