定义

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

案例
比方有一个图像界面,在界面上有一个输入框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. C#多线程编程实例 螺纹与窗口交互

    C#多线程编程实例 螺纹与窗口交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = new Thread ...

  2. Scilab 的画图函数(1)

    Scilab 的画图函数 plot 函数 最主要的是 plot 函数,与 matlab 中的plot 函数类似. xdata = linspace(1,10,50); ydata = sin(xdat ...

  3. Kohana 数据库

    只要不使用官方网站的教程,自己摸索出来的,有一个错误,当我们指了出来,哦,,好吧共同进步~ 首先配置:modules\database\config\database.php <?php 'de ...

  4. ORM武器:NHibernate(三)五个步骤+简单对象CRUD+HQL

    前面的两篇文章中.我们对NHibernate已经做了大致了解 <ORM利器:NHibernate(一)简单介绍>Nhibernate的作用:攻克了对象和数据库的转化问题 <ORM利器 ...

  5. 8、Cocos2dx 3.0三,找一个小游戏开发3.0存储器管理的版本号

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27693365 复杂的内存管理 移动设备上的硬件资源十 ...

  6. web 环境项目(intellj部署的tomcat) 重启时报 Exception in thread "HouseKeeper" java.lang.NullPointerException (转)

    Exception in thread "HouseKeeper" java.lang.NullPointerException at org.logicalcobwebs.pro ...

  7. 【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头

    摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera ...

  8. 【微信公众平台开发】百度周边搜索接口php封装

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWl2YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...

  9. Mybatis分页插件更新

    分页插件演示:http://blog.csdn.net/isea533/article/details/23831273 分页插件演示样例:http://blog.csdn.net/isea533/a ...

  10. MySQL之终端(Terminal)管理MySQL

    原文:MySQL之终端(Terminal)管理MySQL 前言:MySQL有很多的可视化管理工具,比如“mysql-workbench”和“sequel-pro-”. 现在我写MySQL的终端命令操作 ...