一、定义

又称为调停者模式,定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。

二、结构

组成:

  ● 抽象中介者(Mediator)角色:定义统一的接口用于各同事角色之间的通信,其中主要方法是一个(或多个)事件方法。

  ● 具体中介者(ConcreteMediator)角色:实现了抽象中介者所声明的事件方法。具体中介者知晓所有的具体同事类,并负责具体的协调各同事对象的交互关系。

  ● 抽象同事类(Colleague)角色:定义出中介者到同事角色的接口。同事角色只知道中介者而不知道其余的同事角色。与其他的同事角色通信的时候,一定要通过中介者角色协作。

  ● 具体同事类(ConcreteColleague)角色:所有的具体同事类均从抽象同事类继承而来。实现自己的业务,在需要与其他同事通信的时候,就与持有的中介者通信,中介者会负责与其他的同事交互。

代码结构

 //抽象中介者类
public interface IMediator
{
/**
* 同事对象在自身改变的时候来通知中介者的方法
* 让中介者去负责相应的与其他同事对象的交互
*/
void Changed(Colleague c);
} //抽象同事类
public abstract class Colleague
{
//持有一个中介者对象
private IMediator _mediator;
/**
* 构造函数
*/
public Colleague(IMediator mediator)
{
this._mediator = mediator;
}
/**
* 获取当前同事类对应的中介者对象
*/
public IMediator GetMediator()
{
return _mediator;
}
} //具体中介者类
public class ConcreteMediator : IMediator
{
//持有并维护同事A
private ConcreteColleagueA _colleagueA;
//持有并维护同事B
private ConcreteColleagueB _colleagueB; public void SetColleagueA(ConcreteColleagueA colleagueA)
{
this._colleagueA = colleagueA;
} public void SetColleagueB(ConcreteColleagueB colleagueB)
{
this._colleagueB = colleagueB;
} public void Changed(Colleague c)
{
/**
* 某一个同事类发生了变化,通常需要与其他同事交互
* 具体协调相应的同事对象来实现协作行为
*/
}
} //具体同事类
public class ConcreteColleagueA : Colleague
{ public ConcreteColleagueA(IMediator mediator) : base(mediator)
{
}
/**
* 示意方法,执行某些操作
*/
public void Operation()
{
//在需要跟其他同事通信的时候,通知中介者对象
GetMediator().Changed(this);
}
}
public class ConcreteColleagueB : Colleague
{ public ConcreteColleagueB(IMediator mediator) : base(mediator)
{
}
/**
* 示意方法,执行某些操作
*/
public void Operation()
{
//在需要跟其他同事通信的时候,通知中介者对象
GetMediator().Changed(this);
}
}

三、适用场景

1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。

2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

应用实例

1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。

2、机场调度系统。

3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

四、优缺点

  优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

  缺点:中介者会庞大,变得复杂难以维护。

五、实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DesignPatterns.Mediator
{
class Program
{
static void Main(string[] args)
{
MessageMediator mediator = new MessageMediator(); ConcreteColleagueA a = new ConcreteColleagueA(mediator, "A");
ConcreteColleagueB b = new ConcreteColleagueB(mediator, "B");
ConcreteColleagueC c = new ConcreteColleagueC(mediator, "C"); mediator.SetColleagueA(a);
mediator.SetColleagueB(b);
mediator.SetColleagueC(c); mediator.Chat(a, "中午吃啥饭?");
Console.WriteLine("===="); mediator.Chat(b, "我想吃刀削面");
Console.WriteLine("===="); mediator.Chat(c, "我也想吃刀削面");
Console.WriteLine("===="); mediator.Chat(a, "行,那中午一起去吃刀削面吧");
}
} //抽象中介者类
public interface IMediator
{
void Chat(Colleague c, string message);
} //抽象同事类
public abstract class Colleague
{
private string name;
//持有一个中介者对象
private IMediator _mediator; public Colleague(IMediator mediator, string name)
{
this._mediator = mediator;
this.name = name;
}
/**
* 获取当前同事类对应的中介者对象
*/
public IMediator GetMediator()
{
return _mediator;
} /**
* 获取昵称
*/
public string getName()
{
return name;
} /**
* 接收消息
*/
public abstract void receive(string message); /**
* 发送消息
*/
public abstract void send(string message);
} //具体中介者类
public class MessageMediator : IMediator
{
//持有并维护同事A
private ConcreteColleagueA _colleagueA;
//持有并维护同事B
private ConcreteColleagueB _colleagueB; private ConcreteColleagueC _colleagueC; public void SetColleagueA(ConcreteColleagueA colleagueA)
{
this._colleagueA = colleagueA;
} public void SetColleagueB(ConcreteColleagueB colleagueB)
{
this._colleagueB = colleagueB;
}
public void SetColleagueC(ConcreteColleagueC colleagueC)
{
this._colleagueC = colleagueC;
} public void Chat(Colleague c, string message)
{
if (_colleagueA != null)
{
_colleagueA.send(message);
_colleagueB.receive(message);
_colleagueC.receive(message);
}
else if (_colleagueB != null) {
_colleagueB.send(message);
_colleagueA.receive(message);
_colleagueC.receive(message);
} else if (_colleagueC != null) {
_colleagueC.send(message);
_colleagueA.receive(message);
_colleagueB.receive(message);
}
}
} //具体同事类
public class ConcreteColleagueA : Colleague
{ public ConcreteColleagueA(IMediator mediator, string name) : base(mediator, name)
{
}
/**
* 示意方法,执行某些操作
*/
public void Operation(string message)
{
//在需要跟其他同事通信的时候,通知中介者对象
GetMediator().Chat(this, message);
} public override void receive(String message)
{
Console.WriteLine("【A】收到消息:【" + message + "】");
} public override void send(String message)
{
Console.WriteLine("【A】发出消息:【" + message + "】");
}
}
public class ConcreteColleagueB : Colleague
{ public ConcreteColleagueB(IMediator mediator, string name) : base(mediator, name)
{
}
/**
* 示意方法,执行某些操作
*/
public void Operation(string message)
{
//在需要跟其他同事通信的时候,通知中介者对象
GetMediator().Chat(this, message);
} public override void receive(String message)
{
Console.WriteLine("【B】收到消息:【" + message + "】");
} public override void send(String message)
{
Console.WriteLine("【B】发出消息:【" + message + "】");
}
} public class ConcreteColleagueC : Colleague
{ public ConcreteColleagueC(IMediator mediator, string name) : base(mediator, name)
{
}
/**
* 示意方法,执行某些操作
*/
public void Operation(string message)
{
//在需要跟其他同事通信的时候,通知中介者对象
GetMediator().Chat(this, message);
} public override void receive(String message)
{
Console.WriteLine("【C】收到消息:【" + message + "】");
} public override void send(String message)
{
Console.WriteLine("【C】发出消息:【" + message + "】");
}
}
}

结果

【A】发出消息:【中午吃啥饭?】
【B】收到消息:【中午吃啥饭?】
【C】收到消息:【中午吃啥饭?】
====
【A】发出消息:【我想吃刀削面】
【B】收到消息:【我想吃刀削面】
【C】收到消息:【我想吃刀削面】
====
【A】发出消息:【我也想吃刀削面】
【B】收到消息:【我也想吃刀削面】
【C】收到消息:【我也想吃刀削面】
====
【A】发出消息:【行,那中午一起去吃刀削面吧】
【B】收到消息:【行,那中午一起去吃刀削面吧】
【C】收到消息:【行,那中午一起去吃刀削面吧】

参考:

http://www.cnblogs.com/JsonShare/p/7263876.html

http://www.runoob.com/design-pattern/mediator-pattern.html

欢迎阅读本系列文章:Head First设计模式之目录

Head First设计模式之中介者模式的更多相关文章

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

    原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...

  2. 折腾Java设计模式之中介者模式

    博文原址:折腾Java设计模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并 ...

  3. js设计模式——8.中介者模式

    js设计模式——8.中介者模式 /*js设计模式——中介者模式*/ class A { constructor() { this.number = 0; } setNumber(num, m) { t ...

  4. 【GOF23设计模式】中介者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_中介者模式.同事协作类.内部类实现 package com.test.mediator; /** * 同事类的接口 */ ...

  5. [设计模式] 17 中介者模式 Mediator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...

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

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

  7. 设计模式之中介者模式(Mediator )

    中介者模式是关于数据交互的设计模式,该模式的核心是一个中介者对象,负责协调一系列对象之间的不同的数据请求,这一系列对象成为同事类.如房产中介(简直不想提它),买房的卖房的,租房的放租的都到房产中介那里 ...

  8. PHP设计模式系列 - 中介者模式

    中介者模式 中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改.一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式. ...

  9. 深入理解JavaScript系列(36):设计模式之中介者模式

    介绍 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 主要内容来自:http://www ...

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

    本文继续23种设计模式系列之中介者模式.   定义 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互.   角色 抽象中介者: ...

随机推荐

  1. Hbuilder app开发,使用mui.ajax和服务器交互,后台获取不到值,显示null的解决方法

    先上一个能用的js代码: function login() { var uname=document.getElementById("username").value.trim() ...

  2. JavaWeb 之文件的上传下载

    又到了每周更新博客的时候了,每看到自己发布的随笔阅读量上涨的时候就特别开心,我也会尽自己的努力提高自己的水平,总结出通俗易读的学习笔记,还望大家能多多支持!!! ------------------- ...

  3. 《Linux调优工具oprofile的演示分析》

    根据CPU架构oprofile采样的触发有两种模式:1) NMI模式: 利用处理器的performance counter功能, 指定counter的类型type和累进数量count. 比如 type ...

  4. CentOS6.5安装MySQL5.6

    CentOS6.5安装MySQL5.6,开放防火墙3306端口,允许其他主机使用root账户密码访问MySQL数据库 查看操作系统相关信息 ** 该查看方法只适用于CentOS6.5 (lsb_rel ...

  5. Ubuntu 编译安装 OpenCV 3.1

    目标系统:Ubuntu 16.04-64bit OpenCV 版本:opencv-3.1.0 安装步骤 安装 cmake.sudo apt-get isntall cmake cmake-qt-gui ...

  6. springboot+多数据源配置

    作者:纯洁的微笑 出处:http://www.ityouknow.com/ 起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多 ...

  7. 单点登录,session,jsonp(待更新)

    单点登录理解: 单点登录系统设计: ajax跨域:

  8. Android打赏功能:支付宝转账

    适用于个人开发者开发的APP中,让用户打赏给作者,实质上进行支付宝转账到指定账号的功能. 一.打开'支付宝'APP ,点击'收款'功能 ,将收款码(二维码)图片保存到手机上(进一步移到电脑上). 二. ...

  9. 对Java中堆栈的解析

    Java把内存分为两种:一种是栈内存,一种是堆内存 栈内存:在函数中定义的一些基本类型的变量和对象的引用变量,当超过变量的作用域之后,Java自动释放该变量内存 堆内存:存放new创建的对象和数组,由 ...

  10. iOS实现类似QQ的好友列表,自由展开折叠(在原来TableView的基础上添加一个字典,一个Button)

    //直接代码 只包含 折叠展开字典的处理搭建#import "CFViewController.h" @interface CFViewController ()<UITab ...