设计模式 - 中介器模式

news2024/11/28 23:58:09

中介者模式使得组件通过一个中心点——中介者进行交互。组件不需要直接进行通信,而是将请求发送给中介者,由中介者进行转发!在JavaScript中,中介者往往只是一个对象字面量或一个函数。

你可以将这种模式与空中交通管制员和飞行员之间的关系进行比较。飞行员不是直接互相交谈,这可能会相当混乱,而是与空中交通管制员交谈。空中交通管制员确保所有飞机接收到他们所需的信息,以便安全飞行,不与其他飞机相撞。

虽然我们希望不要使用 JavaScript 控制飞机,但我们往往不得不处理对象之间的多向数据。如果组件数量庞大,那么组件之间的通信会变得相当复杂。

Flow

对象的请求由中介处理,而不是让每个对象直接与其他对象通信,从而产生多对多关系。调解器处理此请求,并将其转发到需要的位置。

Flow

中介模式的一个很好的用例是聊天室!聊天室中的用户不会直接相互交谈。相反,聊天室充当用户之间的中介人。

class ChatRoom {
  logMessage(user, message) {
    const time = new Date();
    const sender = user.getName();

    console.log(`${time} [${sender}]: ${message}`);
  }
}

class User {
  constructor(name, chatroom) {
    this.name = name;
    this.chatroom = chatroom;
  }

  getName() {
    return this.name;
  }

  send(message) {
    this.chatroom.logMessage(this, message);
  }
}

 我们可以创建连接到聊天室的新用户。每个用户实例都有一个send方法,我们可以使用它来发送消息。

const chatroom = new ChatRoom();

const user1 = new User("John Doe", chatroom);
const user2 = new User("Jane Doe", chatroom);

user1.send("Hi there!");
user2.send("Hey!");

个案研究

Express.js 是一个流行的 Web 应用程序服务器 框架。我们可以为用户可以访问的某些路由添加回调。

假设我们想要在用户点击根'/'时向请求添加标头。我们可以在中间件回调中添加此标头。

const app = require("express")();

app.use("/", (req, res, next) => {
  req.headers["test-header"] = 1234;
  next();
});

next方法调用请求-响应周期中的下一个回调。我们实际上是在创建位于请求和响应之间的中间件函数链,反之亦然。

Flow

让我们添加另一个中间件函数来检查是否正确添加了test-header。前面的中间件函数添加的更改将在整个链中可见。

const app = require("express")();

app.use(
  "/",
  (req, res, next) => {
    req.headers["test-header"] = 1234;
    next();
  },
  (req, res, next) => {
    console.log(`Request has test header: ${!!req.headers["test-header"]}`);
    next();
  }
);

我们可以通过一个或多个中间件函数跟踪和修改请求对象,一直到响应。

const app = require("express")();
  const html = require("./data");

  app.use(
    "/",
    (req, res, next) => {
      req.headers["test-header"] = 1234;
      next();
    },
    (req, res, next) => {
      console.log(`Request has test header: ${!!req.headers["test-header"]}`);
      next();
    }
  );

  app.get("/", (req, res) => {
    res.set("Content-Type", "text/html");
    res.send(Buffer.from(html));
  });

  app.listen(8080, function() {
    console.log("Server is running on 8080");
  });

每次用户点击根端点 '/' 时,都会调用两个中间件回调。

中介器模式通过让所有通信都流经一个中心点,使我们能够轻松地简化对象之间的多对多关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1560293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科技革新,OTG充电新纪元!

在科技日新月异的今天,数据交互已经渗透到我们生活的每个角落,无论是工作还是娱乐,它都发挥着不可替代的作用。OTG技术的出现,极大地简化了设备间的联接与数据交换过程,但随之而来的接口有限和续航问题,也让…

产品经理的进阶之路

点击下载《产品经理的进阶之路》 1. 前言 本文深入剖析了产品经理这一职业从产品专员起步,逐步晋升为产品经理、高级产品经理,直至产品总监的整个职业发展路径。在每个阶段,产品经理都需承担不同的工作职责,展现出独特的职业特点。 2. 产品专员 关键词【产品需求/原型/文…

计算机服务器中了rmallox勒索病毒怎么办?rmallox勒索病毒解密数据恢复

网络技术的不断发展与应用,大大提高了企业的生产运营效率,越来越多的企业开始网络开展各项工作业务,网络在为人们提供便利的同时,也会存在潜在威胁。近日,云天数据恢复中心接到多家企业的求助,企业的计算机…

设计模式-概述篇

1. 掌握设计模式的层次 第1层:刚开始学编程不久,听说过什么是设计模式第2层:有很长时间的编程经验,自己写了很多代码,其中用到了设计模式,但是自己却不知道第3层:学习过了设计模式,…

Vue 3.0生命周期:深入理解与用法

Vue 3.0生命周期:深入理解与用法 摘要: 本文将深入探讨Vue 3.0的生命周期,解释每个生命周期钩子的含义和用法,以及它们在开发过程中的重要性。我们将详细解析每个钩子的工作原理,并提供一些示例和最佳实践&#xff0c…

python爬取B站视频

参考:https://cloud.tencent.com/developer/article/1768680 参考的代码有点问题,请求头需要修改,上代码: import requests import re # 正则表达式 import pprint import json from moviepy.editor import AudioFileClip, Vid…

常见贪心问题详解

目录 贪心算法应用条件 常见贪心问题 活动安排问题(区间调度问题) 区间覆盖问题 最优装载问题1 最优装载问题2 多机调度问题 例题:翻硬币 例题:快乐司机 例题:防御力 例题:答疑 贪心算法应用条件…

【通信原理笔记】【三】模拟信号调制——3.1 模拟信号调制基本模型与思路

文章目录 前言一、模拟信号二、模拟调制系统模型三、模拟调制的三种方式四、调制的评价指标总结 前言 一般常见的信号的频带均集中在基带附近,如果要通过无线地方式传输,其较长的波长需要大型的天线才能传输,难以实现。另一方面基带的带宽资…

ruoyi-nbcio-plus基于vue3的flowable执行监听器的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

Linux基础命令篇之——压缩与解压(tar、gzip、bzip2、zip和unzip)

linux基础命令——解压与压缩 以下是关于Linux命令tar、gzip、bzip2、zip和unzip的详细介绍: 1. tar 这个是Linux用的最多的解压缩命令 tar是Linux系统中用于创建和处理归档文件的命令。归档文件是一个包含多个文件和/或目录的单一文件。常与压缩命令gzip或bzip2结…

图像处理_积分图

目录 1. 积分图算法介绍 2. 基本原理 2.1 构建积分图 2.2 使用积分图 3. 举个例子 1. 积分图算法介绍 积分图算法是图像处理中的经典算法之一,由Crow在1984年首次提出,它是为了在多尺度透视投影中提高渲染速度。 积分图算法是一种快速计算图像区域和…

wavedec2函数及使用

在MATLAB中,进行小波分解及其逆运算是处理图像的一种常见方法,尤其适用于图像分析、压缩和去噪等场景。wavedec2函数可以对二维信号(例如图像)进行多级小波分解,而waverec2函数则用于进行相应的逆运算。以下是如何使用…

非NVIDIA平台下的CUDA的替代方案OpenCL,第一步如何获取PlatformInfo、DeviceInfo

非NVIDIA平台下的CUDA的替代方案OpenCL,第一步如何获取PlatformInfo、DeviceInfo 介绍 当谈到高性能计算,NVIDIA的CUDA框架无疑是一个强大的工具。OpenC(Open Computing Language)是一个更为通用的解决方案,或者你使用…

java 跳转搜索(Jump Search)

与二分搜索一样,跳转搜索是一种针对排序数组的搜索算法。基本思想是通过按固定步骤向前跳跃或跳过某些元素来代替搜索所有元素来检查更少的元素(比线性搜索)。例如,假设我们有一个大小为 n 的数组 arr[] 和一个大小为 m 的块&…

隐私计算实训营学习六:隐语PIR介绍及开发指南

文章目录 一、隐语实现的PIR总体介绍1.1 PIR的定义和种类1.2 隐语PIR功能分层 二、Index PIR-SealPIR介绍三、Keyword PIR- Labeled PSI介绍四、隐语PIR后续计划 一、隐语实现的PIR总体介绍 1.1 PIR的定义和种类 PIR(Private Information Retrieval PIR)隐匿查询:…

比亚迪的薪资。。。当年的迪子,今年的迪爹……

大家好,我是小黄。 俗话说金3银4,比亚迪一直都是一个相对热门的公司,“去年迪子,今年迪爹,去年座位空一大半,今年走廊都站满人……”这是很多应届毕业生对比亚迪的评价。 当年小黄毕业的时候,…

[计算机效率] 文件加密工具:Lockdir

3.11 文件加密工具:Lockdir Lockdir是一款安全性高、使用简单、体积极小的便携式文件夹加密器,无需安装,一键加密,一键解密,加密算法高,是优秀的加密工具。其主要特点包括: 加密操作简易&#…

hadoop-3.1.1分布式搭建与常用命令

一、准备工作 1.首先需要三台虚拟机: master 、 node1 、 node2 2.时间同步 ntpdate ntp.aliyun.com 3.调整时区 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 4.jdk1.8 java -version 5.修改主机名 三台分别执行 vim /etc/hostname 并将内容指定为…

酷开会员丨看、学、用、玩的智慧电视,酷开系统享你所想!

在数字化浪潮席卷之下,电视这个曾作为家庭娱乐设备中心的“客厅霸主”,在现代家庭中的地位似乎变得模糊起来。随着时代的发展,人们不再仅仅满足于电视观看节目的单一功能,而是期待电视能够提供更多元化、更智能的交互体验。考虑到…

[leetcode] 100. 相同的树

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入:p [1,2,3], q [1,2,3] 输出:true示例 2&a…