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

二十三种设计模式(二十三)--责任链模式

责任链模式(Chain of Responsibility)

责任链模式处理同样的任务但是分多个等级去做不同的应对的问题
只要出现多个对象处理的是同一个请求, 并且这多个对象是有顺序有条件的去应对请求的, 就要使用责任链模式.

假设我们有一支军队, 我军按照不同的规模编排队伍中人数的大小, 分别是军, 师, 旅, 团四种规模
四种规模的军队分别抵抗和我军人数相当的敌军规模

为了满足这个需求, 代码实现如下:

abstractclassMilUnit{intenemyForces;MilUnitnextUnit;// 用来指向责任链的下一环abstractvoidattack(intenemyForces);// 责任链的下一环由业务逻辑决定voidsetNext(MilUnitunit){this.nextUnit=unit;}}classJunUnitextendsMilUnit{@Overridepublicvoidattack(intenemyForces){System.out.println("[进攻] 211集团军战士冲上前线, 军长彭大帅");}}classShiUnitextendsMilUnit{@Overridepublicvoidattack(intenemyForces){if(enemyForces>=10000&&enemyForces<=20000){System.out.println("[进攻] 34师战士冲上前线, 师长李云龙");}else{System.out.println("[撤退] 请求军长支援");nextUnit.attack(enemyForces);}}}classLvUnitextendsMilUnit{@Overridepublicvoidattack(intenemyForces){if(enemyForces>=3000&&enemyForces<10000){System.out.println("[进攻] 17旅战士冲上前线, 旅长黄小琥");}else{System.out.println("[撤退] 请求师长支援");nextUnit.attack(enemyForces);}}}classTuanUnitextendsMilUnit{@Overridepublicvoidattack(intenemyForces){if(enemyForces<3000){System.out.println("[进攻] 3团战士冲上前线, 团长王小二");}else{System.out.println("[撤退] 请求旅长支援");nextUnit.attack(enemyForces);}}}

如上代码就是一个简单的责任链模式实现, 输入量为敌军人数,
我军通过敌军人数去判断不同的作战单位去迎战
现实中有很多类似的需求, 比如办公请假审批制度, 请假人数在个位数时, 人事直接处理, 在10-20人时, 小组长负责审批, 请假人数在20-50人时, 项目经理负责审批, 大于50人时, 老板负责审批

总结特点就是, 每个人所做的操作都是一样的, 就是审批, 上述代码中的案例, 相同的动作则是进攻
然后责任链模式中, 在进攻方法中, 要判断当前敌人的数量, 超出本单位所能承受的范围时, 就将任务交给下一级别的单位去执行

调用逻辑如下:

publicclassResponsibility{publicstaticvoidmain(String[]args){MilUnitjun=newJunUnit();MilUnitshi=newShiUnit();MilUnitlv=newLvUnit();MilUnittuan=newTuanUnit();// 这里设置责任链的起点为团, 终点为军, 逐级迎战tuan.setNext(lv);lv.setNext(shi);shi.setNext(jun);System.out.println("===== 第一波敌军规模200人");tuan.attack(200);System.out.println("===== 第二波敌军规模4000人");tuan.attack(4000);System.out.println("===== 第三波敌军规模15000人");tuan.attack(15000);System.out.println("===== 第五波敌军规模50000人");tuan.attack(50000);}}

输出:

===== 第一波敌军规模200人 [进攻] 3团战士冲上前线, 团长王小二 ===== 第二波敌军规模4000人 [撤退] 请求旅长支援 [进攻] 17旅战士冲上前线, 旅长黄小琥 ===== 第三波敌军规模15000人 [撤退] 请求旅长支援 [撤退] 请求师长支援 [进攻] 34师战士冲上前线, 师长李云龙 ===== 第五波敌军规模50000人 [撤退] 请求旅长支援 [撤退] 请求师长支援 [撤退] 请求军长支援 [进攻] 211集团军战士冲上前线, 军长彭大帅

调用时先实例化执行动作的各个单元, 它们之间默认没有相互联系
然后通过setNext方法将它们的先后顺序串联起来
实际处理业务时, 都是从通过责任链的开头去应对所有数量的敌人

这里有个缺陷就是责任链的每一环都是暴露在外的, 如果调用者没有直接从责任链开头TuanUnit开始调用, 而是直接调用JunUnit去处理所有问题, 那么这个责任链模式将失效, 所以实际业务中, 要将这部分封装起来, 只暴露责任链开头.

http://www.jsqmd.com/news/217600/

相关文章:

  • 基于Java+SpringBoot+SSM云与糖蛋糕购物平台系统(源码+LW+调试文档+讲解等)/云与糖蛋糕平台/云与糖蛋糕系统/云与糖购物平台/云与糖购物系统/蛋糕购物平台系统/云与糖蛋糕商城
  • 从底层逻辑到工程实践,深入理解C语言在计算机世界中的核心地位与持久价值
  • C语言的性能优化实践全解析:从编译器自动优化机制到程序员手动调优思维与工程经验总结
  • 大数据时代时序数据库选型指南:为何Apache IoTDB成为物联网场景首
  • win10下安装mysql最简方案
  • 月薪35-50k*16薪,中国又一行业新兴岗位在崛起!这将是程序员未来5年最好的就业方向!
  • 二十一、pinctrl子系统
  • 【人工智能学习-AI-MIT公开课第 17.-学习:boosting 算法】
  • 解析HTML表格嵌套问题
  • 基于Java+SpringBoot+SSM博客系统(源码+LW+调试文档+讲解等)/博客平台/博客软件/个人博客系统/博客网站系统/博客管理系统
  • Java Web 社区医院信息平台系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • 【日语学习-日语知识点小记-日本語体系構造-JLPT-N2前期阶段-第一阶段(1):再次起航】
  • SpringBoot+Vue 师生健康信息管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 实验一 安全威胁与攻击实验
  • 智慧停车解决方案
  • 【JavaSE】多线程之安全使用容器
  • Thinkphp的基于微服务教材征订系统(编号:
  • 基于SpringBoot+Vue的IT交流和分享平台管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 【JavaSE】文件基础与File类
  • SpringBoot+Vue “衣依”服装销售平台平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • Thinkphp的农贸市场摊位 夜市摊位租赁系统设计与实现
  • Claude Code 永动机:ralph-loop 无限循环迭代插件详解(安装 / 原理 / 最佳实践 / 避坑)
  • Java SpringBoot+Vue3+MyBatis 学科竞赛管理系统源码|前后端分离+MySQL数据库
  • Thinkphp的吉他谱分享平台的设计与实现
  • Java SpringBoot+Vue3+MyBatis 墙绘产品展示交易平台系统源码|前后端分离+MySQL数据库
  • Thinkphp的基于协同过滤算法的动漫推荐系统
  • 前后端分离IT交流和分享平台系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • SpringBoot + Aviator + 规则中心:轻量级表达式引擎实现营销优惠动态计算
  • Thinkphp的基于协同过滤算法的音乐推荐系统
  • 前后端分离ONLY在线商城系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程