返回顶部
首页 > 资讯 > 精选 >javascript职责链模式的代码怎么写
  • 170
分享到

javascript职责链模式的代码怎么写

2023-06-27 09:06:17 170人浏览 安东尼
摘要

这篇“javascript职责链模式的代码怎么写”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“javascript职责链模式

这篇“javascript职责链模式的代码怎么写”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“javascript职责链模式的代码怎么写”文章吧。

职责链的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象能处理它为止,传递链中的这些对象就叫节点。

需求背景: 一个电商网站,用户交500定金且定金已付时,可享受500优惠券且不受货物数量限制;用户交200定金且定金已付时,可享受500优惠券且不受货物数量限制;用户不交定金时受货物数量限制,有货时原价买,无货时则无法买。

原始版本, if else一路判断

var buyOrder = function(orederType, pay, stock){    if(orederType == 1){        if(pay){            console.log('500优惠券');        }else {            if(stock > 0){                console.log('普通购物页面');            }else {                console.log('已无货');            }        }    }else if(orederType == 2){        if(pay){            console.log('200优惠券');        }else {            if(stock > 0){                console.log('普通购物页面');            }else {                console.log('已无货');            }        }    }else if(orederType == 3){        if(stock > 0){            console.log('普通购物页面');        }else {            console.log('已无货');        }    }}buyOrder(1, true, 600)

改进版本

var order500 = function(orderType, pay , stock){    if(orderType == '1' && pay == true){        console.log('500优惠券');    }else {        order200(orderType, pay , stock)    }}var order200 = function(orderType, pay , stock){    if(orderType == '2' && pay == true){        console.log('200优惠券');    }else {        orderNORMal(orderType, pay , stock)    }}var orderNormal = function(orderType, pay , stock){    if(stock > 0){        console.log('普通购物页面');    }else {        console.log('已无货');    }}order500(3, true, 0)

优化版本1:
同步的职责链

//3个订单函数 ,它们都是节点函数var order500 = function(orderType, pay , stock){    if(orderType == '1' && pay == true){        console.log('500优惠券');    }else {        return 'nextSuccessor';     //我不知道下个节点是谁,反正把请求往后传递    }}var order200 = function(orderType, pay , stock){    if(orderType == '2' && pay == true){        console.log('200优惠券');    }else {        return 'nextSuccessor';     //我不知道下个节点是谁,反正把请求往后传递    }}var orderNormal = function(orderType, pay , stock){    if(stock > 0){        console.log('普通购物页面');    }else {        console.log('已无货');    }}//职责构造函数var Chain = function(fn){    this.fn = fn;    this.successor = null;}Chain.prototype.setNextSuccessor = function(successor){     //设置职责顺序方法    this.successor = successor}Chain.prototype.passRequest = function(){       //请求传递    var ret = this.fn.apply(this, arguments)    if(ret === 'nextSuccessor'){        return this.successor && this.successor.passRequest.apply(this.successor, arguments)    }    return ret;}//把3个订单函数分别包装成职责链的节点var chainOrder500 = new Chain(order500)var chainOrder200 = new Chain(order200)var chainOrderNormal = new Chain(orderNormal)//然后指定节点在职责链中的顺序chainOrder500.setNextSuccessor(chainOrder200)chainOrder200.setNextSuccessor(chainOrderNormal)//最后把请求传递给第一个节点,开启职责链模式传递chainOrder500.passRequest(1, true, 500)     //500优惠券chainOrder500.passRequest(3, true, 20)      //普通购物页面chainOrder500.passRequest(3, true, 0)       //已无货//此时如果中间有需求改动,只需如此做: var order300 = function(){    if(orderType == '3' && pay == true){        console.log('300优惠券');    }else {        return 'nextSuccessor';     //我不知道下个节点是谁,反正把请求往后传递    }}var chainOrder300 = new Chain(order300)     //添加新职责节点chainOrder500.setNextSuccessor(chainOrder300)chainOrder300.setNextSuccessor(chainOrder300)   //修改职责链顺序chainOrder200.setNextSuccessor(chainOrderNormal)//这样,就可以完全不必去理会原来的订单函数代码,只需增加一个节点,然后重新设置职责链中的相关节点的顺序就行。

优化版本2:异步的职责链

在实际开发中,经常会遇到 一些异步的问题,比如要在节点函数中发起一个ajax请求,异步请求返回的结果才能决定是否继续在职责链中passRequest

可以给Chain类再增加一个原型方法:

//职责构造函数var Chain = function(fn){    this.fn = fn;    this.successor = null;}Chain.prototype.setNextSuccessor = function(successor){     //设置职责顺序方法    this.successor = successor}Chain.prototype.passRequest = function(){       //请求传递    var ret = this.fn.apply(this, arguments)    if(ret === 'nextSuccessor'){    //传递给职责链中的下一个节点        return this.successor && this.successor.passRequest.apply(this.successor, arguments)    }    return ret;}//新增,表示手动传递请求给职责链中的下一个节点Chain.prototype.next = function(){    return this.successor && this.successor.passRequest.apply(this.successor, arguments)}//异步职责链例子var fn1 = new Chain(function(){    console.log(1);    return 'nextSuccessor'})var fn2 = new Chain(function(){    console.log(2);    var self = this;    setTimeout(function(){        self.next()    }, 1000)})var fn3 = new Chain(function(){    console.log(3);})//指定节点在职责链中的顺序fn1.setNextSuccessor(fn2)fn2.setNextSuccessor(fn3)//把请求传递给第一个节点,开始节点传递fn1.passRequest()//输出 1 2 ...(1秒后)... 3//这是一个异步职责链,请求在职责链节点中传递,但节点有权利决定什么时候 把请求交给下一个节点。这样可以创建一个异步ajax队列库。

tips:

这里补充个知识点:“短路求值” && 会返回第一个假值(0, null, "", undefined, NaN),而 || 则会返回第一个真值。

var x = a || b || c 等价于:

var x;if(a){    x = a;} else if(b){    x = b;} else {    x = c;}

var x = a && b && c 等价于:

var x = a;if(a){    x = b;    if(b){        x = c;    }}

所以 && 有时候会用来代替 if (expression) doSomething(),转成 &&方式就是 expression && doSomething()

而 || 比较用来在函数中设置默认值,比如:

function doSomething(arg1, arg2, arg3) {    arg1 = arg1 || 'arg1Value';    arg2 = arg2 || 'arg2Value';}

不过还需要看具体的使用场景,就比如如果要求 doSomething() 传入的 arg1 为一个数值,则上面的写法就会出现问题(在传入 0 的时候被认为是一个假值而使用默认值)。

现在个人比较常用的方法只判断是否与 undefined 相等,比如

function doSomething(arg) {    arg = arg !== void 0 ? arg : 0;}

职责链模式的优势:解耦请求发送者和 N 个接收者之间的复杂关系,由于不知道链条中的哪个节点可以处理你发出的请求,所以只需把请求传递给第一个节点就行。

如果在实际开发中,当维护一个含有多个条件分支语句的巨大函数时时,可以使用职责链模式。链中的节点对象可以灵活拆分重组,增加删除节点,且无需改动其他节点函数内的代码。

以上就是关于“javascript职责链模式的代码怎么写”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: javascript职责链模式的代码怎么写

本文链接: https://lsjlt.com/news/309323.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • javascript职责链模式的代码怎么写
    这篇“javascript职责链模式的代码怎么写”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“javascript职责链模式...
    99+
    2023-06-27
  • JavaScript设计模式之职责链模式
    目录概述代码实现参数定义实现职责链模式实现改良概述 职责链模式是设计模式中行为型的一种设计模式; 定义:使多个对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合关系,将这些...
    99+
    2024-04-02
  • GoLang职责链模式代码实现介绍
    目录1. 需求2. 代码实现1. manager.go2. skill1_manager.go3. skill2_manager.go4. skill3_manager.go5. m...
    99+
    2023-05-19
    GoLang职责链模式 GoLang责任链模式
  • JavaScript设计模式之职责链模式详解
    目录职责链模式1. 现实中的职责链模式2. 实际开发中的职责链模式3. 用职责链模式重构代码4. 灵活可拆分的职责链节点5. 异步的职责链6. 职责链模式的优缺点7. 用 AOP 实...
    99+
    2022-11-13
    JavaScript 设计模式 JavaScript 职责链模式
  • Java职责链模式怎么实现
    本篇内容主要讲解“Java职责链模式怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java职责链模式怎么实现”吧!一、职责链模式的定义与特点定义:为了避免请求发送者与多个请求处理者耦合在...
    99+
    2023-06-22
  • C语言责任链模式代码怎么写
    这篇文章主要讲解了“C语言责任链模式代码怎么写”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言责任链模式代码怎么写”吧!介绍:责任链模式是一种行为模式,它可以允许你将请求沿着处理者链进行...
    99+
    2023-06-22
  • JavaScript设计模式之职责链模式的示例分析
    小编给大家分享一下JavaScript设计模式之职责链模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java基本数据类型有哪些Java的基本数据类型...
    99+
    2023-06-14
  • Chain of Responsibility职责链模式怎么实现
    本文小编为大家详细介绍“Chain of Responsibility职责链模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Chain of Responsibility职责链模式怎么实现”文章...
    99+
    2024-04-02
  • Java职责链模式的深入了解
    目录一、职责链模式的定义与特点二、职责链模式的结构三、职责链模式案例总结一、职责链模式的定义与特点 定义: 为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前...
    99+
    2024-04-02
  • C++单一职责原则的代码怎么写
    今天小编给大家分享一下C++单一职责原则的代码怎么写的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。单一职责原则:就一个类而言...
    99+
    2023-07-05
  • 如何理解Java设计模式的职责链模式
    本篇内容介绍了“如何理解Java设计模式的职责链模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是职责链模式客户端发出一个请求,链...
    99+
    2023-06-25
  • Java责任链模式实例代码分析
    本文小编为大家详细介绍“Java责任链模式实例代码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java责任链模式实例代码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。优点降低耦合度。它将请求的发送者和...
    99+
    2023-06-29
  • C语言责任链模式示例代码
    目录介绍:作用:类比:示例:总结介绍: ​ 责任链模式是一种行为模式,它可以允许你将请求沿着处理者链进行发送,收到请求以后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处...
    99+
    2024-04-02
  • javascript中介者模式的代码怎么写
    这篇文章主要介绍“javascript中介者模式的代码怎么写”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“javascript中介者模式的代码怎么写”文章能帮助大家解决问题。中介者对象践行了最少知识...
    99+
    2023-06-27
  • java责任链模式怎么实现
    Java中实现责任链模式可以使用以下步骤: 定义一个抽象的处理器(Handler)类,该类包含一个指向下一个处理器的引用和一个处理...
    99+
    2024-02-29
    java
  • JavaScript设计模式之责任链模式的的示例分析
    这篇文章主要介绍了JavaScript设计模式之责任链模式的的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本文实例讲述了JavaS...
    99+
    2024-04-02
  • 责任链模式在SpringAOP中怎么用
    小编给大家分享一下责任链模式在SpringAOP中怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  当一个对象在一条链上被多个拦截器拦截处理时,我们这样的设...
    99+
    2023-06-02
  • java设计模式的单一职责原则怎么实现
    这篇“java设计模式的单一职责原则怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java设计模式的单一职责原则怎么...
    99+
    2023-06-17
  • PHP中的责任链模式是什么
    本篇内容介绍了“PHP中的责任链模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!责任链模式,属于对象行为型的设计模式。Gof类图及解...
    99+
    2023-06-20
  • java设计模式中的责任链模式是什么
    本篇文章为大家展示了java设计模式中的责任链模式是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一:模式说明模式定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作