JS每日一题:设计模式-如何理解职责链模式?

Posted JS每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS每日一题:设计模式-如何理解职责链模式?相关的知识,希望对你有一定的参考价值。

20190412期

设计模式-如何理解职责链模式?

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

也就是说,请求以后,从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者。提交请求的对象并不明确知道哪一个对象将会处理它——也就是该请求有一个隐式的接受者(implicit receiver)。根据运行时刻,任一候选者都可以响应相应的请求,候选者的数目是任意的,你可以在运行时刻决定哪些候选者参与到链中

还不明白?ok, 来个生活小实例, 早高峰挤公交车,往往挤上去却看不到售票员,我们常常通过他人之手将票钱传递给售票员,这种关系就能看做为职责链,我们的票钱通过多人之手最终递交到售票员手中

代码场景:  假设我们正在开发一个电商网站,某一个商品正在进行预定活动,活动规则如下

500 元定金会收到200 优惠劵 200 元定金会收到100 优惠劵 没有预定的用户只能普通购买 假设我们后端会返回如下字段

orderType [1,2,3] 分别为500,200,普通购买

常规实现:

 
   
   
 
  1. const order = function(orderType){

  2. if(orderType===1){

  3. // 假设我们有其它需求

  4. if(....){

  5. .....

  6. }

  7. return console.log(500元定金用户)

  8. }

  9. if(orderType===2){

  10. // 假设我们有其它需求

  11. if(....){

  12. .....

  13. }

  14. return console.log(200元定金用户)

  15. }

  16. if(orderType===3){

  17. // 假设我们有其它需求

  18. if(....){

  19. .....

  20. }

  21. return console.log(用户普通购买)

  22. }

  23. }

  24. order(1) // 500元定金用户

虽然我们得到了意料中的运行结果,但这并不是一段优秀的代码,order函数会随着业务的变更经常修改

下面我们用职责链模式进行改写

 
   
   
 
  1. const Chain = function(fn){

  2. this.fn = fn;

  3. this.successor = null;

  4. }

  5. Chain.prototype.setNextSuccessor = function(successor){ 指定在链中的下一个节点

  6. return this.successor = successor;

  7. }

  8. Chain.prototype.passRequest = function(){ //传递请求给某一下节点

  9. var ret = this.fn.apply(this,arguments);

  10. if(ret === false){ // 如果ret 为false 代表链条还得继续往下走

  11. return this.successor && this.successor.passRequest.apply(this.successor,arguments)

  12. }

  13. }

  14. // 包装成职责链的节点

  15. var chainOrder500 = new Chain(order500);

  16. var chainOrder200 = new Chain(order200);

  17. // 然后再指定节点在链中的顺序

  18. chainOrder500.setNextSuccessor(chainOrder200)

  19. // 最后把请求传递给第一个节点

  20. chainOrder500.passRequest(1) // 500元定金用户

用AOP(Aspect Oriented Programming )实现职责链

用AOP实现职责链又简单又巧妙,但这种函数叠加在一起的方式,同时也叠加了函数的作用域,如果链条太长也会对性能造成影响

 
   
   
 
  1. Function.prototype.after(fn){

  2. var _this = this;

  3. return function(){

  4. var ret = _this.apply(this,arguments);

  5. if(ret === false){

  6. return fn.apply(this.arguments);

  7. }

  8. return ret

  9. }

  10. }

  11. var order = order500.after(order200).after(orderNormal);

  12. order(2) // 200定金用户

总结

职责链模式可以很好的帮助我们管理代码,降低发起请求的对象跟接收请求对象的耦合,职责链中的节点顺序是可变化的,我们可以在运行中决定链中包含哪些节点


最近答题



基友噢如果喜欢,可以分享给好基友噢如果喜欢,可以分享给好基友噢


关注「JS每日一题」,参与答题


以上是关于JS每日一题:设计模式-如何理解职责链模式?的主要内容,如果未能解决你的问题,请参考以下文章

每日一题Dubbo源码使用了哪些设计模式

每日一题01.单例模式

爱创课堂每日一题第三十四天-用过哪些设计模式?

每日一题: 分库分表之后,id主键如何处理?

老男孩教育每日一题-2017年3月20日:使用rsync守护进程模式,经常会出现的异常情况说明,并说明应该如何解决

爱创课堂每日一题第二天8/24日 Quirks模式是什么?它和Standards模式有什么区别?