当前位置: 首页 > news >正文

职责链模式——采购审批

目录

  • OA系统采购审批需求
  • 传统方案解决OA系统审批问题分析
  • 职责链模式基本介绍
  • 职责链模式的原理类图
  • 职责链模式解决OA系统采购审批
  • 代码

OA系统采购审批需求

学校OA系统的采购审批项目:需求是
1 采购员采购教学器材
2 如果金额小于等于5k,由教学主任审批
3 如果金额小于等于10k,由院长审批
4 如果金额小于等于30k,由副校长审批
5 如果金额超过30k,由校长审批

请设计程序完成采购审批项目

传统方案解决OA系统审批问题分析

1 传统方式是:接收到一个采购请求后,根据采购金额来调用对应的Approver(审批人)完成审批

2 传统方式的问题分析:客户端这里会使用到分支判断(比如switch)来对不同的采购请求处理,这样就存在如下问题,如果各个级别的人员审批金额发生变化,在客户端的也需要变化;客户端必须明确的知道有多少个审批级别和访问

3 这样对一个采购请求进行处理和Approver(审批人)就存在强耦合关系,不利于代码的扩展和维护

4 解决方案 =》 职责链模式

职责链模式基本介绍

1 职责链模式(Chain of Responsibility Pattern),又叫责任链模式,为请求创建了一个接收者对象的链,这种模式对请求的发送者和接收者进行解耦

2 职责链模式通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推

3 这种类型的设计模式属于行为型模式

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

职责链模式的原理类图

1 Handler:抽象的处理者,定义了一个处理请求的接口,同时含有另外Handler
2 ConcreteHandlerA,B是具体的处理者,处理它自己负责的请求,可以访问它的后继者(即下一个处理者),如果可以处理当前请求,则处理,否则就将该请求交给后继者去处理,从而形成一个职责链

3 Request,含有很多属性,表示一个请求

职责链模式解决OA系统采购审批

代码

PurchaseRequest

package com.tsg.responsibilitychain;publicclassPurchaseRequest{// 请求类型private int type;private float price;private int id;publicPurchaseRequest(int type,float price,int id){this.type=type;this.price=price;this.id=id;}public intgetType(){returntype;}publicvoidsetType(int type){this.type=type;}public floatgetPrice(){returnprice;}publicvoidsetPrice(float price){this.price=price;}public intgetId(){returnid;}publicvoidsetId(int id){this.id=id;}}

Approver

package com.tsg.responsibilitychain;publicabstractclassApprover{Approverapprover;Stringname;publicApprover(Stringname){this.name=name;}publicvoidsetApprover(Approverapprover){this.approver=approver;}// 处理审批请求的方法,得到一个请求,处理是子类完成publicabstractvoidprocessRequest(PurchaseRequestpurchaseRequest);}

DepartmentApprover

package com.tsg.responsibilitychain;publicclassDepartmentApproverextendsApprover{publicDepartmentApprover(Stringname){super(name);}publicvoidprocessRequest(PurchaseRequestpurchaseRequest){if(purchaseRequest.getPrice()<=5000){System.out.println(" 请求编号id = "+purchaseRequest.getId()+" 被 "+this.name+" 处理 ");}else{approver.processRequest(purchaseRequest);}}}

CollegeApprover

package com.tsg.responsibilitychain;publicclassCollegeApproverextendsApprover{publicCollegeApprover(Stringname){super(name);}publicvoidprocessRequest(PurchaseRequestpurchaseRequest){if(purchaseRequest.getPrice()>5000&&purchaseRequest.getPrice()<=10000){System.out.println(" 请求编号id = "+purchaseRequest.getId()+" 被 "+this.name+" 处理 ");}else{approver.processRequest(purchaseRequest);}}}

ViceSchoolMasterApprover

package com.tsg.responsibilitychain;publicclassViceSchoolMasterApproverextendsApprover{publicViceSchoolMasterApprover(Stringname){super(name);}publicvoidprocessRequest(PurchaseRequestpurchaseRequest){if(purchaseRequest.getPrice()>10000&&purchaseRequest.getPrice()<=30000){System.out.println(" 请求编号id = "+purchaseRequest.getId()+" 被 "+this.name+" 处理 ");}else{approver.processRequest(purchaseRequest);}}}

SchoolMasterApprover

package com.tsg.responsibilitychain;publicclassSchoolMasterApproverextendsApprover{publicSchoolMasterApprover(Stringname){super(name);}publicvoidprocessRequest(PurchaseRequestpurchaseRequest){if(purchaseRequest.getPrice()>30000){System.out.println(" 请求编号id = "+purchaseRequest.getId()+" 被 "+this.name+" 处理 ");}else{approver.processRequest(purchaseRequest);}}}

Client

package com.tsg.responsibilitychain;publicclassClient{publicstaticvoidmain(String[]args){// 创建一个请求PurchaseRequestpurchaseRequest=newPurchaseRequest(1,31000,1);// 创建相关的审批人DepartmentApproverzzr=newDepartmentApprover("张主任");CollegeApproverlyz=newCollegeApprover("李院长");ViceSchoolMasterApproverwfxz=newViceSchoolMasterApprover("王副校长");SchoolMasterApproverdxz=newSchoolMasterApprover("丁校长");zzr.setApprover(lyz);lyz.setApprover(wfxz);wfxz.setApprover(dxz);dxz.setApprover(zzr);wfxz.processRequest(purchaseRequest);}}
http://www.jsqmd.com/news/489791/

相关文章:

  • 《OpenClaw 从入门到精通指南》正式发布,开源免费!
  • 2026年上海徐汇区婚姻介绍公司排名,资深婚介哪家性价比高 - 工业设备
  • 2026众多博主都在推荐好用的支持字幕配音的软件
  • 2026年安庆装修指南:如何挑选高评价的装修服务团队 - 2026年企业推荐榜
  • PD-L1抗体与PD-1抗体有何差异?
  • 仁王3的宏 和 浪人崛起 战神3模拟器设置 the dark rites of akham
  • 别再瞎找了!10个降AIGC平台全行业通用测评与推荐
  • 2026年徐州南通班中学竞争力分析:五大名校深度测评与选校指南 - 2026年企业推荐榜
  • A实验:生物 生理药理实验多用仪实验组成资料!
  • 【高精度气象】“气候贷”的信用革命:当企业的灾害防御能力开始决定贷款利率
  • 我决定从Ubuntu 22.04 LTS彻底切换到Garuda Linux了,小众也能完美
  • 005-基础入门-APP小呈现源码项目开发IDEA逆向资源
  • 网站抓包解析,掌握浏览器请求和 HTTPS 数据分析的流程
  • 2026年热泵低温粮食干燥塔厂商盘点:龙谷源等五家谁更胜一筹? - 2026年企业推荐榜
  • 配置servlet
  • 晶振作用 → 频率怎么来 → PLL 倍频 → 分频 → MCU 主频
  • 在AspNetCore中理解依赖注入生命周期冲突与解决方案
  • 1.5 吨燃气蒸汽发生器 全自动运行 省气省心
  • 智能传感器:从概念解析到设计实践与未来展望
  • Day.js基本使用
  • 探索 COMSOL 顺层钻孔瓦斯抽采:双孔隙介质数值模拟模型
  • 绝大多数Wi-Fi 7路由器,根本无法实现真正的同时合并频段
  • 〘 8-1 〙软考高项 | 第15章:项目风险管理(上)
  • Js: 标识符、关键字、保留字和运算符
  • 华南产业集群赋能:2026广州汽车电子展,技术迭代与全球机遇共振?
  • 三大 AI 芯片架构
  • 微信 AI 小程序成长计划来了,我们怎么把混元接进了产品里
  • 网络共享-“引用的账户当前已锁定。且可能无法登陆”问题解决
  • 登录微信可以但无法访问浏览器
  • 样本冰箱之所以能实现自动报备温湿度数据是因为温湿度监控设备吗?