设计模式(五):中介者模式

在《JavaScript设计模式》关于中介者模式的介绍里,里面有些错误和擅自添加的例子,虽然例子(英文版没有)是为了让人更好理解,但是该篇章加上的例子却给人误导的感觉,所以如果有人读这个章节时,建议看英文版。

在看这个模式时候,我只想弄明白一点,中介者模式与订阅/发布模式的区别在哪?

中介者模式定义

中介者作为一种行为设计模式,它公开一个统一的接口,系统的不同对象或组件可以通过该接口进行通信。增加一个中介者对象后,所有的相关对象通过中介者对象来通信,而不是互相引用,所以当一个对象发生改变时,只需要通知中介者对象即可。

英文版:

When it comes to the Mediator and Event Aggregator patterns, there are some times where it may look like the patterns are interchangeable due to implementation similarities. However, the semantics and intent of these patterns are very different.

And even if the implementations both use some of the same core constructs, I believe there is a distinct difference between them. I also believe they should not be interchanged or confused in communication because of the differences.

中文版:

它也可能被认为是额外的或者是用于应用程序间的通知,如不同子系统之间的通信,这些子系统本身就很复杂,且可能希望通过发布/订阅关系实现内部组件间的解耦。

我:

首先我是不明白译者为什么不按英文版翻译,另外还有一点译文的意思根本就不是英文版的意思,我觉得不对。

我觉得是——中介者模式与事件订阅模式有些时候看起来是可以互相替换的,因为它们的实现都差不多,但从语义和意图上讲,这些模式是各不相同的。即便是实现都用了相同的核心结构,我相信他们之间还是有区别,在通信时是不能互换和混淆。

PS:总结就是,两个模式实现上有些相同,但意图是不同的。

例子

简述:

机场交通控制系统。控制塔处理飞机的起飞和降落,所有的通信都是控制塔控制的。

代码:

//飞机
var Plane = function(name){
    this.name = name;
}

Plane.prototype.takeOff = function(){ //起飞
     ControlTower.takeOff(this);
}

Plane.prototype.sendMsg = function(toPlane, msg){ //飞机间发消息
     ControlTower.sendMsg(this, toPlane, msg);
}

Plane.prototype.receive = function(fromPlane, msg){
     console.log(this.name + "-收到来自-" + fromPlane.name + "消息:" + msg);
}

//飞机控制塔(中介者)
var ControlTower = (function(){
     //假设只有一条跑道,跑道只能起飞一只飞机(不说降落)
     var onTrackPlaneName,
          canTrackUse = true;
    var takeOff = function(plane){
          if(!canTrackUse){
               console.log("跑道正在使用中...");
               return;
          }
          if(onTrackPlaneName == plane.name){
               console.log("您正在起飞中...");
            return;
          }
          canTrackUse = false;
          onTrackPlaneName = plane.name;
          console.log(plane.name + "正在起飞中...");
          setTimeout(function(){
               canTrackUse = true;
               onTrackPlaneName = null;
               console.log(plane.name + "已起飞...");
          }, 5000);
    }
    var sendMsg = function(from ,to , msg){
          to.receive(from, msg);
    }

    return {
        takeOff : takeOff,
        sendMsg : sendMsg
    }
})();

var p747 = new Plane(‘波音747‘);
var p666 = new Plane(‘飞豹666‘);

p747.takeOff();
p666.takeOff();
p747.sendMsg(p666, ‘开完飞机吃个饭么‘);

适用场景

1. 一组定义良好的对象,现在要进行复杂的通信。

2. 定制一个分布在多个类中的行为,而又不想生成太多的子类。

可以看出,中介对象主要是用来封装行为的,行为的参与者就是那些对象,但是通过中介者,这些对象不用相互知道。(迪米特法则的具体实现)

优点

1. 中介者模式能够将系统中对象或组件之间所需的通信渠道从多对多减少到多对一。

2. 符合迪米特原则。

迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。

缺点

1. 中介者模式的缺点是显而易见的,因为这个“中介“承担了较多的责任,所以一旦这个中介对象出现了问题,那么整个系统就会受到重大的影响。

中介者模式与观察者模式差异

1. 调度中心不同。

中介者模式调度是由中介者,而观察者模式调度的是观察者;

中介者模式与订阅/发布模式的调度方式更像,都是独立一个集中的调度中心。

2. 中介者模式参与了对象行为的实现(例如上面示例的飞机起飞),而观察者模式并不参与,仅做目标通知。

中介者模式与订阅/发布模式差异

1. 中介者模式与业务相关,订阅/发布模式与业务无关。(这是我觉得最大差别)

虽然实现结构非常相像,但是很明显的是,中介者模式参与业务相关东西,所以内容是大相径庭的。

2. 两个模式都有集中调度效果,对象之间不直接参与通信。

参考文献

1. 《Learning JavaScript Design Patterns》 by Addy Osmani

https://addyosmani.com/resources/essentialjsdesignpatterns/book/

2. 《JavaScript设计模式》by 徐涛【译】

本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。

本文地址 :http://www.cnblogs.com/lovesong/p/5575594.html

时间: 2024-10-11 08:06:20

设计模式(五):中介者模式的相关文章

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中. 对于一个模块或者系统,可能由很多对象构成,而且这些对象之间可能存在相互的引用,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系.虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性,大量的相互连接使得一个对象似乎不太可能

设计模式之中介者模式20170731

行为型设计模式之中介者模式: 一.含义 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 同事角色与其他同时角色通信的时候,一定要通过中介者角色(中介者封装了各个同事类之间的逻辑关系) 二.代码说明 1.主要有两个角色 1)中介者角色 通过协调各同事角色实现协作行为,因此它必须依赖于各个同事角色. 2)同事角色 每一个同事角色都知道中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作. 每个同事类的行为分

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

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

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

声明:本系列文章内容摘自<iOS设计模式> 中介者模式 用一个对象来封装一系列对象的交互方式.中介者使个对象不需要显式地相互调用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 何时使用中介者模式 1.对象间的交互虽定义明确然而非常复杂,导致椅子对象彼此相互依赖而且难以理解: 2.因为对象引用了许多其他对象并与其通信,导致对象难以复用: 3.想要制定一个分布在多个对象中的逻辑或行为,又不想生成太多子类. 举个例子 有三个视图,我们可能需要两两之间进行跳转,类比于公司内同时每两个人都有可能

【设计模式】——中介者模式

中介者模式(Mediator),用一个中介者对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互. Colleague叫做抽象同事类,而ConcreteColleague是具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者对象,Mediator是抽象中介者,定义了同事对象到中介者对象的接口,ConcreteMediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接

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

博文原址:折腾Java设计模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行为型模式. 通俗点来讲就是提供一个中介平台,说到平台,那其实很容易联系到我们很熟悉的房地产中介.我们可以直接通过这个平台得到我们想要的信息,不用对象自身与其他对象交互. 买房子租房子就不需要去找房东,只需要在中介那里获取相应的×××信息.如下图那样,两方只

javascript设计模式学习之十五——中介者模式

一.中介者模式的定义和应用场景 中介者模式的作用在于解除对象之间的紧耦合关系,增加一个中介者之后,所有对象都通过中介者来通信,而不是互相引用,当一个对象发生变化的时候,仅需要通知中介者即可.从而将网状的多对多关系转换为了简单的一对多关系. 二.

JAVA设计模式之 中介者模式【Mediator Pattern】

一.概述 用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介者模式又称为调停者模式,它是一种对象行为型模式. 二.适用场景 协调多个对象之间的交互. 三.UML类图 四.参与者 1.Mediator(抽象中介者):它定义一个接口,该接口用于与各同事对象之间进行通信. 2.ConcreteMediator(具体中介者):它是抽象中介者的子类,通过协调各个同事对象来实现协作行为,它维持了对各个同事对象的引用.

设计模式之: 中介者模式

一.前言 平常我们写一个聊天软件,如果我们只是各个客户端之间连接聊天,那估计我们会写的想哭,那如果我们用服务器作为中间媒介,通过服务器来完成转发,群聊等客户端之间的连接,那样我们就可以最大程度的为各个客户端之间解耦,把它们之间的通信方法抽出来单独实现, 如图1就是不使用中介媒体的时候的结构图: 如图2就是使用我们所说的服务器作为中间媒介的情况的结构图: 二.中介模式 图二就是我们所说的中介模式! 在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装

C#设计模式(18)——中介者模式(Mediator Pattern)

一.引言 在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解. 二. 中介者模式的介绍 2.1 中介者模式的定义 从生活中的例子可以看出,不论是QQ游戏还是QQ群,它们都是充当一个中间平台,QQ用户可以登录这个中间平台与其他QQ用户进行交流,如果没有这些中间平台,我们如果想与朋友进行聊天的话,可能就需要当面才可以了.电话.短信也同样是一个中间平台,有了这个中间平台,每个用户都不要直接依赖与其