设计模式之美:Mediator(中介者)
索引
意图
用一个中介对象来封装一系列的对象交互。
中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
Define an object that encapsulates how a set of objects interact.
Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.
结构

一个典型的对象结构:

参与者
Mediator
- 中介者定义一个接口用于与各同事对象通信。
ConcreteMediator
- 具体中介者通过协调各同事对象实现协作行为。
- 了解并维护它的各个同事。
Colleague
- 每一个同事类都知道它的中介者。
- 每一个同事对象在需与其他同事通信时,与它的中介者通信。
适用性
在以下情况下可以使用 Mediator 模式:
- 一组对象定义良好但是使用复杂的通信方式。产生的相互依赖关系结构混乱且难以理解。
- 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
- 想定制一个分布在多个类中的行为,而又不想生成太多的子类。
效果
- 减少了子类的生成。
- 将各个同事类解耦。
- 它简化了对象协议。
- 它对对象如何协作进行了抽象。
- 它使控制集中化。
相关模式
- Facade 模式与 Mediator 模式的不同之处在于它是对一个对象子系统进行抽象,从而提供了一个更为方便的接口。它的协议是单向的,即 Facade 对象对这个子系统类提出要求,但反之则不行。Mediator 提供了各 Colleague 对象不支持或不能支持的协作行为,而协议是多向的。
- Colleague 可以使用 Observer 模式与 Mediator 通信。
实现
实现方式(一):Mediator 模式结构样式代码。
Colleague-Mediator 的通信中,当一个感兴趣的事件发生时,Colleague 必须与其 Mediator 通信。
一种方式是使用 Observer 模式,将 Mediator 实现为一个 Observer,各 Colleague 作为 Subject。
另一种方式是在 Mediator 中定义一个特殊的通知接口,各 Colleague 在通信时直接调用该接口。
namespace MediatorPattern.Implementation1
{
public abstract class Colleague
{
protected Mediator _mediator; public Colleague(Mediator mediator)
{
_mediator = mediator;
} public abstract void Send(string message);
public abstract void Notify(string message);
} public abstract class Mediator
{
public abstract void SendMessage(Colleague sender, string message);
} public class ConcreteMediator : Mediator
{
private ConcreteColleague1 _colleague1;
private ConcreteColleague2 _colleague2; public ConcreteColleague1 Colleague1
{
set { _colleague1 = value; }
} public ConcreteColleague2 Colleague2
{
set { _colleague2 = value; }
} public override void SendMessage(Colleague sender, string message)
{
if (sender == _colleague1)
{
_colleague2.Notify(message);
}
else if (sender == _colleague2)
{
_colleague1.Notify(message);
}
}
} public class ConcreteColleague1 : Colleague
{
public ConcreteColleague1(Mediator mediator)
: base(mediator)
{
} public override void Send(string message)
{
_mediator.SendMessage(this, message);
} public override void Notify(string message)
{
Console.WriteLine("Colleague1 gets message: " + message);
}
} public class ConcreteColleague2 : Colleague
{
public ConcreteColleague2(Mediator mediator)
: base(mediator)
{
} public override void Send(string message)
{
_mediator.SendMessage(this, message);
} public override void Notify(string message)
{
Console.WriteLine("Colleague2 gets message: " + message);
}
} public class Client
{
public void TestCase1()
{
var mediator = new ConcreteMediator(); var colleague1 = new ConcreteColleague1(mediator);
var colleague2 = new ConcreteColleague2(mediator); mediator.Colleague1 = colleague1;
mediator.Colleague2 = colleague2; colleague1.Send("How are you?");
colleague2.Send("Fine, Thank you!");
}
}
}
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
设计模式之美:Mediator(中介者)的更多相关文章
- 设计模式16:Mediator 中介者模式(行为型模式)
Mediator 中介者模式(行为型模式) 依赖关系的转化 动机(Motivation) 在软件构建过程中,经常出现多个对象互相关联交互的情况,对象之间经常会维持一种复杂的应用关系,如果遇到一些需求的 ...
- 设计模式学习笔记——Mediator中介者模式
将众多对象之间的网状关系转为全部通过一个中间对象间接发生关系,此中间对象为中介者. 看图最直观: 作用不言而喻,就是降低对象之间的耦合度,乃至降低了整个系统的复杂度. 有点象代理模式,更象外观模式:
- Java设计模式(16)中介模式(Mediator模式)
Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...
- C++设计模式-Mediator中介者模式
Mediator中介者模式作用:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. UML如下: Colleage抽象同事类 ...
- 设计模式 ( 十六 ): Mediator中介者模式 -- 行为型
1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中. 对于一个模块或者系统,可能由很多对象构成,而且这些对象 ...
- 设计模式之美:Observer(观察者)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Observer 模式结构样式代码. 别名 Dependency Publish-Subscribe 意图 定义对象间的一种一对 ...
- 设计模式之美:Facade(外观)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):用抽象类定义 Facade 而使子类对应于不同的子系统. 意图 为子系统中的一组接口提供一个一致的界面,Facade 模式定义了 ...
- C#设计模式之12:中介者模式
中介者模式 在asp.net core中实现进程内的CQRS时用mediatR是非常方便的,定义command,然后定义commandhandler,或者notification和notificati ...
- 《设计模式之美》 <03>面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?
面向对象 现在,主流的编程范式或者是编程风格有三种,它们分别是面向过程.面向对象和函数式编程.面向对象这种编程风格又是这其中最主流的.现在比较流行的编程语言大部分都是面向对象编程语言.大部分项目也都是 ...
随机推荐
- TCP/IP协议工作原理简述
TCP/IP协议工作原理简述 // */ // ]]> TCP/IP协议工作原理简述 Table of Contents 1 概要 2 应用层 3 传输层 4 网络层 5 链路层 1 概要 ...
- php框架制做笔记
在学习完基础之后,最好的提高方式是做一个自己的框架,因为框架会用到各个知识点,在制做过程中,复习,巩固,提高. 在框架中,因为是单入口,整个脚本运行时都存在的变量我们应该设为静态变量,这样它在每个地方 ...
- 我利用网上代码开发的JQuery图片插件
我利用网上代码开发的JQuery图片插件 代码如下 (function($){ $.fn.FocusPic = function(options){ var defaults = { interval ...
- Windows 结构化异常
结构化异常不能用于需要调用对象析构函数的函数中 __try{ } __except(){ } __try{ } __finally{ }
- nio加强服务端并发
究了一下Android推送,方式很多,比如用框架或者用第三方服务,在此并不讨论个中优劣.抱着学习的态度,本人不太喜欢用一些现成的东西,所以自己动手实现了一套简单的推送机制.使用TCP长连接,完成服务器 ...
- 收藏的 500多个开源的Git源码
由dkhamsing发起的Open-Source iOS Apps收集了各种开源的iOS App,并进行了详细的分类,比如游戏.社交.健康.键盘.定位.多媒体.新闻.办公.安全以及小工具类等.截至目前 ...
- Android中如何查看so崩溃的log
两种方法: 一.android自带的arm-eabi-addr2line工具 例如, - :: I DEBUG : # pc 0000d766 /system/lib/libtest.so - :: ...
- echarts异步加载柱状图遇到的错误- Error: Component series. not exists. Load it first.
今天看了下echarts教程之中的异步加载柱状图,我按照教程中的代码敲出来之后再运行,就报了一个 Error: Component series. not exists. Load it first. ...
- 集成TBS(腾讯浏览服务)x5内核的webView
由于公司产品需要展示html5页面,一开始我使用的是android自带webview,一些简单的页面没什么问题,但是碰到比较复杂的页面就让人无语了. 1.Android各大厂商都有自己定制的ROM,导 ...
- 解决mac安装grunt时出现[command not found]的错误
第一步: 1先确定一下.bash_profile是否存在. 2在mac终端输入: test -e .bash_profile && echo "found" || ...