职责链模式

发布于 2021-11-28 20:12:39 字数 1934 浏览 1134 评论 0

定义

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

优点

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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

醉城メ夜风

文章 0 评论 0

远昼

文章 0 评论 0

平生欢

文章 0 评论 0

微凉

文章 0 评论 0

Honwey

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文