频道栏目
首页 > 程序开发 > 综合编程 > 其他综合 > 正文
设计模式学习:中介者模式
2016-10-03 09:55:16         来源:冬之晓  
收藏   我要投稿

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

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

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

#ifndef UNITEDNATIONS
#define UNITEDNATIONS

#include 
#include 
#include 

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(mediator);}
    virtual ~Country() = default;
protected:
    QSharedPointer _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()<<"美国获得对方消息:"<Declare(message,this);
    }
    void GetMessage(QString message)
    {
        qDebug()<<"伊拉克获得对方消息:"<(value);
    }
    void setColleague2(Iraq * value)
    {
        _colleague2 = QSharedPointer(value);
    }
    void Declare(QString message, Country *colleague) override
    {
        if(_colleague1.data() == colleague)
            _colleague2->GetMessage(message);
        else
            _colleague1->GetMessage(message);
    }
private:
    QSharedPointer _colleague1;
    QSharedPointer _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;
}

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

点击复制链接 与好友分享!回本站首页
上一篇:设计模式学习:职责链模式
下一篇:目标文件里面到底有什么
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站