aiyoudiao aiyoudiao
  • JavaScript
  • Vue
  • React
  • 低代码
  • 线性系统
  • 暂未分类
  • LeetCode
  • 算法
  • 数据结构
  • 设计模式
  • Other
  • PMP
  • Office
  • 面试
  • Bash
  • 流年往事
  • 经验片段
  • 读书杂感
  • 归档
  • 分类
  • 标签
  • 简介
  • 收藏
  • 有趣
  • 文档

码二

扫微信二维码,认识一下码二吧😉。
  • JavaScript
  • Vue
  • React
  • 低代码
  • 线性系统
  • 暂未分类
  • LeetCode
  • 算法
  • 数据结构
  • 设计模式
  • Other
  • PMP
  • Office
  • 面试
  • Bash
  • 流年往事
  • 经验片段
  • 读书杂感
  • 归档
  • 分类
  • 标签
  • 简介
  • 收藏
  • 有趣
  • 文档
  • LeetCode

  • 算法

  • 数据结构

  • 设计模式

    • 浅聊设计理念
    • 谈一谈设计原则
    • 工厂方法模式
    • 抽象工厂模式
    • 建造者模式
    • 原型模式
    • 单例模式
    • 桥接模式
    • 代理模式
    • 装饰器模式
    • 适配器模式
    • 享元模式
    • 组合模式
    • 外观模式
    • 观察者模式
    • 模板方法模式
    • 策略模式
    • 职责链模式
      • 前言
      • 职责链模式
    • 状态模式
    • 迭代器模式
    • 访问者模式
    • 备忘录模式
    • 命令模式
    • 解释器模式
    • 中介者模式
  • Other

  • vue3设计与实现

  • 算法与设计
  • 设计模式
aiyoudiao
2022-02-24

职责链模式

# 前言

职责链模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。

# 职责链模式

使用场景:处理任务需要经过一个一个环节,这个任务可以在某个环节直接完成,也可以经过所有环节再完成,比如常见的 食品加工、项目交付等等。

理解:这是一种类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,很常见。这种设计模式很像是公司里的OA审判流程。这种设计模式也很简单。一般用于作为 过滤器、拦截器来使用,当然也可以作为业务流程处理。我觉得它的意义是 通过这种经典的交互行为,让操作者和处理者解耦了,操作者只需要提供数据,处理者只需要定义功能接口,然后根据数据和相关业务来进行处理即可。这样就能通过面向接口编程,实现一套精准的流程控制了。

namespace action_mode_04 {

    interface IApproval {

        leaveDays: number
        borrowMoney: number
        approval(name: string, leaveDays: number, borrowMoney: number): boolean
    }


    class GroupLeader implements IApproval {

        leaveDays: number = 2
        borrowMoney: number = 1500

        approval(name: string, leaveDays: number, borrowMoney: number): boolean {
            console.log(`
                ${name}:请假${leaveDays}天,借钱${borrowMoney}元。
            `)
            console.log(`审批到达项目组长
            组长最大权限:支持请假${this.leaveDays}天和借钱${this.borrowMoney}元。
            `)
            return this.leaveDays >= leaveDays && this.borrowMoney >= borrowMoney
        }
    }

    class ProjectManager implements IApproval {

        leaveDays: number = 7
        borrowMoney: number = 5000

        approval(name: string, leaveDays: number, borrowMoney: number): boolean {
            console.log(`
                ${name}:请假${leaveDays}天,借钱${borrowMoney}元。
            `)
            console.log(`审批到达项目经理
            PM最大权限:支持请假${this.leaveDays}天或借钱${this.borrowMoney}元。
            `)

            // 请假 和 借钱 只能二选一
            if (leaveDays > 1 && borrowMoney > 1) {
                return false
            }

            return this.leaveDays >= leaveDays && this.borrowMoney >= borrowMoney
        }
    }

    class CEO implements IApproval {

        leaveDays: number = 30
        borrowMoney: number = 25000

        approval(name: string, leaveDays: number, borrowMoney: number): boolean {
            console.log(`
                ${name}:请假${leaveDays}天,借钱${borrowMoney}元。
            `)
            console.log(`审批到达首席执行董事长
            CEO最大权限:支持请假${this.leaveDays}天和借钱${this.borrowMoney}元。
            `)

            return this.leaveDays >= leaveDays && this.borrowMoney >= borrowMoney
        }

    }

    class Chain {

        currentTask: IApproval
        nextTaskChain?: Chain | null

        constructor(task: IApproval) {
            this.currentTask = task
            this.nextTaskChain = null
        }


        setNext(nextTask: IApproval): Chain {
            this.nextTaskChain = new Chain(nextTask)
            return this.nextTaskChain
        }

        approvalHandler(name: string, leaveDays: number, borrowMoney: number): void {
            let result = this.currentTask.approval(name, leaveDays, borrowMoney)
            if (result) {
                console.log(' ################# 操作成功!!!!! ################# ')
                return
            }

            if (this.nextTaskChain) {
                console.log(' ================= 权限不足,开启下一个审批流程 ================= ')
                this.nextTaskChain.approvalHandler(name, leaveDays, borrowMoney)
            } else {
                console.log(' ################# 操作失败!!!!! ################# ')
            }
        }
    }

    const groupLeaderChainNode = new Chain(new GroupLeader())
    groupLeaderChainNode.setNext(new ProjectManager()).setNext(new CEO())

    groupLeaderChainNode.approvalHandler('员工小梦', 1, 200)

    groupLeaderChainNode.approvalHandler('员工小李', 10, 200)

    groupLeaderChainNode.approvalHandler('员工老李', 25, 50000)
}

#设计模式
上次更新时间: 10年18月2023日 01时57分53秒
策略模式
状态模式

← 策略模式 状态模式 →

最近更新
01
01.数据结构导论一览.md
10-16
02
30.2023年06月04日.md
06-04
03
08.与测量相关.md
05-06
更多文章>
Theme by Vdoing | Copyright © 2017-2023 aiyoudiao 码二 备案号: 鄂ICP备2022002654号-1