/**
* 责任链模式
*/
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到最后
调用栈中 函数栈帧全部出栈