概要
基于OO来设计经常会产生很多对象,而这些对象之间又会相互交互影响,所以经常会导致对象间的紧耦合,为了能够避免这种紧耦合,就需要一种机制让每个对象能够很方便的跟其他对象交互而又不需要跟这些对象交叉耦合在一起。怎么做?有人会说Observer模式不就是解决这类问题的吗?确实,一点没错,Observer模式关注的是被观察主题Subject和观察者Observer之间的交互。而本文将介绍的Mediator模式也是为了解决这类问题,但关注点跟Observer有所不同,我们来看看它是怎么做的。

目的
定义一个对象来封装其他一组对象间的交互行为,减少其他对象间的耦合度,让这些对象间的交互可以更独立地被修改。
实例
考虑一个UI应用的例子,假设我们的界面需要一些窗口来显示某些内容,比如显示产品介绍视频的窗口,显示产品图片的窗口,显示跟产品视频配套的介绍文字的窗口,显示跟产品图片配套的介绍文字的窗口等。
再假设有这样的需求:
1.在显示视频窗口时需要同步显示视屏对应的文字窗口,同时还要发送消息给图片窗口。
2.显示图片窗口时需要同步显示图片对应的文字窗口同时还要发送消息给视频窗口。
因为需要同步显示和传递消息,所以不同窗口间就需要进行交互,虽然这种交互很简单,但我们还是考虑用Mediator模式来处理,看看它是怎么解除这些窗口间的耦合。
使用Mediator来处理的类图和代码如下:
class Mediator {virtual void VideoSync() = 0;virtual void ImageSync() = 0;
};
class Dialog {
public:Dialog(Mediator* md) {mMediator = md;}void SendMessage() {......}virtual void Show() = 0;
protected:Mediator* mMediator;
};
class TxtDialog : public Dialog {
public:virtual void Show() {......}
};
class VideoDialog : public Dialog {
public:virtual void Show() {......mMediator->VideoSync();}
};
class ImageDialog : public Dialog {
public:virtual void Show() {......mMediator->ImageSync();}
};
class SyncMediator : public Mediator {
public:......virtual void VideoSync() {mVideoTxt->Show();mImage->SendMessage();}virtual void ImageSync() {mImageTxt->Show();mVideo->SendMessage();}
private:TxtDialog* mImageTxt;TxtDialog* mVideoTxt;ImageDialog* mImage;VideoDialog* mVideo;
};
从实现来看, 不管是Video窗口还是Image窗口都不需要去关注跟其他窗口间处理的细节,把交互处理全部转交给了SyncMediator来做,而在SyncMediator中则封装了所有窗口间的交互工作,提供方法给窗口类使用。
应用
在实际开发中,Mediator模式的应用虽然很常见但是普遍程度以及受认可程度却远不如Observer模式等,原因就是Mediator模式的缺点跟优点一样非常明显。
优点大家应该已经都能看出来了,首先把很多逻辑都归结到Mediator类,使代码逻辑更简单而易于理解,其次降低了对象间的耦合程度,第三统一了对象间的交互规则。那么缺点呢?总结来说就一点,那就是过多的逻辑归结与一处,往往会使Mediator过于复杂,降低其他对象耦合的同时却使Mediator本身难以理解和维护,所以选用的时候需要慎重。

转载于:https://www.cnblogs.com/secbook/archive/2012/07/04/2655100.html

【设计模式系列】行为型模式之Mediator模式相关推荐

  1. Java设计模式之行为型:中介者模式

     前言: 在我们的生活中处处充斥着"中介者",比如你租房.买房.找工作.旅游等等可能都需要那些中介者的帮助,地球上国与国之间的关系异常复杂,会因为各种各样的利益关系来结成盟友或者敌 ...

  2. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

  3. Java设计模式之行为型:责任链模式

    背景: 学校规定参加校招的同学必须要请假,且要有相关人员的签字,三天以下需辅导员签字.三到七天需要系主任签字,一个星期以上需要院长签字,更多的则需要校长签字! 上图将学生.辅导员.系主任.院长.校长组 ...

  4. 设计模式【18】——中介者模式( Mediator 模式)

    文章目录 前言 一.中介者模式( Mediator 模式) 二.具体源码 1.Colleage.h 2.Colleage.cpp 3.Mediator.h 4.Mediator.cpp 5.main. ...

  5. [DP思考录]向左走,向右走: Observer模式 VS Mediator模式

    <<向左走,向右走>>曾经骗去了我无数的眼泪.一首<<遇见>>更是改变了我人生的轨迹.虽然此篇只是技术文章,但借此也缅怀那段颓废的日子: 向左走,向右走 ...

  6. Facade模式和Mediator模式

    Facade模式和Mediator模式 Facade(外观)模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用.他是为子系统中的一组接口所提供的一个一 ...

  7. 从FLC中学习的设计模式系列-创建型模式(3)-工厂方法

    工厂方法是一组方法, 他们针对不同条件返回不同的类实例,这些类一般有共同的父类. 工厂方法模式 来自: http://zh.wikipedia.org/wiki/工厂方法模式 工厂方法模式 是一种面向 ...

  8. Java/Android 设计模式系列(7)--装饰者模式

    这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是 ...

  9. 设计模式之中介者模式(mediator模式)

    引入中介者模式 中介者模式实例 中介者模式分析 引入中介者模式 大家想象一下有十个人要共同完成一个工作,他们要互相合作和沟通,并且根据对方的通知可能要改变自己的状态,但这通常会带来很多问题,流程过于复 ...

最新文章

  1. 【民间图灵奖】读《图灵的秘密》写读后感获图灵水杯
  2. linux远程连接工具
  3. python与excel结合能做什么-openpyxl怎样按行和按列读取excel
  4. ACM之常见的(C++版)问题解析
  5. 站长们 技术不是你生存的全部
  6. android 除了webview 浏览器控件,AgentWeb是基于Android WebView一个功能完善小型浏览器库...
  7. 日常生活小技巧 -- word中插入visio和视频
  8. sysfs API总结
  9. 多线程断点续传下载软件-闪电下载2009
  10. 上海理工大学第二届“联想杯”全国程序设计邀请赛 - Experiment Class(几何+三分套三分)
  11. Hive Udf Rank
  12. 量子计算机与GIS,量子计算机系列---开篇,原理
  13. ArcPy常用基础功能
  14. 接口测试第三课(HTTP协议简介) -- 转载
  15. supervisor安装使用
  16. 【C++】火车站的列车调度
  17. 笔记本键盘两个ctrl键同时失灵怎么解决?
  18. Linux常用 bash命令
  19. 期货开户公司交返怎么申请?
  20. cad2006安装未找到html文件,我的CAD已安装在D驱动器上,但是在打开dwg文件时,它提示找不到C...

热门文章

  1. 数据之路 Day5 - Python基础5
  2. commons-csv 使用记叙
  3. 具体解释VB中连接access数据库的几种方法
  4. 【css】我的 css 框架——base.css
  5. 玻璃体混浊不要转眼球
  6. Error while retrieving the leader gateway. Retrying to connect to akka.tcp://flink@laptop:xxxx
  7. 传递函数尾1法和首1法及具体举例+H(s)与H(z)在书中出现的目的
  8. xfce4的面板只能看见日期没法看见具体时刻
  9. python连接neo4j
  10. HTTP 与HTTPS的结构