再一次,javascript设计模式与开发实践-职责链模式

简述

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

例如高峰期搭公交,上车后没办法刷卡,只好把羊城通往前传递,经过几个人传递,最终才刷到卡。
例如上课时传纸条,同学间帮忙传递,最终送到要送到的人手上。

使用场景

  • 兼容判断
  • 订单优惠
  • ..

案例

我们负责的电商网站购买有一些优惠。

  • 支付500元定金得到100元优惠券。
  • 支付200元定金得到50元优惠券。
  • 不支付定金,无优惠。

为了不写出大量if判断,可以采用职责链模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Function.prototype.after = function (fn) {
    var that = this;

    return function () {
        var ret = that.apply(this, arguments);

        if (ret === 'nextSuccessor') {
            return fn.apply(this, arguments);
        }

        return ret;
    };
};

var order500 = function(type, pay, stock) {
    if(type === 1 && pay) {
        console.log('500定金,赠送100优惠券');
    } else {
        return 'nextSuccessor';
    }
};

var order200 = function(type, pay, stock) {
    if(type === 2 && pay) {
        console.log('200定金,赠送50优惠券');
    } else {
        return 'nextSuccessor';
    }
};

var orderNormal = function(type, pay, stock) {
    if(stock > 0) {
        console.log('普通购买,无优惠券');
    } else {
        console.log('库存不足');
    }
};

var order = order500.after(order200).after(orderNormal);

order(1, true, 500);
order(2, true, 200);
order(1, false, 500);