再来认真的学习一下责任链模式:

 

示例:

/**
* 责任链模式
*/

var order500 = function (orderType, isPaid, stock) {

if (orderType === 1 && isPaid === true) {
console.log('500元定金预购,得到100优惠券')
} else {
return 'nextSuccessor'
}
}



var order200 = function (orderType, isPaid, stock) {

if (orderType === 2 && isPaid === true) {
console.log('200元定金预购,得到50优惠券')
} else {
return 'nextSuccessor'
}
}

var orderNormal = function (orderType, isPaid, stock) {

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

// 给函数原型添加方法 after
Function.prototype.after = function (fn) {
// 拿到函数中的this
let self = this
 
// 返回的是一个函数
return function () {

// 把 aruguments拿进去执行
let ret = self.apply(this, arguments)
 
// 如果返回的是'next...
if (ret === 'nextSuccessor')
{
// 执行参数fn
return fn.apply(this, arguments)
} else{
 
return
}
}

}

var order = order500.after(order200).after(orderNormal)
 
order(1, true, 10)
 
责任链在23种设计模式中的这里:
(行为型模式——责任链模式)
责任链模式_函数栈

分析一下示例代码:

order500.after(order200)

这样操作后返回的是一个函数,

// 返回的是一个函数
return function () {
// 把 aruguments拿进去执行
let ret = self.apply(this, arguments)
 
// 如果返回的是'next...
if (ret === 'nextSuccessor')
{
// 执行参数fn
return fn.apply(this, arguments)
} else{
    return
   }
}

函数的第一行是拿夫层闭包函数将this和arguments传进去并执行,

如果外面闭包返回的是'nextSuccessor' 就执行fn函数,并将fn函数的结果return

否则return的是没有值的 (即:return )

 

分析一下三个或更多chain起来的情况

order500.after(order200).after(orderNormal)

返回的一个函数,先执行第一行let ret = (执行外面的闭包)

到了外面这层闭包中还是执行第一行let ret =(执行这层外面的闭包)

如果返回的是'nextsuccessor'就会执行ret 并将ret的接回返回给下一层

一旦有一层返回了return 空(即没有返回'nextSuccessor  

就会一直向下传递,每层都执行return 一直return到最后

调用栈中 函数栈帧全部出栈