本期我们来聊聊责任链,先看定义:让多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,连接这些对象组成一个链,并且请求沿着链传递,直到一个对象处理它。这个定义其实不难理解。下面我们通过一组图片来形象地解释责任链。那么它的作用将是耐人寻味的。我的理解之一就是解耦,这样代码的各个模块只能更加清晰。看下面的例子:这是改造前的一段代码(PS网上找的例子),不起眼,如果设置if,后期就不好看了。维护各个模块的职责不是很明确。varorder=function(orderType,pay,stock){if(orderType===1){//500元定金购买模式if(pay===true){//支付定金console.log('500元定金预购-下单,送100张优惠券');}else{//押金未付,降级为普通购买模式if(stock>0){//用于普通购买的手机还在库存中console.log('普通购买,无优惠券');}else{console.log('手机库存不足');}}}elseif(orderType===2){//200元定金购买模式if(pay===true){console.log('200元定金预购,送50券');}else{if(stock>0){console.log('正常购买,无优惠券');}else{console.log('手机库存不足');}}}elseif(orderType===3){if(stock>0){console.log('正常购买,无优惠券');}else{console.log('手机库存不足');}}};order(1,true,500);//输出:预购订金500元,赠送100张优惠券我们来看看修改后的代码。很清楚,可以看懂每个模块的作用//500元订单varorder500=function(orderType,pay,stock){if(orderType===1&&pay===true){console.log('预购订金500元,送100张优惠券');}else{order200(orderType,pay,stock);//将请求传递给200元订单}};//200元订单varorder200=function(orderType,pay,stock){if(orderType===2&&pay===true){console.log('预购定金200元,送50张优惠券');}else{orderNormal(orderType,pay,stock);//将请求传递给正常订单}};//正常购买订单varorderNormal=function(orderType,pay,stock){if(stock>0){console.log('正常购买,无优惠券');}else{console.log('手机库存不足');}};//测试结果:order500(1,true,500);//输出:预购定金500元,赠券100张order500(1,false,500);//输出:正常购买,无优惠券order500(2,true,500);//输出:预购定金200元,赠送50张优惠券order500(3,false,500);//输出:正常购买,无优惠券order500(3,false,0);//输出:手机库存不足那么我们不得不思考,责任链真的只是干这个吗?互联网上到处都是类似的演示。解耦真的能最大限度地发挥责任链的作用吗?答案是:不会。责任链的核心功能是:一步步处理,每一步处理一点点(功能内),最后全部处理完去体会。是链子,为什么要戴成链子呢?看下图那么实战(前端)中的例子有哪些呢?我觉得可以用责任链模型改造以下几个模块1.复杂数据过滤2.HTTP拦截器3.路由权限过滤等等。下面是数据过滤的流程图。说到这里,虽然没有实战,但是为大家提供思路,希望对大家有所帮助。
