定义

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

案例
比方有一个图像界面,在界面上有一个输入框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. codeforces #550E Brackets in Implications 结构体

    标题效果:定义集合中{0,1}\{0,1\}上的运算符"→\rightarrow",定义例如以下: 0→0=10\rightarrow 0=1 0→1=10\rightarrow ...

  2. 浅析MVC和说媒的过程

    什么是MVC? MVC 全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面 显 ...

  3. OOA/OOD/OOP(转)

    OOA Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题.OOA与结构化分析有较大的区别.OOA所强调的 ...

  4. Android 中字体的处理

    //得到TextView控件对象 TextView textView = (TextView)findViewById(R.id.custom); //将字体文件保存在assets/fonts/文件夹 ...

  5. ActivatedEventArgs.IsApplicationInstancePreserved 属性

    ActivatedEventArgs IsApplicationInstancePreserved 如果 ApplicationInstancePreserved 为 true,则表示该应用程序已休眠 ...

  6. [ExtJS5学习笔记]第22 Extjs5正在使用beforeLabelTpl添加所需的配置选项标注星号标记

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/39395753 官方样例:http://docs.sencha.com/extjs/5. ...

  7. 于ubuntu配置hadoop当问题

    1. 构造ssh登录 我们并不需要改变/etc/ssh/sshd_config 2. 新hadoop用户,home下列不hadoop夹 创建使用下面的命令 useradd -m hadoop 3. n ...

  8. row_number()、rank()、dense_rank()、ntile()

    原文:row_number().rank().dense_rank().ntile() SQL2005中row_number()等函数的用法 2005比2000新增了几个函数,分别是row_numbe ...

  9. 学生表sid,sname,结果表cid,cname,学生成绩表sid,cid,cscore,最高要求的分数输出候补课程专门命名

    --1.建表SQL: --学生表: -- Createtable createtable STUDENT ( SID   NUMBERnotnull, SNAME NVARCHAR2) ) table ...

  10. Windows下一个MySQL有些错误的解决方法

    1.无论是什么提示.我们有一个直接看错误日志.由于它描述了最具体描述错误日志. 于MySQL安装文件夹中找到 my.ini简介 看日志保存路径 2. 我的错误是[ERROR] Fatal error: ...