• 责任链模式


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

    示例:

    /**
    * 责任链模式
    */

    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服务,内存OOM了,如何快速定位?
    Java内存分析工具MAT(Memory Analyzer Tool)安装使用实例
    jmap使用方法及原理
    可能发生Full gc 的情况
    java--jvm GC-常用参数配置
    JVM. GC 性能调优方法与思路
    《嫌疑人X的献身》——两个天才之间的思想火花
    爱的纯粹与代价
    18年下半年计划表
    阿里校招准备-总纲
  • 原文地址:https://www.cnblogs.com/eret9616/p/10084238.html
Copyright © 2020-2023  润新知