JS——Mediator(中介者)模式

2023-10-27

我们从日常的生活中打个简单的比方,我们去房屋中介租房,房屋中介人在租房者和房东出租者之间形成一条中介。租房者并不关心他租谁的房。房东出租者也不关心他租给谁。因为有中介的存在,这场交易才变得如此方便。

在软件的开发过程中,势必会碰到这样一种情况,多个类或多个子系统相互交互,而且交互很繁琐,导致每个类都必须知道他需要交互的类,这样它们的耦合会显得异常厉害。牵一发而动全身,后果很严重。

模式图:
中介者的功能就是封装对象之间的交互。如果一个对象的操作会引起其他相关对象的变化,而这个对象又不希望自己来处理这些关系,那么就可以去找中介者,让它来处理这些麻烦的关系。
给个有趣的小例子吧:
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<p>1 0 30</p>
	<div id="results"></div>
	<script>
		//Mediator
		//这里用了构造器模式
		function Player(name) {
			this.name = name;
			this.point = 0;
		}
		Player.prototype.play = function() {
			this.point += 1;
			mediator.played();
		}

		var scoreboard = {
			ele : document.getElementById("results"),

			update : function(score) {
				var i, msg = "";
				for(i in score) {
					if(score.hasOwnProperty(i)) {
						msg += "<p><strong>" + i + "</strong>";
						msg += score[i];
						msg += "</p>";
					}
				}
				this.ele.innerHTML = msg;
			}
		};

		var mediator = {

			players : {},

			setup : function() {

				var player = this.players;
				player.home = new Player("Home");
				player.guest = new Player("Guest");
			},

			played : function() {

				var player = this.players;
				score = {
					Home : player.home.point,
					Guest : player.guest.point
				};
				scoreboard.update(score);
			},

			keypress : function(e) {
				e = e || window.event;    //事件监听
				if(e.which === 49) {
					mediator.players.home.play();
				}
				if(e.which === 48) {
					mediator.players.guest.play();
				}
			}
		};

		mediator.setup();
		window.onkeypress = mediator.keypress;

		setTimeout(function(){
			window.onkeypress = null;
			console.log("game over!");
		}, 30000);
	</script>
</body>
</html>
这里的Players(玩家)与scoreboard(计分板)之间交互都通过中介者,降低了耦合,而且增强了代码的可读性。

四,总结一下

Why Mediator ?

各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉及到修改很多其他对象的行为,

如果使用Mediator模式,可以使各个对象间的耦合松散,只需关心和 Mediator的关系,使多对多的关系变成了一对多的关系,

可以降低系统的复杂性,提高可修改扩展性。

使用中介者模式的场合

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

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

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

使用中介者模式的优点:

1.降低了系统对象之间的耦合性,使得对象易于独立的被复用。

2.提高系统的灵活性,使得系统易于扩展和维护。

使用中介者模式的缺点:

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


摘录于:

1、http://www.cnblogs.com/bigbearbb/p/4193020.html
2、http://jsfiddle.net/ganksolo/jveA4/
3、《Javascript设计模式》



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS——Mediator(中介者)模式 的相关文章

  • jsp之cookie的基本操作&&实现用户登录cookie记录用户信息

    jsp状态管理 因为http的无状态性 所以可以用session或cookie技术保存用户信息 而cookie可以记录信息可以判定注册用户是否已经登录网站 购物车的应用 浏览记录 但是有安全风险 创建cookie Cookie cookie
  • keil调试查看ROM或RAM

    Ctrl F5或点击调试按钮进入调试界面 在工具栏上点击Memory Windows 则右下角出现Memory1的页面 默认出现的是ROM的查看界面 在Address一栏输入十六进制的地址即可查看ROM里面的数值 点击Memory Wind
  • 动态修改JavaBean中的注解的参数值

    我这里有一个需求需要修改Person类中的一个属性上的注解的值进行修改 例如 public class Person private int age ApiParam access lala private String name get
  • 怎么做验收测试?

    本文是本系列文章的第四篇 也是最后一篇 主要讲述我们在Lyft面对越来越多的开发人员和服务时 如何扩展开发实践 第一部分 开发和测试环境的历史 第二部分 加快本地开发的一些优化 第三部分 预发布环境通过重载形式来扩展服务网格 第四部分 怎么
  • halcon给图像添加不同颜色的透明遮罩(叠加透明ROI)

    目录 前言 方法 1 给单通道图像添加透明遮罩 2 给RGB图像添加透明遮罩 参考链接 前言 最近想给图片叠加上透明region方便展示 以前一直用overpaint region算子搭配add image就行 这次用单通道图竟然叠加出来的
  • typec耳机知识介绍

    数字耳机和模拟耳机 模拟耳机即我们的常见的3 5mm接口的耳机 包括左右声道 地或者mic 如左图 数字耳机 右图 包含一个usb声卡 DAC ADC amp 模拟耳机 当数字耳机接入到手机 otg 或者电脑后 手机或者电脑识别到了usb设
  • 如何在本地测试ajax时间,为什么在本地测试ajax反应很慢

    在本地测试ajax接收分页数据 要反应1s左右 以上 但是放到服务器上就100ms到 900多ms之间 有什么好的办法解决ajax获取速度慢吗 已经把分页数据换成json了 没多大改善 数据大小显示是在2 9kb 耗时1 03s 处理逻辑就
  • C++ 虚函数、虚函数表剖析

    C 中的虚函数的作用主要是实现了多态的机制 关于多态 简而言之就是用父类型别的指针指向其子类的实例 然后通过父类的指针调用实际子类的成员函数 那么问题来了C 又是如何实现这种技术的呢 C 使用了一种动态绑定的技术 这个技术的核心是虚函数表
  • jQuery中delegate和on的用法与区别详细解析

    在jQuery1 7中 delegate 已被 on 取代 对于早期版本 它仍然使用事件委托的最有效手段 在事件绑定和委派 delegate 和on在一般情况下 这两种方法是等效的 delegate 指定的元素 属于被选元素的子元素 添加一
  • MySQL报错注入函数汇总

    常用函数 字符串连接函数 将多个字符串连接成一个字符串 当中间字符串有一个为空时 最后结果也为空 concat str1 str2 str3 concat ws 指定分隔符 str1 str2 str3 开头指定分隔符 与concat 不同
  • cpp课程设计实验题:定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生

    定义Staff 员工 类 由Staff分别派生出Saleman 销售员 类和Manager 经理 类 再由Saleman 销售员 类和Manager 经理 类采用多重继承方式派生出新类SaleManager 销售经理 类 各类之间的继承关系
  • cmake中使用find_package查找vcpkg中的BOOST 包遇到的坑

    有人说vcpkg对于boost库暂时不支持find package 链接 其实是支持的 set BOOST VERSION 1 78 find package Boost REQUIRED COMPONENTS graph program
  • 用观测数据推断因果的问题(一文搞懂混杂因素、辛普森悖论)

    聊到因果推断与相关性的关系 大家其实都已经有一个认知叫做 相关性 因果性 但学界从统计推断发展到后来因果推断是经历了一个漫长的过程 直到今天 我们仍然基础的对数据的处理和认知离不开统计推断的方法 所以学习了解用观测数据做因果推断可能导致的问
  • N皇后问题(代码)

    N皇后问题 include lt stdio h gt include lt math h gt define N 4 判断第k个皇后目前放置位置是否与前面的皇后冲突 in isplace int pos int k int i for i
  • java学习小随笔—类中赋值的错误认知

    在java的类中 只能声明变量和方法 不能赋值 public class people int n 10 m m 10 上面的代码就是错误的 int n 10 m 语句中 属于声明语句 n在声明的同时初始化 m 10 属于赋值语句 在jav
  • kali无法连接外网

    今天用虚拟机时 无法连接外网 在网上搜了各种解决方法 windows下的VM服务都开了 其他也没有什么错 虚拟机使用NAT模式 查看我的虚拟网络编辑器 发现我的NAT模式是在113网段下的 而我linux的ip地址是在137网段下的 但是我
  • 对浏览器内核的理解

    简单来说 浏览器内核是浏览器的核心 也称 渲染引擎 用来解释网页语法并渲染到网页上 浏览器内核决定了浏览器该如何显示网页内容以及页面的格式信息 浏览器内核又可以分成两部分 渲染引擎和JS引擎 渲染引擎 负责获取网页的内容并显示 不同的浏览器
  • git修改commit日志

    由于公司对版本提交日志进行检查 如果不符合要求 则push失败 以下是修改commit日志的方法 1 进入到提交代码文件所在目录 即git所在目录下 cd app repository 2 git log git log commit bf
  • Rabbit MQ详解

    一 什么是RabbitMQ 答 RabbitMQ简称MQ是一套实现了高级消息队列协议的开源消息代理软件 简单来说就是一个消息中间件 是一种程序对程序的通信方法 其服务器也是以高性能 健壮以及可伸缩性出名的Erlang语言编写而成 二 Rab

随机推荐

  • nc文件经度从0-360更改为-180到180,并保存

    从0 360改为 180到180 import xarray as xr rawnc path InPath ds xr open dataset rawnc path lon name lon 你的nc文件中经度的命名 ds longit
  • Python数据分析与机器学习----收入的预测分析

    一 题目 利用age workclass native country等13个特征预测收入是否超过50k 是一个二分类问题 二 训练集 32561个样本 每个样本14个特征 其中6个连续性特征 9个离散型特征 三 测试集 16281个样本
  • Open3D(C++) 四元数奇异值分解

    目录 一 算法原理 1 原理概述 2 实现过程 3 参考文献 二 代码实现 三 结果展示 本文由CSDN点云侠原创 原文链接 如果你不是在点云侠的博客中看到该文章 那么此处便是不要脸的爬虫 一 算法原理 1 原理概述 四元数矩阵的奇异值分解
  • java继承层次结构,在状态模式中实现继承层次结构 - java

    我有一个与此非常相似的设计 这里的NewOrder Registered Granted都有通用方法AddOrderline 和Cancel 因此将这两种方法重构为父类很容易 当我要Cancel一条Shipped行 当前未在图中显示 时 会
  • SegNetr: 重新思考 U 形网络中的局部-全局交互和跳过连接

    SegNetr 会议分析 摘要 贡献 方法 整体框架 1 SegNetr Block 2 Information Retention Skip Connection 实验 1 对比实验 2 消融实验 2 1 Effect of local
  • tslib移植的问题:No raw modules loaded.ts_config:No such file or directory

    1 在开发板上运行校正程序时出现No raw modules loaded 解决方法是把 tslib etc目录下的ts conf 的 module raw input 的注释符号 去掉 但记住不要在前面留有 空格 否则会出现错误Segme
  • python 打开读取文件 出现异常 关闭文件的处理(世界上没有傻问题!但我是个傻子)

    事情梗概 try 尝试读取一个不存在的文件 except Exception as e 打印异常 finally 关闭文件 但是关闭文件时报异常 算了 看代码吧 try f open file name rb file data f rea
  • Vue.js的组件化开发

    组件化开发 什么是组件 web中的组件其实就是页面组成的一部分 好比是电脑中的每一个元件 如硬盘 键盘 鼠标 它是一个具有独立的逻辑和功能或界面 同时又能根据规定的接口规则进行相互融化 变成一个完整的应用 页面就是由一个个类似这样的组成部分
  • iOS开源系列——下拉刷新控件

    EGOTableViewPullRefresh FaceBook开源控件 下拉刷新的鼻祖 SVPullToRefresh 下拉刷新控件 MJRefresh 比较好用的下拉刷新 可以自定义上下拉刷新的文字说明 具体使用看 使用方法 国人写 X
  • 中间件的分类和作用

    要说清这个问题我们用一个生活中的实例来比喻 把分布式系统看作北京市区的交通系统 网络看作市区马路 通过交通工具 汽车 实现通信 每分钟将有几万辆车在马路上行驶 如果没有相应的交通设施和管理规划 北京市将会乱成一团 发生各种交通事故 1 通信
  • java各种报错汇总与分析

    1 没有找到pom文件 需要设置版本号 在这里插入图片描述 https img blog csdnimg cn 20210720112611634 png pic center 解决办法 https blog csdn net SSband
  • 从2023蓝帽杯0解题heapSpary入门堆喷

    从2023蓝帽杯0解题heapSpary入门堆喷 关于堆喷 堆喷射 Heap Spraying 是一种计算机安全攻击技术 它旨在在进程的堆中创建多个包含恶意负载的内存块 这种技术允许攻击者避免需要知道负载确切的内存地址 因为通过广泛地 喷射
  • adb shell 小米手机_【ADB命令实战】免ROOT停用小米手机系统应用

    对于未解锁的手机 总存在那么一些我们用不到 甚至看都不想看到的应用 但是没办法卸载 在这里提供一些禁用掉这些应用的方法供参考 本内容是以小米的MIUI系统为例 其他品牌机型不确保可以成功 毕竟系统应用的包名是不一样的 需要自己去发现 1 打
  • linux-hd.c

    linux kernel hd c C 1991 Linus Torvalds This is the low level hd interrupt support It traverses the request list using i
  • 数据结构与算法课程笔记(二)

    实验二 线性表的顺序存储结构实现 一 实验目的 二 实验内容 一 实验目的 熟悉VC 工程项目的文件组织方式 线性表中数据元素间的关系及其顺序存储结构方式表示方法 顺序表的操作方法与接口函数的设计方法 二 实验内容 1 利用本次实验提供的文
  • element input复合框 修改下拉框样式

    element input复合框 修改下拉框样式 1 项目中经常会遇到修改ui组件库样式的问题 elemetui官网自带样式是这样的 我想修改选中颜色 以及背景颜色 这样设置发现不生效 加上 popper append to body fa
  • python 翻译模块 翻译API使用(百度、有道、谷歌)

    1 翻译模块 api使用分析 1 translate库 使用简单 但是有次数限制 翻译的准确性中等 2 百度api 推荐使用 代码简单 有模块 但是需要注册 获取key值 翻译的准确性中下 3 chrome翻译api 代码复杂 次数限制 但
  • java8的常用的新特性

    Java 8引入了许多新的特性 下面列举了一些常用的新特性 Lambda表达式 Lambda表达式是Java 8中引入的一种函数式编程特性 提供了一种更简洁和灵活的方式来编写匿名函数 方法引用 方法引用允许直接引用已经存在的方法作为Lamb
  • 华为od机试面试题目

    1 华为机试102道题解 2 华为机考题目 2023年7月30日 19 30 22 00 机考提示 注意事项 考前必看 1 注意编译环境的变化及语言选择 选自己熟悉的语言机考 2 机考共3道题 150分钟完成 3 题目难度为 一星和两星 2
  • JS——Mediator(中介者)模式

    我们从日常的生活中打个简单的比方 我们去房屋中介租房 房屋中介人在租房者和房东出租者之间形成一条中介 租房者并不关心他租谁的房 房东出租者也不关心他租给谁 因为有中介的存在 这场交易才变得如此方便 在软件的开发过程中 势必会碰到这样一种情况