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

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

        该最佳实践本身就是一种对 责任链模式的增强,模板模式通过 父类 强耦合,预定义好 责任链 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://www.pswp.cn/pingmian/95748.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python快速入门专业版(十一):布尔值与None:Python中的“真假”与“空值”(附逻辑判断案例)

目录引言&#xff1a;为什么“真假”与“空值”是编程的核心逻辑1.布尔值&#xff08;bool&#xff09;&#xff1a;Python中的“真”与“假”1.1 布尔值的基础特性1.2 布尔运算&#xff1a;and、or、not的逻辑规则代码示例&#xff1a;基础布尔运算进阶特性&#xff1a;短路求…

C++学习知识小结

1. 什么是类&#xff1f;什么是对象&#xff1f;两者之间什么关系&#xff1f; 类是一类事物的共同特征的抽象描述&#xff0c;它定义这类所有的属性和方法 可以理解为模版类本身不占用空间&#xff0c;它只是一种定义&#xff0c;描述了对象一个是什么样子、能做什么 对象是根…

9. Mono项目与Unity的关系

1.Mono项目简介 2.Mono项目与Unity是如何结合的 3.从Mono到IL2CPP演变过程1.Mono项目简介 1).定义Mono是一个自由、开源的项目, 由Xamarin现属于微软主导开发; 它的目标是创建一个一套兼容于微软.NET Framework 的跨平台工具2).核心功能a.C#编译器能将你写的C#代码编译成IL(中间…

谷歌Genie 3:让你的照片变成可以玩的游戏世界

你是否曾凝视着一张完美的旅行照片&#xff0c;想象着如果能走进那个画面&#xff0c;自由探索会是怎样一种体验&#xff1f;或者&#xff0c;你是否曾被一幅画的奇幻氛围所吸引&#xff0c;渴望能在那片色彩斑斓的世界里奔跑跳跃&#xff1f;过去&#xff0c;这只是白日梦。而…

Cursor 提示词探索——如何打造真正懂自己的Agent

最近看到鱼皮的Cursor提示词分享&#xff08;微信公众平台)&#xff0c;刚好之前也在做Agent开发&#xff0c;跟提示词打交道的多&#xff0c;也经常发现 ai 蠢蠢的&#xff0c;一点不会根据提示词设计的来&#xff0c;按鱼皮的分享研究了一下&#xff0c;写了这篇博客。 Curs…

C++ 内存模型:用生活中的例子理解并发编程

C 内存模型&#xff1a;用生活中的例子理解并发编程 文章目录C 内存模型&#xff1a;用生活中的例子理解并发编程引言&#xff1a;为什么需要内存模型&#xff1f;核心概念&#xff1a;改动序列原子类型&#xff1a;不可分割的操作内存次序&#xff1a;不同的同步级别1. 宽松次…

AI急速搭建网站:Gemini、Bolt或Jules、GitHub、Cloudflare Pages实战全流程!

文章目录AI急速搭建网站&#xff1a;Gemini、Bolt或Jules、GitHub、Cloudflare Pages实战全流程&#xff01;&#x1f680; 极速建站新范式&#xff1a;Gemini、Bolt.new、GitHub & Cloudflare Pages 全流程实战&#xff01;第一步&#xff1a;创意可视化与代码生成 — Goo…

Qwen2.5-VL实现本地GPTQ量化

本文不生产技术,只做技术的搬运工!! 前言 公开的Qwen2.5-VL模型虽然功能非常强大,但有时面对专业垂直领域的问题往往会出现一些莫名其妙的回复,这时候大家一版选择对模型进行微调,而微调后的模型如果直接部署则显存开销过大,这时就需要执行量化,下面将介绍执行本地GPT…

【Redis】常用数据结构之Hash篇:从常用命令到使用场景详解

目录 1.前言 插播一条消息~ 2.正文 2.1Hash与String对比 2.2常用命令 2.2.1HSET 2.2.2HGET 2.2.3HEXISTS 2.2.4HDEL 2.2.5HKEYS 2.2.6HVALS 2.2.7HGETALL 2.2.8HMGET 2.2.9HLEN 2.2.10HSETNX 2.2.11HINCRBY 2.2.12HINCRBYFLOAT 2.3内部编码 2.3.1. ziplist&…

OSPF基础部分知识点

OSPF基础 前言 路由器 根据 路由表 转发数据包&#xff0c;路由表项 可通过手动配置 和动态路由协议 生成。&#xff08;两种生成方式&#xff09;静态路由比动态路由使用更少的带宽&#xff0c;并且不占用CPU资源来计算和分析路由更新。当网络结构比较简单时&#xff0c;只需配…

Flutter 真 3D 游戏引擎来了,flame_3d 了解一下

在刚刚结束的 FlutterNFriends 大会上&#xff0c;Flame 展示了它们关于 3D 游戏的支持&#xff1a;flame_3d &#xff0c;Flame 是一个以组件系统&#xff08;Flame Component System, FCS&#xff09;、游戏循环、碰撞检测和输入处理为核心的 Flutter 游戏框架&#xff0c;而…

无需公网IP,电脑随时与异地飞牛同步互联保持数据一致性

最近小白有这样一个烦恼&#xff1a;随身带着的电脑每天都在更新内容&#xff0c;于是就会有很多很多的存稿。电脑的空间开始变得不够用了。各式各样的图片、视频、文稿等内容&#xff0c;如果要整理到飞牛NAS上&#xff0c;好像很麻烦&#xff0c;而且每次都是需要回到家里才能…

数据库中间件ShardingSphere v5.2.1

数据库中间件ShardingSphere v5.2.1 文章目录数据库中间件ShardingSphere v5.2.1一 概述1 数据库的瓶颈2 优化的手段3 主从复制4 读写分离5 分库分表5.1 背景5.2 垂直分片5.3 水平分片6 ShardingSphere简介二 ShardingSphere-JDBC讲解1 读写分离实现1.1 基于Docker搭建MySQL主从…

[Upscayl图像增强] Electron主进程命令 | 进程间通信IPC

第三章&#xff1a;Electron主进程命令 欢迎回来&#x1f43b;‍❄️ 在第一章&#xff1a;渲染器用户界面&#xff08;前端&#xff09;中&#xff0c;我们探索了您与之交互的按钮和菜单。然后在第二章&#xff1a;AI模型中&#xff0c;我们了解了让您的图像看起来更棒的&qu…

电竞护航小程序成品搭建三角洲行动护航小程序开发俱乐部点单小程序成品游戏派单小程序定制

功能列表&#xff1a;商家入驻 成为管事 平台公告 客服密钥 客服管理 发单模板 快捷发单 自定义发单 打手入驻 订单裁决 即时通讯 &#xff08;接单者员与发单者&#xff09; 打手排行 邀请排行 余额提现技术栈&#xff1a;前端uniapp 后端java

Redis数据库基础

1.关系型数据库和NoSQL数据库数据库主要分为两大类:关系型数据库与NoSQL数据库关系型数据库&#xff0c;是建立在关系模型基础是的数据库&#xff0c;其借助集合代数等数学概念和方法来处理数据库中的数据主流的MySQL&#xff0c;Oracle&#xff0c;MS SQL Server 和DB2都属于这…

【Java实战㉗】Java日志框架实战:Logback与Log4j2的深度探索

目录一、日志框架概述1.1 日志的作用1.2 常见日志框架1.3 日志级别二、Logback 框架实战2.1 Logback 依赖导入2.2 Logback 配置文件2.3 日志输出格式自定义2.4 Logback 进阶配置三、Log4j2 框架实战3.1 Log4j2 依赖导入3.2 Log4j2 配置文件3.3 Log4j2 与 SLF4J 整合3.4 日志框架…

基于WFOA与BP神经网络回归模型的特征选择方法研究(Python实现)

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取 或者私信获取。 1.项目背景 在大数据分析与智能建模领域&#xff0c;高维数据广泛存在于金融预测、环境监测和工业过程控制等场景…

​​AI生成PPT工具推荐,从此以后再也不用担心不会做PPT了​​

对于很多人老说&#xff0c;做ppt实在太麻烦了&#xff0c;快速制作出专业且美观的PPT成为众多人的需求&#xff0c;AI生成PPT工具应运而生&#xff0c;极大地提升了PPT制作的效率。以下为大家推荐多个实用的AI生成PPT工具。 1、AiPPT星级评分&#xff1a;★★★★★ AiPPT是一…

CentOS系统停服,系统迁移Ubuntu LTS

CentOS官方已全面停止维护CentOS Linux项目&#xff0c;公告指出 CentOS 7在2024年6月30日停止技术服务支持&#xff0c;(在此之前 2022年1月1日起CentOS官方已经不再对CentOS 8提供服务支持&#xff09;&#xff0c;详情见CentOS官方公告。 一、系统迁移评估 用户需要开始计…