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

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

相关文章

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

在React中引入Tailwind CSS的完整指南

《在React中引入TailwindCSS的完整指南》在现代前端开发中,使用UI库可以显著提高开发效率,TailwindCSS是一个功能类优先的CSS框架,本文将详细介绍如何在Reac... 目录前言一、Tailwind css 简介二、创建 React 项目使用 Create React App 创建项目

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

css中的 vertical-align与line-height作用详解

《css中的vertical-align与line-height作用详解》:本文主要介绍了CSS中的`vertical-align`和`line-height`属性,包括它们的作用、适用元素、属性值、常见使用场景、常见问题及解决方案,详细内容请阅读本文,希望能对你有所帮助... 目录vertical-ali

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js