😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~
津津乐道设计模式 - 责任链模式详解
- 什么是责任链模式
- 责任链模式适用场景
- 生活案例
- 案例代码
- 责任链模式优缺点
- 结语
什么是责任链模式
责任链模式是一种行为设计模式,它将请求的发送者和接收者解耦,通过一条由多个处理器组成的链来处理请求。每个处理器都有机会处理请求,但具体由哪个处理器处理取决于请求的特征和处理器的设置
责任链模式适用场景
- 请求需要经过多个处理器依次处理:当一个请求需要经过多个处理器依次处理,并且每个处理器只处理自己负责的部分时,可以使用责任链模式。例如,审批流程中的多级审批,每个审批人只负责自己的审批任务,而不同级别的审批人形成一个处理链。
- 需要动态添加或删除处理器:责任链模式允许在运行时动态添加或删除处理器,灵活性较高。这样可以根据业务需求动态调整处理链,实现动态的责任分配。
- 需要在处理器之间进行解耦:责任链模式将请求的发送者和接收者解耦,发送者只需要将请求发送给责任链的头部,而不需要知道具体的接收者是谁。这样可以简化系统的设计,使各个处理器之间的耦合度降低。
总之,责任链模式适用于处理请求的场景,其中请求需要经过多个处理器依次处理,并且处理器之间存在某种逻辑关系。通过责任链模式,可以提高系统的灵活性和可扩展性,减少请求发送者与接收者之间的耦合。
生活案例
现实生活中我们也经常能看到责任链模式的应用:
1)比如流程审批就是一个很好的例子,只要终端用户提交申请,根据申请的内容信息,自动建立一条责任链,然后就可以开始流转了。
2)再比如我们有一个在线购物系统,用户下单后需要依次进行以下处理:库存检查、价格计算、优惠券验证、订单生成等。每个处理步骤都由不同的处理器来完成,而且处理器之间存在一定的逻辑关系。每个处理器负责处理一项具体的任务,并且决定是否将请求传递给下一个处理器。
案例代码
我们就以上面购物系统下单处理为例子,进行代码演示:
首先,定一个订单简单订单Order类
/**
* 定义一个简单的订单对象
* @author micro
*/
public class Order {
//订单编号
private String OrderNo;
//商品名称
private String GoodsName;
//商品价格
private String GoodsPrice;
public String getOrderNo() {
return OrderNo;
}
public void setOrderNo(String orderNo) {
OrderNo = orderNo;
}
public String getGoodsName() {
return GoodsName;
}
public void setGoodsName(String goodsName) {
GoodsName = goodsName;
}
public String getGoodsPrice() {
return GoodsPrice;
}
public void setGoodsPrice(String goodsPrice) {
GoodsPrice = goodsPrice;
}
}
定义一个抽象处理器类 OrderHandler,其中包含一个指向下一个处理器的引用和一个处理请求的方法:
public abstract class OrderHandler {
protected OrderHandler nextHandler;
public void setNextHandler(OrderHandler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract void handleRequest(Order order);
}
定义库存检查处理器
public class StockCheckHandler extends OrderHandler {
@Override
public void handleRequest(Order order) {
// 执行库存检查的任务
System.out.println("执行库存检查");
// 判断是否需要传递给下一个处理器
if (nextHandler != null) {
nextHandler.handleRequest(order);
}
}
}
定义价格计算处理器
public class PriceCalculationHandler extends OrderHandler {
@Override
public void handleRequest(Order order) {
// 执行价格计算的任务
System.out.println("执行价格计算");
// 判断是否需要传递给下一个处理器
if (nextHandler != null) {
nextHandler.handleRequest(order);
}
}
}
优惠券验证处理器
public class CouponValidationHandler extends OrderHandler {
@Override
public void handleRequest(Order order) {
// 执行优惠券验证的任务
System.out.println("执行优惠券验证");
// 判断是否需要传递给下一个处理器
if (nextHandler != null) {
nextHandler.handleRequest(order);
}
}
}
定义订单生成处理器
class OrderGenerationHandler extends OrderHandler {
@Override
public void handleRequest(Order order) {
// 执行订单生成的任务
System.out.println("执行订单生成");
}
}
最后测试类
在这里插入代码片
完整代码结构如下
在这个示例中,我们定义了订单类 Order
和抽象处理器类 OrderHandler
,并实现了具体的处理器类 StockCheckHandler
、PriceCalculationHandler
、CouponValidationHandler
和 OrderGenerationHandler
。客户端代码通过创建处理器实例,并将它们按照特定的顺序连接成处理器链,然后将订单请求传递给处理器链的头部处理器。
每个处理器负责自己的任务,并根据业务逻辑决定是否将请求传递给下一个处理器。在示例中,订单请求经过库存检查、价格计算、优惠券验证和订单生成的处理步骤。
最终执行效果
这样,通过使用责任链模式,可以将复杂的处理流程拆分为多个独立的处理步骤,并且每个处理器只需关注自己的任务,使系统具有良好的灵活性和可扩展性。
责任链模式优缺点
责任链模式的优点
- 解耦责任:责任链模式将请求的发送者和接收者解耦,发送者不需要知道具体的接收者,只需将请求发送给第一个处理器即可,每个处理器只关注自己的责任范围。
- 灵活性和可扩展性:可以动态地添加或修改处理器,而不影响其他处理器的工作。可以根据业务需求灵活组合处理器形成不同的处理链。
- 可以处理复杂的请求流程:当一个请求需要经过多个处理步骤,并且每个处理步骤都有可能处理或者传递请求时,责任链模式能够很好地处理这种复杂的请求流程。
责任链模式的缺点
- 无法保证请求一定被处理:由于请求的传递是通过处理器链进行的,如果链中的处理器没有正确配置或者没有处理请求的逻辑,请求可能无法被正确处理。
- 可能引起性能问题:当责任链中的处理器较多时,每个请求都需要从链头开始遍历,直到找到能够处理它的处理器。如果链中的处理器过多或者处理逻辑复杂,可能会导致性能下降。
- 可能导致系统调试和理解困难:由于请求的处理是分散在多个处理器中进行的,当出现问题时,需要追踪整个责任链来定位问题所在,可能会增加调试和理解的复杂性。
因此,在使用责任链模式时需要谨慎考虑,权衡其优缺点,并根据实际情况选择是否使用该模式。
结语
本章节主要介绍了责任链模式、责任链模式适用场景、责任链模式的优缺点,并以商场系统下单验证的场景模拟责任链模式的使用方法,如果本文对你有用,欢迎关注收藏评论,后续将陆续推出贴切生活的搞笑讲解方式带大家一起学编程~
样例代码:https://github.com/lhmyy521125/toher-designmode