定义

用一个中介对象来封装一系列的对象的交互。中介者使各对象不须要显示地相互使用,从而使其耦合松散,并且能够独立的改变他们之间的交互。

案例
比方有一个图像界面,在界面上有一个输入框LineEdit,有个一个列表框ListBox,有一个buttonButton。当输入框LineEdit没有内容的时候,button是灰显,不可用的,当在LineEdit输入了正确的选项后,ListBox也会跳转到改选项,Button被激活,能够操作。相同ListBox也能够选择不同的选项,改变LineEdit的内容,当Button能够使用的时候能够删除被选中的选项,这样各个窗体间有比較强的依赖关系,能够通过将集体行为封装在一个单独的中介者Mediator对象中来避免这个问题:


Mediator定义了中介类的一个接口:
  1. class Mediator {
  2. public:
  3. virtual void showDialog() = 0;
  4. virtual void widgetChanged(Widget*) = 0;
  5. protected:
  6. Mediator();
  7. virtual void createWidgets() = 0;
  8. };
Widget是全部窗体类的基类:
  1. class Widget {
  2. public:
  3. Widget(Mediator* mediator) { m_mediator = mediator; }
  4. virtual void changed(){ }
  5. Mediator* mediator() const { return m_mediator; }
  6. private:
  7. Mediator* m_mediator;
  8. };

LineEdit类是一个文字输入窗体类:
  1. class LineEdit : public Widget {
  2. public:
  3. LineEdit(Mediator*);
  4. virtual void changed();
  5. void setText(const string& text);
  6. string text() const;
  7. private:
  8. string m_text;
  9. };
  10. void LineEdit::changed()
  11. {
  12. mediator()->widgetChanged(this);
  13. }
Button和ListBox都是继承自Widget的类,并实现了自己独有的操作。
如今创建一个DialogMediator类把全部的窗体类联系起来:
  1. class DialogMediator : public Mediator {
  2. public:
  3. virtual void widgetChanged(Widget* widget);
  4. virtual void showDialog();
  5. protected:
  6. virtual void createWidgets();
  7. private:
  8. LineEdit* m_lineEdit;
  9. ListBox* m_listBox;
  10. Button* m_button;
  11. };
  12. void DialogMediator::createWidgets()
  13. {
  14. m_lineEdit = new LineEdit();
  15. ...
  16. }
  17. void DialogMediator::widgetChanged(Widget* widget)
  18. {
  19. if(widget == m_lineEdit)
  20. {
  21. m_listBox->setSelection(m_lineEdit->text());
  22. m_button->setEnable(true);
  23. }
  24. else if(m_listBox)
  25. {
  26. m_lineEdit->setText(m_listBox->getSeletion());
  27. m_button->setEnable(true);
  28. }
  29. else
  30. {
  31. m_lineEdit->setText("");
  32. m_listBox->setSelection(lastOne);
  33. }
  34. }
  1. DialogMediator mediator;
  2. mediator.createWidgets();
  3. mediator.showDialog();
适用性
  • 一组对象以定义良好可是通过复杂的方式进行通信,产生的依赖结构混乱
  • 一个对象引用其它非常多对象而且直接与这些对象进行通信,导致难以复用该对象
  • 想定制一个分布在多个类中的行为,而不想生成太多的子类
优缺点
  1. 降低了子类的生成
  2. 将各个类进行了解耦
  3. 简化了对象协议,一对多的关系易于理解
  4. 对对象怎样协作进行了抽象
  5. 使控制集中化,使得中介者类自身庞大,难于维护

Mediator - 中介者模式的更多相关文章

  1. C++设计模式-Mediator中介者模式

    Mediator中介者模式作用:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. UML如下: Colleage抽象同事类 ...

  2. 设计模式16:Mediator 中介者模式(行为型模式)

    Mediator 中介者模式(行为型模式) 依赖关系的转化 动机(Motivation) 在软件构建过程中,经常出现多个对象互相关联交互的情况,对象之间经常会维持一种复杂的应用关系,如果遇到一些需求的 ...

  3. 设计模式 ( 十六 ): Mediator中介者模式 -- 行为型

    1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中. 对于一个模块或者系统,可能由很多对象构成,而且这些对象 ...

  4. 设计模式(17)--Mediator(中介者模式)行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以 ...

  5. 设计模式学习笔记——Mediator中介者模式

    将众多对象之间的网状关系转为全部通过一个中间对象间接发生关系,此中间对象为中介者. 看图最直观: 作用不言而喻,就是降低对象之间的耦合度,乃至降低了整个系统的复杂度. 有点象代理模式,更象外观模式:

  6. 设计模式之中介者模式(Mediator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程.它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. java设计模式之中介者模式

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

  8. 中介者模式(Mediator Pattern)

    定义一个中介对象来封装系列对象之间的交互.中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互. Mediator:中介者接口.在里面定义了各个同事之间相互交互所 ...

  9. Mediator(中介者)-对象行为型模式

    1.意图 用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 2.动机 通过将集体行为封装在一个单独的中介者对象中,中介者 ...

随机推荐

  1. MyReport报表引擎2.0.0.0新功能

    Web报表引擎:Web上的良好的打印解决方式,WinForm的打印预览体现,报表自己主动化,支持直接打印,页小计,统计,转成金额大写,一维码显示等功能,满足中国式报表的常见功能需求.Web报表编辑器: ...

  2. 【j2ee spring】30、巴巴荆楚网-综合hibernate4+spring4(5)分页

    巴巴荆楚网-综合hibernate4+spring4(5)分页 1.图文项目 2.首先我们引入对应的jar包 3.我们配置一下数据库中对应的实体对象 ProductType.java /** * 功能 ...

  3. 仿微沟道效应,主要actionbar有些知识

    仿微沟道效应,主要actionbar有些知识 1.新actionBar的menu <menu xmlns:android="http://schemas.android.com/apk ...

  4. topshelf和quartz

    topshelf和quartz内部分享 阅读目录: 介绍 基础用法 调试及安装 可选配置 多实例支持及相关资料 quartz.net 上月在公司内部的一次分享,现把PPT及部分交流内容整理成博客. 介 ...

  5. MemoryBarrier,Volatile

    使用MemoryBarrier,Volatile进行同步 上一节介绍了使用信号量进行同步,本节主要介绍一些非阻塞同步的方法.本节主要介绍MemoryBarrier,volatile,Interlock ...

  6. web前端利用HSTS(新的Web安全协议HTTP Strict Transport Security)漏洞的超级Cookie(HSTS Super Cookie)

    web前端如果想实现cookie跨站点,跨浏览器,清除浏览器cookie该cookie也不会被删除这似乎有点难,下面的教程让你完全摆脱document.cookie 1.服务器端设置HSTS 如PHP ...

  7. 一起写2048(160行python代码)

    前言: Life is short ,you need python. --Bruce Eckel 我与2048的缘,不是缘于一个玩家.而是一次,一次,重新的ACM比赛.四月份校赛初赛,第一次碰到20 ...

  8. 3D-HEVC的TAppDecorder

    一.点击项目右键设为启动项目. 二.配置文件 右键点击属性->点配置属性的Debugging,在command arguments一栏填上编码时生成的.bit文件和希望解码后文件的命名,在wor ...

  9. windows 10 install oracle 12c error:[ INS-30131 ]

    "[ INS-30131 ] the Initial Setup That Is Required to Run the Installation Program Validation Wa ...

  10. 答读者问(5):关于数学程序猿的作用、r \\ u0026研发工作的实践要求和问题,如求职的影响

    最近,有通过微博很多读者.微信沟通,我.我觉得我们学习.对于技术,我们很热情.我也学到了很多东西. 我提取了几个大家比較关心的问题予以答复.请有相同疑问的朋友參考一下. ,欢迎关注.) 版权声明:本文 ...