责任链模式

Posted eret9616

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了责任链模式相关的知识,希望对你有一定的参考价值。

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

 

示例:

/**
* 责任链模式
*/

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到最后

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

 

 













以上是关于责任链模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之责任链模式

行为型设计模式之责任链模式

java 设计模式 -- 责任链模式

责任链模式(Chain of Responsibility Pattern)

设计模式责任链模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式15--从审批流中学习责任链模式