JavaScript中的中介者模式的详解

一. 中介者模式的定义

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

中介者模式的作用是接触对象与对象之间的紧耦合关系。

二. 中介者模式的实现

在中介者模式中,独立的对象(colleague)之间并不直接通信,而是通过中介者对象。当其中一个colleague对象改变状态以后,它将会通知该中介者对象,而中介者对象将会把该变化传达到任意其他应该知道此变化的colleague对象。

用代码表示如下:

/* ================ 中介者对象 ================ */
var mediator = {
    change: function(obj) {
        switch (obj) {
            case colleague1:
                // colleague1 的具体交互 ... ...
                break;
            case colleague2:
                // colleague2 的具体交互 ... ...
                break;
            case colleague3:
                // colleague3 的具体交互 ... ...
                break;
            case colleague4:
                // colleague4 的具体交互 ... ...
                break;
         }

        console.log(obj.name + " has changed!");
    }
};

/* ================ colleague对象 ================ */
var Colleague = function(name) {
    this.name = name;

    // colleague对象的功能和方法 ... ...
};
Colleague.prototype.change = function() {
    mediator.change(this); // 给中介者对象发送消息
};

var colleague1 = new Colleague("colleague1"),
    colleague2 = new Colleague("colleague2"),
    colleague3 = new Colleague("colleague3"),
    colleague4 = new Colleague("colleague4");

/* ================ 客户端调用 ================ */
colleague1.change(); // 打印"colleague1 has changed!",且完成colleague1的change事件操作
colleague2.change(); // 打印"colleague2 has changed!",且完成colleague2的change事件操作
colleague3.change(); // 打印"colleague3 has changed!",且完成colleague3的change事件操作
colleague4.change(); // 打印"colleague4 has changed!",且完成colleague4的change事件操作
三. 中介者模式的优缺点

中介者模式使得各个对象之间得以解耦,以中介者和对象之间的一对多关系取代了对象之间的网状多对多关系。各个对象只需关注自身功能的实现,对象之间的交互关系交给了中介者对象来实现和维护。

然而,中介者模式最大的缺点就是系统中新增一个中介者对象,因此对象之间交互的复杂性,转移成了中介者对象的复杂性,使得中介者对象自身往往就是一个难以维护的对象。

四. 中介者模式的适用场景

中介者模式可以很方便地对模块或对象进行解耦,一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。

一般来说,如果对象之间的复杂耦合确实导致调用和维护出现困难,且耦合度随项目变化越来越高,则可以考虑使用中介者模式来重构代码。

五. 总结

中介者模式是迎合迪米特法则的一种实现。迪米特法则也叫最少知识原色,是指一个对象应该尽可能少地了解另外的对象。而在中介者模式中,对象之间几乎不存在彼此间的联系,只能通过中介者对象来互相影响。

时间: 2024-12-19 06:03:17

JavaScript中的中介者模式的详解的相关文章

JavaScript中闭包的写法和作用详解_javascript技巧

1.什么是闭包 闭包是有权访问另一个函数作用域的变量的函数. 简单的说,Javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内.而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数和声明的其他内部函数.当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包. 2.变量的作用域 要理解闭包,首先要理解变量的作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变

JavaScript中String.match()方法的使用详解

  这篇文章主要介绍了JavaScript中String.match()方法的使用详解,是JS入门学习中的基础知识,需要的朋友可以参考下 此方法用于当匹配针对正则表达式的字符串来检索匹配. 语法 ? 1 string.match( param ) 下面是参数的详细信息: param : 正则表达式对象 返回值: 如果正则表达式不包括g标志,返回的结果相同于regexp.exec(string) 如果正则表达式包含g标志,则该方法返回一个包含所有匹配的数组 例子: ? 1 2 3 4 5 6 7

JavaScript中的条件判断语句使用详解

这篇文章主要介绍了JavaScript中的条件判断语句使用详解,是JS入门学习中的基础知识,需要的朋友可以参考下 在写一个程序,可能有一种情况,当你需要采用一个路径出给定两个路径.所以,需要使用条件语句,让程序来做出正确的决策和执行正确的行动. JavaScript支持其用于执行根据不同的条件不同的操作条件语句.在这里,我们将解释if..else语句. JavaScript支持if..else语句的形式如下: if 语句 if...else 语句 if...else if... 语句. if 语

JavaScript中SetInterval与setTimeout的用法详解_javascript技巧

setTimeout 描述 setTimeout(code,millisec) setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. 注:调用过程中,可以使用clearTimeout(id_of_settimeout)终止 参数 描述 code 必需,要调用的函数后要执行的 JavaScript 代码串. millisec 必需,在执行代码前需等待的毫秒数. setTimeinterval setInterval(code,millisec[,"lang"]) 参数

JavaScript中关键字 in 的使用方法详解_javascript技巧

for-in循环应该用在非数组对象的遍历上,使用for-in进行循环也被称为"枚举". 对于数组 ,迭代出来的是数组元素 但不推荐,因为不能保证顺序,而且如果在Array的原型上添加了属性,这个属性也会被遍历出来,所以 最好数组使用正常的for循环,对象使用for-in循环 对于对象 ,迭代出来的是对象的属性: var obj = { "key1":"value1", "key2":"value2", &q

在JavaScript中对HTML进行反转义详解_javascript技巧

在JavaScript中对字符串进行转义和反转义操作,常用的方法莫过于使用encodeURI (decodeURI).encodeURIComponent (decodeURIComponent)这几个方法,具体使用方法和区别. 但是如何在JavaScript中对HTML进行反转义操作呢?例如下面这段代码: var jsonData = { title: "<%= data.name? data.name : title %>", desc: "<%= da

Javascript中的迭代、归并方法详解_基础知识

迭代方法 在Javascript中迭代方法个人觉得尤为重要,在很多时候都会有实际上的需求,javascript提供了5个迭代方法来供我们操作,它们分别为: every() 对数组中的每一个项运用给定的函数,如果每项都返回true,那么就会返回true filter() 对数组中的每一个项运用给定的函数,把返回true的项组成一个新数组并返回 forEach() 对数组中的每一项运用给定的函数,但是没有任何的返回值 map() 对数组中的每一个项运用给定的函数并返回每次函数调用的结果组成新的数组

javascript中call apply 与 bind方法详解_基础知识

在JavaScript中,call.apply和bind是Function对象自带的三个方法,本文将通过几个场景的应用,来详细理解三个方法. call() call() 方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法. 当调用一个函数时,可以赋值一个不同的 this 对象.this 引用当前对象,即 call 方法的第一个参数. 通过 call 方法,你可以在一个对象上借用另一个对象上的方法,比如Object.prototype.toString.call([]),

javascript中if和switch,==和===详解_javascript技巧

今天改插件BoxScroll的时候,因为if里面的条件判断多于两个,于是立马想着改写switch.改到一半,忽然记起来JSHint等代码质量检测工具中的一个要求,用===替换==,不用不可靠的强制转型.然后忽然猜想,改成switch是不是会降低效率啊?switch里面的实际判断是==还是===? 有了想法,赶紧举个栗子,好一口吃掉: var a = '5'; switch (a) { case 5: console.log('=='); break; case "5": console