• 设计模式-职责连模式


    职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止

    假设我们负责一个售卖手机的电商网站,需求如下:

    1. 已经支付过 500元定金的用户会收到 100元的商城优惠券
    2. 已经支付200元定金的用户可以收到 50元的优惠券
    3. 没有支付定金的用户只能进入普通购买模式,也就是没有优惠券,且在库存有限的情况下不一定保证能买到

    后端提供了以下三个字段:

    1. orderType :表示订单类型(定金用户或者普通购买用户),code 的值为 1的时候是 500元
      定金用户,为 2的时候是 200元定金用户,为 3的时候是普通购买用户。

    2. pay :表示用户是否已经支付定金,值为 true 或者 false , 虽然用户已经下过 500元定金的订单,但如果他一直没有支付定金,现在只能降级进入普通购买模式。

    3. stock :表示当前用于普通购买的手机库存数量,已经支付过 500 元或者 200 元定金的用
      户不受此限制

    Function.prototype.after = function(fn) {
      var self = this;
      return function() {
        var ret = self.apply(this, arguments);
        if (ret === 'nextSuccessor') {
          return fn.apply(this, arguments);
        }
        return ret;
      }
    };
    
    var order500 = function(orderType, pay, stock) {
      if (orderType === 1 && pay === true) {
        console.log('500 元定金预购,得到 100 优惠券');
      } else {
        return 'nextSuccessor'; // 我不知道下一个节点是谁,反正把请求往后面传递
      }
    };
    var order200 = function(orderType, pay, stock) {
      if (orderType === 2 && pay === true) {
        console.log('200 元定金预购,得到 50 优惠券');
      } else {
        return 'nextSuccessor'; // 我不知道下一个节点是谁,反正把请求往后面传递
      }
    };
    var orderNormal = function(orderType, pay, stock) {
      if (stock > 0) {
        console.log('普通购买,无优惠券');
      } else {
        console.log('手机库存不足');
      }
    };
    
    var order = order500.after(order200).after(orderNormal);
    
    order(1, true, 300); // 输出:500 元定金预购,得到 100 优惠券
    order(2, true, 300); // 输出:200 元定金预购,得到 50 优惠券
    order(1, false, 300); // 输出:普通购买,无优惠券
    

    职责链模式的最大优点就是解耦了请求发送者和 N 个接收者之间的复杂关系。比如上面购买手机的例子,后期如果添加了其他优惠券,只需要在职责链里再添加一个after函数,逻辑很清晰。

    职责链模式使得程序中多了一些节点对象,可能在某一次的请求传递过程中,大部分
    节点并没有起到实质性的作用,它们的作用仅仅是让请求传递下去,从性能方面考虑,要避
    免过长的职责链带来的性能损耗

    常用网站: SegmentFault | GitHub | 掘金社区
  • 相关阅读:
    JS 异步编程
    JS XMLHttpRequest
    JS 日期
    JS DOM
    JS 异常处理
    JS BOM
    JS 正则表达式
    JS 面向对象
    (22)python PhantomJS
    HDU1698 线段树(区间更新区间查询)
  • 原文地址:https://www.cnblogs.com/yesyes/p/15375974.html
Copyright © 2020-2023  润新知