定义

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

案例
比方有一个图像界面,在界面上有一个输入框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. 【SEO 决胜网络索引】 课程大纲及第一部分第一课:网络营销战略中的索引

    内容简介 1.课程大纲 2.第一部分第一课: 网络营销战略中的索引 3.第一部分第二课预告: 索引是什么 课程大纲 现在是网络为王的时代,人们越来越离不开互联网: SEO(Search Engine ...

  2. 在前端一定要了解的HTML,CSS知识

    盒子模型 每个盒子都有4个属性:内容(content).填充(padding).边框(border).边界(margin) 每个属性都有四个部分:上.右.下.左 块级元素 内联元素 块级元素(bloc ...

  3. OpenCV——Delaunay三角 [转载]

    从这个博客转载 http://blog.csdn.net/raby_gyl/article/details/17409717 请其它同学转载时注明原始文章的出处! Delaunay三角剖分是1934年 ...

  4. 在python正在使用mysql

    缘由 近期在折腾一个小东西须要抓取网上的页面.然后进行解析.将结果放到数据库中. 了解到Python在这方面有优势,便选用之. 由于我有台server上面安装有mysql,自然使用之.在进行数据库的这 ...

  5. redis内存管理代码的目光

    zmalloc.h /* zmalloc - total amount of allocated memory aware version of malloc() * * Copyright (c) ...

  6. 2014.06.14 GlusterFS技术交流视频

    6月14线下GlusterFS视频交流.高清视频是非常好的,我初听言论方面,谈到迅速,似乎不是很清楚,讲座结束后速度需要改进.谢谢能力的天空AbleSky高大内设,谢谢学生参加. 在线公开课:http ...

  7. Script:SQL调优健康检查脚本

    Script:SQL调优健康检查脚本 http://www.askmaclean.com/archives/sql-tuning-health-check-script.html 以下脚本可以用于收集 ...

  8. curl 要么 file_get_contents 获得授权页面的方法的必要性

    今天,需要工作,需要使用 curl / file_get_contents 获得授权的必要性(Authorization)的页面内容.解决后写了这篇文章分享给大家. php curl 扩展,可以在se ...

  9. SQL入门学习0-数据库与SQL

    1.1 DBMS DatabaseManagermentSystem 数据库管理系统 DBMS种类 层次型数据库(HDB) 最古老的数据库之一,把数据通过层次结构的方式表现. 关系型数据库(RDB) ...

  10. window.open的小技巧分享(转)

    今天再次谈起window.open是因为发现了一个比较好玩的小技巧,详细内容我们稍后详细说明.       聊到window.open,不得不说明一下他的使用方法,主要有两种形式:   window. ...