JavaScript 设计模式之职责链模式

news2024/12/30 3:49:08

职责链

在日常开发中,我们一个函数(方法)应该是尽可能的单单只做一件事,比如 一个获取 name 的函数,他就用来返回 name 处理 name相关的数据就好了,这就是职责

function getName(){

    // todo sth.
    return name
}

在写代码过程中,将职责的粒度划分的越小,越容易排查问题,单元测试也更容易

例如

假使我们有以下代码


const sendData = function (data, meth) {
  // todo: 处理请求相关
  // 我们可以在这里处理相关的请求逻辑
  return fetch(`${url}?${data}`, { method: meth })
}

/**
 * 处理数据
 * @param {*} data 需要处理的数据
 */
const dealData = function (data) {
  // 处理数据
  const dataType = Object.prototype.toString.call(data)
  if (dataType === '[object Array]') {
    // 数组
    return createSug(data)
  }
  if (dataType === '[object Object]') {
    // 对象
    let newData = []
    for (let key in data) {
      newData.push( data[key] )
    }
    return createSug([newData])
  }
}

/**
 * 展示到界面
 * @param {*} data 展示的数据
 */
const createSug = function (data) {
  const sugList = document.querySelector('#sug-list')
  sugList.innerHTML = ''
  data.forEach(item => {
    const li = document.createElement('li')
    li.innerText = item
    sugList.appendChild(li)
  })
  return data
}

使用

可以这样使用看看

dealData(["封不平",'易国梓','都史'])

dealData({
  ame: '窝阔台',
  age: 20,
  gender: 'female'
})

只需要做到一个函数只处理与自己相关的事即可,与其他无关

总结

职责链模式定义了请求的传递方向通过多个对象对请求的传递,实现一个复杂的逻辑操作。因此职责链模式将负责的需求颗粒化逐一实现每个对象分内的需求,并将请求顺序地传递。对于职责链上的每一个对象来说,它都可能是请求的发起者也可能是请求的接收者。通过这样的方式原请求的发起者与原请求的接收者之间的耦合。

命令模式

命令模式我们不需要关注命令后面的函数是如何实现的,逻辑是什么,我们只需要对命令返回的某些命令进行正常的传值即可

例如


const sthCommand = (function () {
  // todo: 一些方法
  const methods = {
    // 展示数据
    show(data) {
      console.log('show=>',data)
      // todo:
    },
    // 隐藏数据
    hide(data) {
      console.log('hide=>',data)
      // todo: 
    }
    ...
  }
  return function exec() { }
})()

我们定义许多的方法,我们只需要暴露一个 exec 的闭包函数出去给外部使用即可

 function exec(msg) {
  if (!msg) return 
  msg.params = Object.prototype.toString.call(msg.params) === '[object Array]' ? msg.params : [msg.params];
  return methods[msg.command].apply(methods, msg.params)
}

使用

sthCommand({
  command: 'show',
  params: ['hello world']
})
sthCommand({
  command: 'hide',
  params: ['hello world']
})

// show=> hello world
// hide=> hello world

总结

命令模式我们不再需要关注每一个命令内部的实现,使用起来简洁明了,在许多的框架中也都有用到

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

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

相关文章

从零自制docker-1-【环境配置 docker go介绍与安装】

文章目录 docker简介举例docker安装go语言go安装go 配置 docker简介 Docker可以看作是一种极其轻巧的“虚拟机”,它允许你将一个或多个程序及其运行环境打包在一起,形成一个标准化的单元,这个单元可以在任何支持Docker的系统上运行&#xff…

ArmSoM Rockchip系列产品 通用教程 之 Camera 使用

Camera 使用 1. Camera 简介 ArmSoM系列产品使用的是mipi-csi接口的摄像头 ArmSoM-Sige7支持双摄同显: 2. RK3588硬件通路框图 rk3588支持2个isp硬件,每个isp设备可虚拟出多个虚拟节点,软件上通过回读的方式,依次从ddr读取每…

SQL无列名注入

SQL无列名注入 ​ 前段时间,队里某位大佬发了一个关于sql注入无列名的文章,感觉好像很有用,特地研究下。 关于 information_schema 数据库: ​ 对于这一个库,我所知晓的内容并不多,并且之前总结SQL注入的…

React多个echarts图表在一个页面的使用

前景 很多情况下图标都是一个,我们大概率会像下面代码一样的做法 大概流程就是获取到数据后执行初始化,因为先初始化后异步请求再设置state里面的数据回导致无法正常显示echarts(除非再次调用setOption)下面就记录下自己解决过程源码 https://github.com/superBiuBiuMan/react-…

《秦时明月》IP新高度:与陕西历史博物馆共同书写文化传承新篇章!

在IP产业风起云涌的今天,如何以创意和匠心为传统文化注入新的活力,成为了摆在每一位文化工作者面前的重要课题。近日,《秦时明月》作为一部深受观众喜爱的国产动画IP,在迎来其十七周年之际,联手陕西历史博物馆&#xf…

线性dp:P2679 子串

1.P2679 子串 传送门https://www.luogu.com.cn/problem/P2679这道题是公共子串问题的变种,但是我第一时间确实没想到转移方程(写少了) 一开始看了题解也没太看懂,直到自己模拟一遍(模拟数据便于理解原理)…

#WEB前端(HTML属性)

1.实验:a,img 2.IDE:VSCODE 3.记录: a: href插入超链接 默认情况下在本窗口打开链接, target可以设置打开的窗口,parent在父窗口打开,blank新开串口打开,top在顶层串口打开,self为默认在本窗口打开 img: 插入图片 可以插…

持续集成(CICD)- Git版本管理工具,Gitee线上仓库

文章目录 一、学习目标:二、什么是Git工具三 、Git环境搭建(windows系统)四、Gitee设置(私钥和公钥绑定)五、Git结合Gittee进行基本设置(重要)六、在Gitee上新建仓库私有仓库(非空仓库)七、Git拉取线上仓库代码,提交代码(重要)八、Git解决版本冲突问题(重要)场景一…

LeetCode 刷题 [C++] 第45题.跳跃游戏 II

题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j < n 返回到达 nums[n …

YOLOv9独家原创改进|增加SPD-Conv无卷积步长或池化:用于低分辨率图像和小物体的新 CNN 模块

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、文章摘要 卷积神经网络(CNNs)在计算即使觉任务中如图像分类和目标检测等取得了显著的成功。然而&#xff0c;当图像分辨率较低或物体较小时&…

每日一题 — 复写零

1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 首先找到最后一个复写的数&#xff1a; 双指针算法&#xff1a; 1、先判断 cur 位置上的值 2、然后决定 dest 移动一步还是两步 3、然后判断 dest 是否到终点了 4、最后 cur 处理越界的情况 arr[n-1] …

Javaweb之SpringBootWeb案例之自动配置的原理分析的详细解析

3.2.3 原理分析 3.2.3.1 源码跟踪 前面我们讲解了在项目当中引入第三方依赖之后&#xff0c;如何加载第三方依赖中定义好的bean对象以及配置类&#xff0c;从而完成自动配置操作。那下面我们通过源码跟踪的形式来剖析下SpringBoot底层到底是如何完成自动配置的。 源码跟踪技巧…

QPaint绘制自定义仪表盘组件03

网上视频抄的&#xff0c;用来自己看一下&#xff0c;看完就删掉 ui mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QDebug> #include <QtMath> #include <QDialog> #include <QPainter> #include …

嵌入式中汇编语言的基本实现

大家好&#xff0c;今天给大家分享&#xff0c;GNU汇编的语法。 第一&#xff1a;汇编简介 GNU 汇编语法适用于所有的架构&#xff0c;并不是 ARM 独享的&#xff0c;GNU 汇编由一系列的语句组成&#xff0c; 每行一条语句&#xff0c;每条语句有三个可选部分&#xff0c;如下…

java List.forEach 引发的生产投诉

代码运行时直接抛异常报错&#xff0c;这个算是不幸中的万幸&#xff0c;至少可以及时发现并去解决代码运行不报错&#xff0c;但是业务逻辑莫名其妙的出现各种奇怪问题&#xff0c;这种就比较悲剧了&#xff0c;因为这个问题稍不留神的话&#xff0c;可能就会给后续业务埋下隐…

【C语言】熟悉文件顺序读写函数

前言 本篇详细介绍了 文件顺序读写常用函数&#xff0c;快来看看吧~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 ​编辑 文件顺序读写函数 fgetc函数 示例 fputc函数 逐个字符写入 写入26个字母 文…

数学建模函数插值与拟合

1.脑图 2.介绍 我们自己找到的函数&#xff0c;在已知点处的函数值和要求的函数在这些点处的函数值相等&#xff0c;这个函数 就叫做未知函数的插值函数&#xff1b; 多项式函数构成的插值函数的集合叫做函数类&#xff1b; 3.拉格朗日插值法 基函数的求法和插值函数的构造…

使用QEMU搭建U-Boot+LinuxKernel+busybox+NFS嵌入式开发环境

目录 0.课程大纲1.为什么要使用QEMU学习嵌入式QEMU简介使用QEMU可以做哪些事情?当前嵌入式行业现状如何适应这种变化使用QEMU学习嵌入式有哪些好处?驱动开发技能为什么要学习Linux 2.搭建嵌入式开发基本环境2.1.安装u-boot-tools2.2.安装交叉编译工具什么是ABI和EABI 3.QEMU安…

MySQL:开始深入其数据(一)DML

在上一章初识MySQL了解了如何定义数据库和数据表&#xff08;DDL&#xff09;&#xff0c;接下来我们开始开始深入其数据,对其数据进行访问&#xff08;DAL&#xff09;、查询DQL&#xff08;&#xff09;和操作(DML)等。 通过DML语句操作管理数据库数据 DML (数据操作语言) …

第17章-文件传输协议

1. 概述 2. FTP协议 2.1 定义 2.2 端口 2.3 数据传输方式 2.4 文件传输模式 3. TFTP协议 3.1 定义&#xff1a; 4. 常用命令 1. 概述 场景&#xff1a;远端主机和本地服务器 2. FTP协议 2.1 定义 FTP(File Transfer Protocol)&#xff1a;文件传输协议&#xff1b;…