我学会了,职责链模式

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

前言

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

职责链模式

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

理解:这是一种类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,很常见。这种设计模式很像是公司里的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)
}
AI 代码解读
相关文章
Paper Digest | 突破个性化推荐数据稀疏性:长尾增强的图对比学习算法研究
本文提出了一种新的长尾增强的图对比学习方法(LAGCL),该方法促使模型同时兼顾头部节点与尾部节点之间的知识,并通过长尾增强技术来使模型产出更均匀更准确的节点表征,从而改进基于 GNN 的推荐任务。
全新开源通义千问Qwen3,它来了!
Qwen3是通义千问系列的最新模型,融合推理与非推理模式,兼具QwQ和Instruct模型能力。提供多种尺寸,包括235B-A22B、30B-A3B及六个Dense模型,大幅提升数学、代码、逻辑推理和对话能力,达到业界领先水平。旗舰模型Qwen3-235B-A22B在多场景测试中表现优异,小型模型如Qwen3-4B性能媲美大模型。用户可在阿里云百炼平台免费体验各100万Token。
全新开源通义千问Qwen3,它来了!
|
8月前
|
044[词根溯源]declaration_变量含义_meaning_声明
本文回顾了上期制作ASCII码表的内容,并深入探讨了变量的概念及其在不同场景下的应用,如火车票预订、教务系统及游戏开发中变量的变化与使用。文章还介绍了Python中变量的声明与赋值方法,以及“声明”一词的词源解析,强调了声明变量的重要性,为后续学习如何使用变量做了铺垫。
156 6
linux shell脚本判断文件或文件夹是否存在循环操作
linux shell脚本判断文件或文件夹是否存在循环操作
320 0
【SQL刷题】Day3----SQL必会的常用函数专项练习
【SQL刷题】Day3----SQL必会的常用函数专项练习
268 0
【SQL刷题】Day3----SQL必会的常用函数专项练习
从前后端的角度分析options预检请求——打破前后端联调的理解障碍
options预检请求是干嘛的?options请求一定会在post请求之前发送吗?前端或者后端开发需要手动干预这个预检请求吗?不用文档定义堆砌名词,从前后端角度单独分析,大白话带你了解!
569 0
从前后端的角度分析options预检请求——打破前后端联调的理解障碍
PaaS市场规模 2022年PaaS行业前景及趋势分析报告
PaaS行业市场前景及现状如何?在PaaS服务逐渐成熟的同时,一些开构建在的IaaS层之上的PaaS服务也开始出现,成为IaaS的增值服务,使得两者的界限逐步开始模糊。此外,一些可以构建在多种IaaS服务上的“开放PaaS”平台的出现,更进一步方便了IaaS服务商提供附加的PaaS服务
1331 0
PaaS市场规模 2022年PaaS行业前景及趋势分析报告
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问