zoukankan      html  css  js  c++  java
  • 责任链模式

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

    示例:

    /**
    * 责任链模式
    */

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

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

  • 相关阅读:
    spring:事务的5大隔离级别,7大传播行为
    spring事务管理(xml配置)与spring自带连接数据库JdbcTemplate
    spring顾问包装通知
    Spring常见的两种增强方式
    Spring-增强方式注解实现方式
    Spring----aop(面向切面编程)
    Spring_IOC
    服务器项目代码在本地打断点调试
    FreeMarker标签出错问题
    Eclipse启动项目没加载到webapps目录下
  • 原文地址:https://www.cnblogs.com/eret9616/p/10084238.html
Copyright © 2011-2022 走看看