在很多情况下对象之间的交互是很复杂的,在开始设计的时候,你根本不知道它需要交互的对象是谁,是什么类型。我们知道如果要对象A与对象B之间能相互交互,A与B就会构成相互依赖,如果对象一多,这种依赖就会很复杂,况且很多时候我们都不知道需要互相交互的对象有哪些,因此,在设计的时候也没办法考虑这些情况。既然在设计的时候无法预先知道对象之间的交互具体情况,我们可以将这种交互放到一个“中间平台”进行,这个中间平台知道所有对象的(依赖于所有对象,但对象是否必须依赖于平台不是必须的),这样就将对象之间的依赖简化成对象与“平台”之间的依赖,因而会大大降低对象之间的复杂度。当然,对象在平台能够进行交互,必须遵守一定的协议,而且这个平台需要知道所有对象的细节。(这在开发实现时其实算不上什么条件,比如Delphi和C#,Java所有的类都有一个共同的基类,因此不需要额外的为这些交互的对象定义一个抽象的接口之类的)。这种平台起到的作用就是一种中介的作用。

《设计模式》疑问对中介模式的定义:用一个中介对象来封装一系列的对象(同事对象)交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

中介模式有三个角色:一个是抽象同事,这个角色的定义纯粹是为了使得中介者在定义交互方法的参数时能形式统一,不依赖于具体的同事(一般情况下不需要定义这个抽象类,因为常见的开发语言都有一个基本的类类型(如Delphi,C#的Object类)),二是具体同事类(要交互的对象,可以是已有的,现定义的等),三是中介。下面是中介模式的简图:

示例:

public struct Mediator_Param
{
  public string Name;
  public string Value; 
}
/// <summary>
/// Mediator 的摘要说明。
/// </summary>
public abstract class Mediator_Mediator
{
  //定义中介者的其它共同属性
  //下面的属性一般用事件处理,比较好
  public  abstract void ConcreateColleagueADataChange(Mediator_Colleague sender, Mediator_Param Param);
  public  abstract void ConcreateColleagueBDataChange(Mediator_Colleague sender, Mediator_Param Param);
}
public class Mediator_ConcreateMediator : Mediator_Mediator
{
  private Mediator_ConcreateColleagueA concreateColleagueA;
  private Mediator_ConcreateColleagueB concreateColleagueB;
  public override void ConcreateColleagueADataChange(Mediator_Colleague sender, Mediator_Param Param)
  {
           if(Param.Name=="tian")
      concreateColleagueB.ShowValue(Param.Value); 
  }
  public override void ConcreateColleagueBDataChange(Mediator_Colleague sender, Mediator_Param Param)
  {
   concreateColleagueB.ShowValue(Param.Name+"  "+Param.Value); 
  }
  public void IntroduceConcreateMediator(Mediator_ConcreateColleagueA concreateColleagueA,Mediator_ConcreateColleagueB concreateColleagueB)
  {
   this.concreateColleagueA = concreateColleagueA;
   this.concreateColleagueB = concreateColleagueB;
  }
  public Mediator_ConcreateMediator()
  {
  }
}
public abstract class  Mediator_Colleague
{

}
public class Mediator_ConcreateColleagueA : Mediator_Colleague
{
  private Mediator_Mediator mediator;
  public Mediator_ConcreateColleagueA(Mediator_Mediator mediator)
  {
   this.mediator = mediator;
  }
  public void DataChanged()
  {
   if(mediator!=null)
   {
    Mediator_Param param;
    param.Name = "tian";
    param.Value="121212";
    mediator.ConcreateColleagueADataChange(this,param);
   }
  }
}
public class Mediator_ConcreateColleagueB : Mediator_Colleague
{
  private Mediator_Mediator mediator;
  public Mediator_ConcreateColleagueB(Mediator_Mediator mediator)
  {
   this.mediator = mediator;
  }
  public void DataChanged()
  {
   if(mediator!=null)
   {
    Mediator_Param param;
    param.Name = "zhang";
    param.Value="888888";
    mediator.ConcreateColleagueBDataChange(this,param);
   }
  }
  public void ShowValue(string Value)
  {
   System.Windows.Forms.MessageBox.Show(Value);
  }
}
public class Mediator_Client
{
  public static void Test()
  {
   Mediator_ConcreateMediator mediator = new Mediator_ConcreateMediator();
   Mediator_ConcreateColleagueA mcA= new Mediator_ConcreateColleagueA(mediator);
            Mediator_ConcreateColleagueB mcB= new Mediator_ConcreateColleagueB(mediator);
   mediator.IntroduceConcreateMediator(mcA,mcB);
   mcA.DataChanged();
   mcB.DataChanged();
  }
}

中介模式的优点:

减少子类生成;将同事类解耦;简化了对象之间的协议;对对象如何协作进行了抽象;使控制集中化;

中介模式的实现改进:

1)由于一般开发语言都有一个基本父类,因此如果采用这个基本的类作为抽象同事,则在实现时不需要显示定义。

2)采用事件或者消来进行对象之间的交互,则可以使得同事对象不依赖于中介,进一步解耦中介与对象之间的关系。

典型应用场景:

1)现实生活中的各种交互平台(比如交易所,超市,集市,购物广场,交易会,网络论坛等),特别注意,现实中的很多中介公司(比如留学服务中介等)的中介含义还是与中介模式中的中介含义不太一样,它们除了体现一种“中介”外,还有“代理”的味道在里面。中介模式中的中介其实仅提供一个交互的平台,具体的交互还是对象之间来完成的

2)开发系统中的用户UI界面。

比较:

中介者模式与门面模式虽然有类似的功能,但两者之间的区别还是很大的,门面模式时为用户使用一系列的对象提供一个简化的接口,更多体现的是一种“代理”而不是“中介”;而中介者模式主要是为一系列的对象提供一个交互的场所,中介者对象封装了一系列对象之间的交互,中介者模式中没有用户的角色概念,也不向外提供服务。

设计模式之--中介者模式相关推荐

  1. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互 ...

  2. 设计模式(中介者模式-对象去耦)

    声明:本系列文章内容摘自<iOS设计模式> 中介者模式 用一个对象来封装一系列对象的交互方式.中介者使个对象不需要显式地相互调用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 何时 ...

  3. Java设计模式之中介者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  4. 软件设计模式之中介者模式实验

    软件设计模式之中介者模式实验 一.实验目的 掌握软件设计模式中的中介者模式,能够用中介者模式编写程序,解决实际问题. 二.实验内容与要求 内容:有个租房中介为房主和租赁人提供租房服务,请用中介者模式对 ...

  5. 走穿java23种设计模式--18中介者模式详解

    走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...

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

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

  7. 设计模式复习-中介者模式

    #pragma once #include "stdafx.h" #include<map> #include<set> #include<strin ...

  8. 【设计模式】中介者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.中介者模式简介 二.中介者模式适用场景 三.中介者模式优缺点 四.中介者模式 与 观察者模式 五.中介者模式 代码示例 1.聊天室 2.用户 3.运行实例 一.中介者模式简介 中介者模式 ...

  9. 再起航,我的学习笔记之JavaScript设计模式23(中介者模式)

    中介者模式 概念介绍 中介者模式(Mediator):通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用降低他们之间的耦合,有时中介者对象也可以改变对象之间的交互. 创建一个中介 中介者模 ...

  10. Javascript设计模式之中介者模式

    前言:菜鸡也有梦想,而我的梦想就是进一个真正的互联网大厂.以前学习的时候没有系统的整理,从今天开始要保持每周写博客的习惯,希望自己可以有所成长.为了培养编程思维,决定从设计模式开始写起.我是通过读&l ...

最新文章

  1. 做人工智能必看的45篇论文 | 附下载地址
  2. 【转】 vi常用操作
  3. android cpu hotplug,[MTK] [CPU DVFS/Hotplug]运行时,把CPU固定在特定频率/特定核数的办法...
  4. mongodb按照时间分组统计
  5. yum因被锁定导致无法执行相关操作的解决方法
  6. 133_Power BI 报表服务器2020年1月版本更新亮点
  7. 吴恩达深度学习CNN作业:Convolutional Neural Networks: Application
  8. 推荐7 款实用好用的电脑软件
  9. 计算机技能 微信小程序,利用微信电脑最新版 反编译微信小程序 无需root
  10. svg, ttf, woff, woff2图标的转换
  11. python爬今日头条组图_python 爬虫抓取今日头条街拍图片
  12. 计算机网络工程职业学院,湖南网络工程职业学院理工学院
  13. 2-5 修理牧场【优先队列/最小堆】
  14. append()、appendChild() 和 innerHTML 的区别
  15. 高斯型随机粗糙面MATLAB仿真
  16. 超市收银系统c语言,C语言超市收银系统.docx
  17. 【Go语言实战】(8) Go语言并发爬虫
  18. 信息时代电子阅览室服务
  19. 企业告警平台示设计图及自定义数据说明
  20. PostgreSQL之Sequence序列(转)

热门文章

  1. 流媒体播放器播放h264编码视频与h265编码视频哪个更清晰?
  2. python correlate_关于numpy互相关函数np.correlate的一点疑问
  3. 使用WGCLOUD来统计用户日活周活月活
  4. 智佩店装完成千万级天使轮融资,深耕连锁店装
  5. Codeforces Round #439 (Div. 2) C.The Intriguing Obsession(组合数、记忆化搜索)
  6. Dart笔记(10):Runes
  7. putty怎么上传下载文件和目录
  8. 数据可视化Echarts学习指南
  9. 用sql查询姓名和身份证_查询,更新和身份
  10. canvas绘制刮刮卡,超过一定面积显示全图