js 责任链设计模式

在业务逻辑中,有时会遇到解决一个问题需要多个步骤的操作,下一个步骤的执行需要上一个步骤的结果,当多个步骤前后都有依赖时,再坚持通过很多if eles解决问题的话,代码就容易变得不可维护,这种情况下,责任链模式的运用就十分关键。
举个简单的例子,在一促销活动中,有提前预定的活动,500元预定返现100,200元预定返现50,没有预定原价购买。交了定金的不会担心库存没有,没交定金的,库存没了就买不了了。下面通过责任链模式展现一下业务的处理过程。

  const order500 = function (orderType, pay, stock) {
      if(orderType === 5 && pay === true) {
          console.log('500元定金预购,得到100优惠卷')
      }else{
          return 'nextSuccessor'
      }
    }

    const order200 = function (orderType, pay, stock) {
        debugger
        if(orderType === 2 && pay === true) {
            console.log('200元定金预购,得到50优惠卷')
        }else{
            return 'nextSuccessor'
        }
    }

    const orderNormal = function (orderType, pay, stock) {
        if(stock > 0){
            console.log('普通购买,无优惠券')
        } else {
            console.log('库存不足')
        }
    }

以上是每种业务对应的函数,每个函数完全独立,没有任何依赖关系,只是如果不满足当前函数处理条件的话,返回‘nextSuccessor’,用该告诉调用者可以进行下一逻辑的处理。
但是现在还缺少一个串联者,用来把这些函数链接起来的角色,下面的类可以用来构造联条的每个环节

function Chain(fn) {
        this.fn = fn
        this.successor = null
    }
    Chain.prototype.setNextSuccessor = function (successor) {
        return this.successor = successor
    }
    Chain.prototype.passRequest = function () {
       let res = this.fn.apply(this, arguments)
       if(res === 'nextSuccessor') {
           return this.successor && this.successor.passRequest.apply(this.successor, arguments)
       }
    }

此时就可以构造联条了

 const chainOrder500 = new Chain(order500);
 const chainOrder200 = new Chain(order200);
 const chainOrderNormal = new Chain(orderNormal)

链条好了,但是还要连起来

chainOrder500.setNextSuccessor(chainOrder200)
 chainOrder200.setNextSuccessor(chainOrderNormal)

最后是对责任链的触发

chainOrder500.passRequest(2, true, 2) // 预约单类型,是否付款,库存
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,...
    yufawu阅读 408评论 0 3
  • javascript设计模式与开发实践 设计模式 每个设计模式我们需要从三点问题入手: 定义 作用 用法与实现 单...
    穿牛仔裤的蚊子阅读 4,296评论 0 13
  • 摘自《JavaScript设计模式与开发实践》 职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送...
    小小的白菜阅读 364评论 0 2
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,395评论 0 3
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,120评论 1 10