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

设计模式最佳实践 - 模板模式 + 责任链模式

        废话不多说,直接切入正题,本篇要讲的是 模板模式 + 责任链模式 实践。

        该最佳实践本身就是一种对 责任链模式的增强,模板模式通过 父类 强耦合,预定义好 责任链 next 方法 的前后一些切面行为,优雅简洁。

        先上示例,单独责任链模式 简单示例如下:

// 请假请求类
class LeaveRequest {private String employeeName;private int days;public LeaveRequest(String employeeName, int days) {this.employeeName = employeeName;this.days = days;}public String getEmployeeName() {return employeeName;}public int getDays() {return days;}
}// 抽象处理者
abstract class Approver {protected Approver nextApprover;public Approver(Approver nextApprover) {this.nextApprover = nextApprover;}public abstract void approve(LeaveRequest request);
}// 具体处理者:组长,处理1-3天的请假
class TeamLeader extends Approver {public TeamLeader(Approver nextApprover) {super(nextApprover);}@Overridepublic void approve(LeaveRequest request) {if (request.getDays() <= 3) {System.out.println("组长批准了" + request.getEmployeeName() + "的" + request.getDays() + "天假期");} else if (nextApprover != null) {nextApprover.approve(request);}}
}// 具体处理者:部门经理,处理4-7天的请假
class DepartmentManager extends Approver {public DepartmentManager(Approver nextApprover) {super(nextApprover);}@Overridepublic void approve(LeaveRequest request) {if (request.getDays() > 3 && request.getDays() <= 7) {System.out.println("部门经理批准了" + request.getEmployeeName() + "的" + request.getDays() + "天假期");} else if (nextApprover != null) {nextApprover.approve(request);}}
}// 具体处理者:总经理,处理8天及以上的请假
class GeneralManager extends Approver {public GeneralManager(Approver nextApprover) {super(nextApprover);}@Overridepublic void approve(LeaveRequest request) {if (request.getDays() > 7) {System.out.println("总经理批准了" + request.getEmployeeName() + "的" + request.getDays() + "天假期");} else if (nextApprover != null) {nextApprover.approve(request);}}
}// 演示类
public class LeaveApprovalDemo {public static void main(String[] args) {// 构建责任链Approver generalManager = new GeneralManager(null);Approver departmentManager = new DepartmentManager(generalManager);Approver teamLeader = new TeamLeader(departmentManager);// 创建请假请求LeaveRequest request1 = new LeaveRequest("张三", 2);LeaveRequest request2 = new LeaveRequest("李四", 5);LeaveRequest request3 = new LeaveRequest("王五", 10);// 处理请求teamLeader.approve(request1);teamLeader.approve(request2);teamLeader.approve(request3);}
}

当需求增加,每个子类责任链都需要有额外的功能,比如 处理请假请求前,需要 看一下手表,就可以在父类抽取 出方法,子类只需要实现核心逻辑,前后切面逻辑父类通过模板模式预定义,不仅耦合性低,重用性也极高,如需要更改父类前后逻辑,直接进行重写即可,加上模板模式后,示例如下:

// 请假请求类
class LeaveRequest {private String employeeName;private int days;private String reason;public LeaveRequest(String employeeName, int days, String reason) {this.employeeName = employeeName;this.days = days;this.reason = reason;}public String getEmployeeName() {return employeeName;}public int getDays() {return days;}public String getReason() {return reason;}
}// 抽象处理者 - 结合了模板模式
abstract class Approver {protected Approver nextApprover;protected String approverTitle; // 审批者头衔public Approver(String approverTitle, Approver nextApprover) {this.approverTitle = approverTitle;this.nextApprover = nextApprover;}// 模板方法:定义审批流程的骨架public final void processRequest(LeaveRequest request) {// 1. 前置处理beforeApproval(request);// 2. 核心审批逻辑(由子类实现)boolean handled = handleApproval(request);// 3. 后置处理afterApproval(request, handled);// 4. 如果当前处理者不能处理,传递给下一个if (!handled && nextApprover != null) {nextApprover.processRequest(request);}}// 前置处理 - 模板中的固定步骤protected void beforeApproval(LeaveRequest request) {System.out.println("\n===== 开始处理 " + request.getEmployeeName() + " 的请假申请 =====");System.out.println("请假天数: " + request.getDays() + "天");System.out.println("请假原因: " + request.getReason());System.out.println("当前审批者: " + approverTitle);}// 后置处理 - 模板中的固定步骤protected void afterApproval(LeaveRequest request, boolean handled) {if (handled) {System.out.println(approverTitle + "已批准该请假申请");System.out.println("===== " + request.getEmployeeName() + " 的请假申请处理完毕 =====");} else {System.out.println(approverTitle + "无法处理,将提交给上一级审批");}}// 抽象方法:具体审批逻辑由子类实现protected abstract boolean handleApproval(LeaveRequest request);
}// 具体处理者:组长,处理1-3天的请假
class TeamLeader extends Approver {public TeamLeader(Approver nextApprover) {super("组长", nextApprover);}@Overrideprotected boolean handleApproval(LeaveRequest request) {if (request.getDays() <= 3) {// 组长特有的审批逻辑System.out.println("组长审批:请假天数在权限范围内,直接批准");return true;}return false;}
}// 具体处理者:部门经理,处理4-7天的请假
class DepartmentManager extends Approver {public DepartmentManager(Approver nextApprover) {super("部门经理", nextApprover);}@Overrideprotected boolean handleApproval(LeaveRequest request) {if (request.getDays() > 3 && request.getDays() <= 7) {// 部门经理特有的审批逻辑System.out.println("部门经理审批:已核实工作安排,可批准请假");return true;}return false;}
}// 具体处理者:总经理,处理8天及以上的请假
class GeneralManager extends Approver {public GeneralManager(Approver nextApprover) {super("总经理", nextApprover);}@Overrideprotected boolean handleApproval(LeaveRequest request) {if (request.getDays() > 7) {// 总经理特有的审批逻辑System.out.println("总经理审批:已评估项目进度,批准长假申请");return true;}return false;}
}// 演示类
public class EnhancedLeaveApprovalDemo {public static void main(String[] args) {// 构建责任链Approver generalManager = new GeneralManager(null);Approver departmentManager = new DepartmentManager(generalManager);Approver teamLeader = new TeamLeader(departmentManager);// 创建请假请求LeaveRequest request1 = new LeaveRequest("张三", 2, "个人身体不适");LeaveRequest request2 = new LeaveRequest("李四", 5, "家中有事需要处理");LeaveRequest request3 = new LeaveRequest("王五", 10, "计划休年假旅游");// 处理请求teamLeader.processRequest(request1);teamLeader.processRequest(request2);teamLeader.processRequest(request3);}
}



文章转载自:

http://JMceQI9t.mjdbd.cn
http://8oSWx0gU.mjdbd.cn
http://hiTyXrdN.mjdbd.cn
http://8WCrGMPT.mjdbd.cn
http://ZTJPmxAR.mjdbd.cn
http://oNFD8wEU.mjdbd.cn
http://SxptLdnK.mjdbd.cn
http://1aNb0QYn.mjdbd.cn
http://gW23vhpK.mjdbd.cn
http://V3Y8XHLC.mjdbd.cn
http://25fcLudT.mjdbd.cn
http://SqRwW3MY.mjdbd.cn
http://ZGVUiDEl.mjdbd.cn
http://pUE0ssO8.mjdbd.cn
http://ZRgdyCmP.mjdbd.cn
http://XODqNw1r.mjdbd.cn
http://wt59s9an.mjdbd.cn
http://7V6BqlPm.mjdbd.cn
http://Vpf64JNY.mjdbd.cn
http://EreaxT9L.mjdbd.cn
http://VWrqaV7x.mjdbd.cn
http://epWtpDEB.mjdbd.cn
http://ObDLHoft.mjdbd.cn
http://N8Ytlc1R.mjdbd.cn
http://iXBKx4dz.mjdbd.cn
http://w0Ym6QOv.mjdbd.cn
http://dgptsYyT.mjdbd.cn
http://tDTC7lzS.mjdbd.cn
http://xlfNKMOX.mjdbd.cn
http://NcslHya2.mjdbd.cn
http://www.dtcms.com/a/367337.html

相关文章:

  • C++的const_cast
  • SSD固态硬盘加速优化-明显提高固态硬盘的效率并保持峰值性能-供大家学习研究参考
  • STM32 - Embedded IDE - GCC - 如何将编译得到的.bin固件添加CRC32校验码
  • VSCode中的扩展Extension说明
  • 《IC验证必看|semaphore与mailbox的核心区别》
  • Web与Nginx
  • JS 可迭代对象详解:从概念到实践的全方位剖析
  • 同城酒水推广算法怎么做?
  • (自用)PowerShell常用命令自查文档
  • 当公司在你电脑上安装了IP-guard,你必须知道的事
  • 【已更新文章+代码】2025数学建模国赛B题思路代码文章高教社杯全国大学生数学建模-碳化硅外延层厚度的确定
  • 空车不空,英魂长在(记9.3大阅兵)
  • MySQL并发问题解析
  • linux——自定义协议
  • 基于联邦学习的政务大数据平台应用研究
  • Jenkins调用ansible部署lnmp平台
  • 迈威通信从送快递角度教你分清网络二层和三层
  • 热计量表通过M-Bus接口实现无线集抄系统的几种解决方
  • 从KV Cache竞争到多卡优化:vLLM加载AWQ模型的显存优化全攻略
  • 8.7 通过时间反向传播
  • 基于扣子平台构造AutoGen框架的多智能体使用-----封装成FastAPI接口供调用
  • 谈谈你对ThreadLocal的理解
  • YOLOv11全方位改进指南:从Backbone到检测头的深度优化
  • PLC编程入门精通全套教程(附视频资料)
  • Spring启示录
  • Fiddler辅助标签+工具面板(柠檬班公开课2-2)
  • 云手机运行是否消耗自身流量?
  • Grafana - 监控磁盘使用率Variables使用
  • Elixir通过Onvif协议控制IP摄像机,扩展ExOnvif的摄像头连续移动功能 ContinuousMove
  • P13929 [蓝桥杯 2022 省 Java B] 山 题解