责任链模式详解:概念、实现与应用场景
创作时间:
作者:
@小白创作中心
责任链模式详解:概念、实现与应用场景
引用
CSDN
1.
https://blog.csdn.net/wind_chasing_boy/article/details/137025834
责任链模式是一种常用的行为型设计模式,它允许将多个处理对象串联成一条链,每个对象都有机会处理请求。如果当前对象无法处理请求,则将其传递给链中的下一个对象。这种模式在许多场景中都有应用,如多级审批流程、事件处理等。本文将通过一个在线订购系统的案例,详细讲解责任链模式的概念、实现原理及其优缺点。
问题描述
假设你正在开发一个在线订购系统,需要对系统访问进行限制:
- 只允许认证用户创建订单
- 拥有管理权限的用户可以访问所有订单
简单规划后,你会意识到这些检查必须依次进行:
- 首先尝试对用户进行认证
- 如果认证失败,则无需进行后续检查
随着时间的推移,系统面临了新的挑战:
- 需要防范暴力密码破解攻击
- 需要清理请求中的数据以确保安全
- 需要实现缓存机制以提高响应速度
随着代码的迭代,系统变得越来越复杂,维护成本激增。因此,决定对整个系统进行重构。
解决方案
在重构后的系统中,每个处理器在处理完请求后,会决定是否将请求传递给下一个处理器。只有当请求包含正确的数据时,所有处理器才会执行自己的主要行为,包括身份验证和数据缓存等。
结构
责任链模式主要包含以下两个角色:
- 抽象处理器(Handler):定义处理请求的接口,并持有下一个处理器的引用。
- 具体处理器(Concrete Handler):实现处理请求的具体逻辑,并决定是否将请求传递给下一个处理器。
示例代码
下面是一个简单的责任链模式示例:
在这个示例中:
Handler
是抽象处理器ConcreteHandler1
和ConcreteHandler2
是具体处理器
客户端将请求发送给第一个处理器,处理器链中的每个处理器根据自己的逻辑来决定是否处理请求或将请求传递给下一个处理器。
// 抽象处理器
abstract class Handler {
protected Handler nextHandler; // 下一个处理器
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract void handleRequest(int request); // 处理请求的抽象方法
}
// 具体处理器1
class ConcreteHandler1 extends Handler {
public void handleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println("ConcreteHandler1 handles request: " + request);
} else if (nextHandler != null) {
nextHandler.handleRequest(request); // 将请求传递给下一个处理器
}
}
}
// 具体处理器2
class ConcreteHandler2 extends Handler {
public void handleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println("ConcreteHandler2 handles request: " + request);
} else if (nextHandler != null) {
nextHandler.handleRequest(request); // 将请求传递给下一个处理器
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
// 构建处理器链
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
handler1.setNextHandler(handler2);
// 发送请求
handler1.handleRequest(5);
handler1.handleRequest(15);
handler1.handleRequest(25);
}
}
优点
- 解耦性增强:请求发送者和接收者之间的解耦,请求发送者不需要知道具体的处理者,处理者也不需要知道请求的发送者。
- 灵活性提高:可以动态地调整链中处理器的顺序,灵活地改变请求的处理流程。
- 可扩展性增加:可以很容易地增加新的处理器来处理新的请求类型。
缺点
- 性能问题:处理请求时可能需要遍历整个链,可能会影响性能。
- 请求未被处理:如果没有处理器能够处理请求,则请求会被丢弃,可能会造成请求未被处理的情况。
应用场景
- 多级审批流程:如请假审批、报销审批等流程。
- 事件处理:如GUI事件处理、日志处理等。
热门推荐
银发简历,藏着多少金矿?揭秘老年再就业的「含金量法则」
优化 Visual Studio 启动时间
修仙世界里的万般人生:八部热门修仙小说推荐
梦境的奥秘:医生教你如何分析那些奇怪的梦,发现它们的意义!
如何分析市场指数并制定投资策略?这些策略在不同市场环境下的表现如何?
下眼睑肿疼是什么原因怎么治疗呢
AI模型训练前的数据预处理:全面指南
痛风急性发作的“自救”攻略
智能食堂的自选称重模式减少食物浪费并提高管理效率
玉屏风虽好,但是可别乱吃啊!
决战尼罗河:水电一局乌干达伊辛巴水电站胜利实现二期截流
脱欧后从英国移居欧洲 (反之亦然)
商业航天十年观察:现实矛盾之二:制度惯性与制度重构(续)
抗日战争中,战力最强悍的五个省,至今都让西方刮目相看
“颖”字大揭秘:从读音到文化象征的深度解读
体内有癌,痣先知?长在这几个部位,可能是癌变信号
英语四级听力如何训练:从基础到实战的全面指南
手脚发黄是什么原因引起的女人
一楼怎么防鼠
虱子的预防与治疗
跖痛症的症状表现及预防措施
石门穴位位置图及功效详解
小儿iga肾病的表现
面临多个职业机会,如何通过规划抉择
超详细的降糖药汇总,看这篇就够了!
葱油饼秘制教程,如何在家做出街边美味级别的葱油饼?
探究我国人口供给量的变化及影响因素
咖啡和香蕉能一起吃吗
为什么消防管道大都选择沟槽式连接?
如何防止WordPress站点的文件路径暴露