责任链模式详解:概念、实现与应用场景
创作时间:
作者:
@小白创作中心
责任链模式详解:概念、实现与应用场景
引用
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事件处理、日志处理等。
热门推荐
如何验证DNS服务器配置是否正确?
Excel打印技巧:8个实用配置让表格打印更专业
口腔溃疡完全指南:推荐非处方药及如何选择
太阳能离网发电系统用户指南:从安装到维护全流程解析
电影中的跨文化语境 ——导演李安风格研究
执业医师资格证书含金量
十大必看时尚动漫
维生素B2吃多了会怎样
甘油三酯目前5.83,如何饮食能降下来?需要多长时间?
阴阳两虚的日常饮食调理指南
如何评估一个城市的建设水平?这个城市的规划和发展前景如何?
英语六级阅读快速提分技巧
如何提升个人技能以适应AI时代的变化?
大陆第六代隐形战斗机:无垂尾设计与向量发动机的创新结合
骑行装备指南:骑行裤/裙和骑行服的选购要点
股市下跌时的投资策略有哪些?这些投资策略如何根据市场变化进行调整?
实验方案设计六个步骤
二手房过户费用详细解读
港股暴涨!原因是什么?
帧率和丢帧分析理论
补充多巴胺最好食物是什么
北京地区2024年全国科普日阿尔茨海默病防治活动集锦
卫星系统安全深度剖析:风险与防护措施
"cr"缩写的多元含义与应用:学术、情感及社交场合解析
Excel中QUARTILE.INC函数详解:四分位数的计算方法与应用
工厂生产效率如何提升?这8个重点你不得不看!
洞悉泊松分布:稀有事件的概率洞察
生产经营单位生产安全事故应急预案编制导则的具体步骤有哪些?
糖尿病药品医保怎么报销?糖尿病 医疗保险
留意6种走路姿势,或是疾病信号!