设计模式学习(二十五)————中介者模式
2016-10-02 21:56
232 查看
中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
注意:中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
下面以联合国处理美国和伊拉克问题作为例子:
由这个例子可以看出,联合国安全理事会类这个中介者减少了美国类和伊拉克类之间的耦合,由于中介者把对象如何协作进行了抽象,因此关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就站在更宏观的角度看待问题。但是其缺点就是中介者需要管理所有的其他各个类的事物,因此比较复杂,用的时候要谨慎。
最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/peaceWorld_Mediator_pattern_25
注意:中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
下面以联合国处理美国和伊拉克问题作为例子:
#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
相关文章推荐
- VB.net 学习设计模式(中介者模式)
- 设计模式学习笔记(二十五)——Visitor访问者
- 设计模式学习笔记之中介者模式
- 设计模式学习--------11.中介者模式学习
- 设计模式学习—Mediator(中介者)
- IOS设计模式学习(11)中介者
- 学习设计模式之禅——中介者模式
- IOS设计模式学习(11)中介者
- 【HeadFirst 设计模式学习笔记】17 中介者(Mediator)模式拾零
- 中介者模式 - 设计模式学习
- 设计模式学习日志七:中介者模式(原文转载)
- 步步为营 .NET 设计模式学习笔记 二十、Mediator(中介者模式)
- 设计模式学习笔记——中介者模式
- HeadFirst 设计模式学习笔记18--中介者(Mediator)模式拾零
- 设计模式学习笔记二十五——总结
- 步步为营 .NET 设计模式学习笔记 二十、Mediator(中介者模式)
- 设计模式学习-每日一记(20.中介者模式)
- 我是如何学习设计模式的七:中介者模式—和command模式,观察者模式有一定关系
- 设计模式学习总结(23) 中介者模式
- 设计模式学习小结(3.6)——中介者模式