【前端设计模式】之调停者模式(中介者模式)

2023-10-23 14:29

本文主要是介绍【前端设计模式】之调停者模式(中介者模式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

调停者模式是一种行为设计模式,它通过引入一个调停者对象来集中处理一组对象之间的交互。调停者模式的目标是减少对象之间的直接通信,从而降低耦合度,并且使代码更易于维护和扩展。

调停者模式特性

  1. 将对象之间的通信集中在一个调停者对象中,避免了对象之间的直接耦合。
  2. 调停者对象可以控制和协调一组相关对象之间的交互。
  3. 调停者模式可以简化复杂系统中的交互逻辑,使代码更易于理解和维护。

应用示例

1. 表单验证

在一个表单中,各个输入字段之间可能存在依赖关系。使用调停者模式可以将表单验证逻辑集中在一个验证器对象中,各个输入字段只需要将自己的值传递给验证器进行验证即可。这样可以避免输入字段之间直接进行通信,并且使得验证逻辑更加清晰。

 
class Mediator {constructor() {this.fields = [];}addField(field) {this.fields.push(field);}validate() {let isValid = true;this.fields.forEach(field => {if (!field.validate()) {isValid = false;}});return isValid;}
}class Field {constructor(mediator) {this.mediator = mediator;this.value = '';}setValue(value) {this.value = value;this.mediator.validate();}validate() {// 验证逻辑return true;}
}const mediator = new Mediator();
const field1 = new Field(mediator);
const field2 = new Field(mediator);mediator.addField(field1);
mediator.addField(field2);field1.setValue('value1');
field2.setValue('value2');

在上述代码中,Mediator 是调停者对象,Field 是需要进行验证的输入字段。通过将输入字段注册到调停者对象中,并在字段值发生变化时通知调停者进行验证,可以实现表单验证的功能。

Mediator 类是一个中介者,它维护一个字段数组 fields,可以通过 addField 方法向数组中添加字段对象。它还提供了一个 validate 方法,用于验证所有字段是否有效。

Field 类表示一个字段,每个字段对象都有一个中介者引用 mediator,以及一个值属性 valuesetValue 方法用于设置字段的值,并在设置值后调用中介者的 validate 方法进行验证。

最后部分,创建了一个中介者对象 mediator 和两个字段对象 field1 和 field2,并将它们关联在一起。然后通过调用 addField 方法将这两个字段添加到中介者的字段数组中。最后,分别设置 field1 和 field2 的值为 'value1' 和 'value2'

2. 组件间通信

在一个复杂的前端应用中,各个组件之间可能需要进行通信和协调。使用调停者模式可以将组件之间的通信逻辑集中在一个调停者对象中,各个组件只需要将自己的状态或事件传递给调停者进行处理即可。这样可以避免组件之间直接进行通信,并且使得组件之间的关系更加清晰。

 
class Mediator {constructor() {this.components = [];}addComponent(component) {this.components.push(component);}notify(sender, event, data) {this.components.forEach(component => {if (component !== sender) {component.receive(event, data);}});}
}class Component {constructor(mediator) {this.mediator = mediator;this.mediator.addComponent(this);}send(event, data) {this.mediator.notify(this, event, data);}receive(event, data) {// 处理事件和数据}
}const mediator = new Mediator();
const component1 = new Component(mediator);
const component2 = new Component(mediator);component1.send('event', 'data');

Mediator 类有一个构造函数,它初始化了一个空的数组 components,用于存储组件对象。它提供了两个方法:

  • addComponent:将传入的组件对象添加到 components 数组中。
  • notify:遍历 components 数组中的所有组件,除了发送方(sender)之外,调用每个组件的 receive 方法,并传递事件和数据作为参数。

Component 类有一个构造函数,它接收一个中介者对象作为参数,并将其存储在 mediator 属性中,同时调用中介者的 addComponent 方法将自己添加到中介者的组件数组中。它提供了三个方法:

  • send:调用中介者的 notify 方法,将当前组件作为发送方,同时传递事件和数据作为参数。
  • receive:这是一个抽象方法,用于处理接收到的事件和数据。具体的处理逻辑需要根据实际需求实现。

在代码的最后部分,创建了一个中介者对象 mediator 和两个组件对象 component1 和 component2,并将它们关联在一起。然后调用 component1 的 send 方法发送一个事件和数据,这样就会触发中介者的 notify 方法,使得 component2 的 receive 方法被调用。

优缺点

优点
  1. 降低了对象之间的耦合度,使得代码更易于维护和扩展。
  2. 集中处理了对象之间的交互逻辑,使得代码更易于理解。
  3. 可以简化复杂系统中的交互逻辑,提高代码的可读性和可维护性。
缺点
  1. 引入了一个额外的调停者对象,增加了系统的复杂性。
  2. 调停者对象可能会变得庞大和复杂,难以维护。

总结

调停者模式是一种有助于降低对象之间耦合度的设计模式。它通过引入一个调停者对象来集中处理一组对象之间的交互,使得代码更易于维护和扩展。在前端开发中,调停者模式可以应用于表单验证、消息订阅与发布、组件间通信等场景。尽管调停者模式可能会增加系统的复杂性,并且调停者对象可能变得庞大和复杂,但它仍然是一种有价值的设计模式,可以提高代码的可读性和可维护性。

这篇关于【前端设计模式】之调停者模式(中介者模式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/268437

相关文章

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni