JavaScript设计模式之责任链模式

news/2024/5/19 14:24:40 标签: javascript, 设计模式, 责任链模式

适用场景:一个完整的流程,中间分成多个环节,各个环节之间存在一定的顺序关系,同时中间的环节的个数不一定,可能添加环节,也可能减少环节,只要保证顺序关系就可以。
如下图:
在这里插入图片描述

  1. ES5写法
const Chain = function (fn) {
    this.fn = fn
    this.nextChain = null
    this.setNext = function (nextChain) {
        this.nextChain = nextChain
        return this.nextChain
    }
    this.run = function () {
        this.fn()
        this.nextChain && this.nextChain.run()
    }
}
//申请设备
const applyDevice = function () {
    console.log(111)
}
const chainApplyDevice = new Chain(applyDevice);
//选择收货地址
const selectAddress = function () {
    console.log(222)
}
const chainSelectAddress = new Chain(selectAddress);
//选择审核人
const selectChecker = function () {
    console.log(333)
}
const chainSelectChecker = new Chain(selectChecker);

chainApplyDevice.setNext(chainSelectAddress).setNext(chainSelectChecker);
chainApplyDevice.run(); //最后执行结果为111-222-333
  1. ES6写法
class Chain {
   constructor(fn) {
       this.fn = fn
       this.nextChain = null
   }
   setNext (nextChain) {
       this.nextChain = nextChain
       return this.nextChain
   }
   run() {
       this.fn()
       this.nextChain && this.nextChain.run()
   }
}
//申请设备
const applyDevice = function () {
   console.log(111)
}
const chainApplyDevice = new Chain(applyDevice);
//选择收货地址
const selectAddress = function () {
   console.log(222)
}
const chainSelectAddress = new Chain(selectAddress);
//选择审核人
const selectChecker = function () {
   console.log(333)
}
const chainSelectChecker = new Chain(selectChecker);

chainApplyDevice.setNext(chainSelectAddress).setNext(chainSelectChecker);
chainApplyDevice.run(); //最后执行结果为111-222-333

http://www.niftyadmin.cn/n/5151746.html

相关文章

代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零

代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零 文章链接:最后一块石头的重量 II 目标和 一和零 视频链接:最后一块石头的重量 II 目标和 一和零 1. LeetCode 1049. 最后一块石头的重量 II 1.1 思路…

解决vmware安装ubuntu虚拟机显示不全以及无法实现windows与虚拟机之间无法相互复制粘贴问题

01、存在问题 02、解决方案 sudo apt-get autoremove open-vm-tools sudo apt-get install open-vm-tools sudo apt-get install open-vm-tools-desktop reboot //重启在这里插入图片描述 存在Bug 如果遇到一下问题,请先执行下列命令,然后…

vs的使用技巧

vs的使用技巧 1.快捷键:2.代码编辑:3.调试:4.代码导航:5.代码重构:6.解决方案资源管理器:7.自定义设置:8.插件扩展:9.团队合作:10.学习资源: Visual Studio&a…

FFmpeg直播能力更新计划与新版本发布

// 编者按:客户端作为直接面向用户大众的接口,随着技术的发展进化与时俱进,实现更好的服务是十分必要的。FFmpeg作为最受欢迎的视频和图像处理开源软件,被相关行业的大量用户青睐,而随着HEVC标准的发布到广泛使用&am…

MySQL连接时出现Host ‘::1‘ is not allowed to connect to this MySQL server

报错原因 之前想着要提高一下连接速度,所以在my.ini中加入了:skip-name-resolve,当时的数据库root账号设置的登录权限是%,因此没有出现连接错误,这次因为是新建数据库,root账号的登录权限默认是localhost&…

测试概念第六篇—代码检查的常见错误

代码检查,是以组为单位阅读代码,进行一系列规程和错误检查技术的集合,通常由代码检查小组负责。代码的错误列表如下: 一、数据引用错误 1.是否有引用的变量未赋值或未初始化? 2.对于数组引用,是否每个下…

计算虚拟化2——内存虚拟化

目录 物理机内存访问过程 虚拟地址VA和物理地址PA概念 MUU实现VA到PA所使用的映射表 内存虚拟化类型 内存软件辅助虚拟化 内存硬件辅助虚拟化 内存虚拟化-内存超分配 内存共享 内存置换 内存气泡 物理机内存访问过程 内存的基本知识 内存都是从物理地址0开始的&…

TCP IP 网络编程(七) 理解select和epoll的使用

文章目录 理解select函数select函数的功能和调用顺序设置文件描述符设置监视范围及超时select函数调用示例 优于select的epoll基于select的I/O复用速度慢实现epoll时必要的函数和结构体epoll_createepoll_ctlepoll_wait基于epoll的服务器端 边缘触发和水平触发 理解select函数 …