职责链模式

  • 定义

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

优点:

1.可以根据需求变动,任意向责任链中添加 / 删除节点对象。

2.没有固定的“开始节点”,可以从任意节点开始。

缺点:责任链最大的代价就是每个节点带来的多余消耗。当责任链过长,很多节点只有传递的作用,而不是真正地处理逻辑。

// 假设我们负责一个售卖手机的电商网站,经过分别交纳500元定金和200元定金的两轮
// 预定后(订单已在此时生成),现在已经到了正式购买的阶段。
// 公司针对支付过定金的用户有一定的优惠政策。在正式购买后,已经支付过500元定
// 金的用户会收到100元的商城优惠券,200元定金的用户可以收到50元的优惠券,而之前
// 没有支付定金的用户只能进入普通购买模式,也就是没有优惠券,且在库存有限的情况
// 下不一定保证能买到。
// orderType:表示订单类型(定金用户或者普通购买用户),
// code的值为1的时候是500元定金用户,为2的时候是200元定金用户,为3的时候是普通购买用户。
// pay:表示用户是否已经支付定金,值为true或者false,
// 虽然用户已经下过500元定金的订单,但如果他一直没有支付定金,
// 现在只能降级进入普通购买模式。
// stock:表示当前用于普通购买的手机库存数量,已经支付过500元或者200元定金的用户不受此限制。

let order500 = function (code, pay, stock) {
    if (code === 1 && pay) {
        console.log('收到100优惠卷')
    } else {
        return 'next'
    }
}

let order200 = function (code, pay, stock) {
    if (code === 2 && pay) {
        console.log('收到50优惠卷')
    } else {
        return 'next'
    }
}

let orderNormal = function (code, pay, stock) {
    if (code === 3 || !pay) {
        stock ? console.log('没有优惠卷哦') : console.log('没货了')
    }
}

// 节点类
class Node {
    constructor(fn) {
        this.fn = fn // 当前节点做的事
        this.nextNode = null //下一个节点类
    }

    toNextNode(nextNode) {
        this.nextNode = nextNode // 指定当前节点的下一个节点类
    }

    getResult() {
        let res = this.fn.apply(this, arguments)
        res === 'next' && (this.nextNode && this.nextNode.getResult.apply(this.nextNode, arguments))
        return res
    }
}

// 设置三个节点
let node500 = new Node(order500)
let node200 = new Node(order200)
let nodeNormal = new Node(orderNormal)

// 设置节点指向(职责链)
node500.toNextNode(node200)
node200.toNextNode(nodeNormal)

node500.getResult(1, true, 2)
node500.getResult(2, true, 2)
node500.getResult(2, false, 2)
node500.getResult(3, true, 2)
node500.getResult(3, true, 0)
Copyright © lujiannb@qq.com 2021 all right reserved,powered by Gitbook该文章修订时间: 2024-06-06 11:32:07

results matching ""

    No results matching ""