JS逐日一题:设想形式-怎样明白职责链形式?

20190412期

设想情势-怎样邃晓职责链情势?

定义: 使多个对象都有时机处置惩罚要求,从而防止要求的发送者和吸收者之间的耦合关联,将这些对象连成一条链,并沿着这条链通报该要求,直到有一个对象处置惩罚它为止

也就是说,要求今后,从第一个对象最先,链中收到要求的对象要么亲身处置惩罚它,要么转发给链中的下一个候选者。提交要求的对象并不邃晓晓得哪个对象将会处置惩罚它——也就是该要求有一个隐式的接受者(implicit receiver)。依据运转时候,任一候选者都能够响应响应的要求,候选者的数量是恣意的,你能够在运转时候决议哪些候选者介入到链中

还不邃晓?ok, 来个生涯小实例, 早岑岭挤公交车,每每挤上去却看不到售票员,我们常常经由过程别人之手将票钱通报给售票员,这类关联就可以看做为职责链,我们的票钱经由过程多人之手终究递交到售票员手中

代码场景:
假定我们正在开辟一个电商网站,某一个商品正在举行预定运动,运动划定规矩以下

500 元定金会收到200 优惠劵
200 元定金会收到100 优惠劵
没有预定的用户只能一般购置
假定我们后端会返回以下字段

orderType [1,2,3] 分别为500,200,一般购置

通例完成:

const order = function(orderType){
  if(orderType===1){
    // 假定我们有别的需求
    if(....){
      .....
    }
    return console.log(500元定金用户)
  }
  if(orderType===2){
    // 假定我们有别的需求
    if(....){
      .....
    }
    return console.log(200元定金用户)
  }
  if(orderType===3){
    // 假定我们有别的需求
    if(....){
      .....
    }
    return console.log(用户一般购置)
  }
}
order(1) // 500元定金用户

虽然我们得到了意料中的运转效果,但这并非一段优异的代码,order函数会跟着营业的变动常常修正

下面我们用职责链情势举行改写

const Chain = function(fn){
  this.fn = fn;
  this.successor = null;
}
Chain.prototype.setNextSuccessor = function(successor){ 指定在链中的下一个节点
  return this.successor = successor;
}
Chain.prototype.passRequest = function(){  //通报要求给某一下节点
  var ret = this.fn.apply(this,arguments);
  if(ret === false){  // 假如ret 为false 代表链条还得继承往下走
    return this.successor && this.successor.passRequest.apply(this.successor,arguments)
  }
}
// 包装成职责链的节点
var chainOrder500 = new Chain(order500);
var chainOrder200 = new Chain(order200);
// 然后再指定节点在链中的递次
chainOrder500.setNextSuccessor(chainOrder200)
// 末了把要求通报给第一个节点
chainOrder500.passRequest(1)  // 500元定金用户
用AOP(Aspect Oriented Programming )完成职责链

用AOP完成职责链又简朴又奇妙,但这类函数叠加在一起的体式格局,同时也叠加了函数的作用域,假如链条太长也会对机能形成影响

Function.prototype.after(fn){
  var _this = this;
  return function(){
    var ret = _this.apply(this,arguments);
    if(ret === false){
      return fn.apply(this.arguments);
    }
    return ret
  }
}
var order = order500.after(order200).after(orderNormal);
order(2) // 200定金用户

总结

职责链情势能够很好的协助我们治理代码,下降提议要求的对象跟吸收要求对象的耦合,职责链中的节点递次是可变化的,我们能够在运转中决议链中包括哪些节点

关于JS逐日一题

JS逐日一题能够看成是一个语音答题社区
天天应用碎片时候采纳60秒内的语音情势来完成当天的考题
群主在越日0点推送当天的参考答案

  • 注 毫不仅限于完成当天使命,更多是查漏补缺,进修群内别的同砚优异的答题思绪

点击到场答题

    原文作者:febobo
    原文地址: https://segmentfault.com/a/1190000018865533
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞