Java责任链模式

责任链模式是一种行为设计模式,它允许你创建一个对象链。每个对象依次检查传递给它的请求,并决定是否要处理它。责任链模式有一些优点和缺点。

优点:

  1. 松散耦合: 责任链模式使得发送者和接收者不直接相互依赖,从而降低了系统中对象之间的耦合度。每个处理器都独立处理请求,不需要知道整个链的结构。

  2. 灵活性: 责任链模式使得可以动态地调整和扩展处理链。你可以轻松地新增或删除处理器,而无需修改现有的代码。

  3. 单一职责原则: 责任链模式有助于遵循单一职责原则,每个具体处理器只负责处理自己关心的请求。

  4. 简化对象: 发送者无需知道请求的最终处理者,降低了发送者和处理者之间的复杂性。

缺点:

  1. 请求未必被处理: 如果责任链未正确配置,或者没有合适的处理器处理请求,请求可能无法被处理。这可能是设计不当或配置错误导致的。

  2. 性能影响: 如果责任链过长,请求可能需要遍历整个链才能被处理。这可能会影响性能,特别是在链条很长且处理器处理时间较长的情况下。

  3. 难以调试: 当一个请求通过责任链时,难以确定哪个具体处理器最终处理了请求。这可能导致调试和维护的困难。

  4. 不适用于处理多个独立请求: 如果一个处理器处理的请求不仅取决于当前请求,还取决于其他请求或系统状态,责任链模式可能不是最佳选择。

场景使用:

请假OA审批:这里简单的文字描述

1.首选常见一个handler抽象类

2.组长/项目经理/人事经理实现这个抽象类

3.通过在工厂模式中实现找到第一个实例对象和最后一个实例对象,在实例对象中添加下一个实例指向(这里对比链表理解)

我们通过工厂类找到事先设置好的实例对象(bean)顺序 这里一个个1请假顺序执行  组长>项目经理>人事经理

替换:我们可以通过数据库替换事先的工厂模式,通过mysql表的形式

表的结构:id  bean对象 指向的下个对象

找到第一个实例开始的对象,找到下个对象

通过springUtils工具类和获取数据库字段获取spring 容器bean对象

从第一个对象开始引用下个对象,一直引用

(注意这里:可以借用一个临时对象存放引用责任链的对象,防止覆盖,这里临时对象改变,则第一个开始的对象也会相应改变)

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送,直到其中一个处理者对其进行处理。在责任链模式中,每个处理者都可以决定是否将请求传递给下一个处理者,以及何时停止传递。 在Java中,责任链模式通常由一个抽象处理者类和多个具体处理者类组成。每个具体处理者类都实现了抽象处理者类,并且在处理请求时可以选择将其传递给下一个处理者或停止传递。 以下是一个简单的Java责任链模式示例: ```java public abstract class Handler { protected Handler successor; public void setSuccessor(Handler successor) { this.successor = successor; } public abstract void handleRequest(Request request);} public class ConcreteHandler1 extends Handler { public void handleRequest(Request request) { if (request.getLevel() <= 1) { System.out.println("ConcreteHandler1 handled the request."); } else if (successor != null) { successor.handleRequest(request); } } } public class ConcreteHandler2 extends Handler { public void handleRequest(Request request) { if (request.getLevel() <= 2) { System.out.println("ConcreteHandler2 handled the request."); } else if (successor != null) { successor.handleRequest(request); } } } public class Request { private int level; public Request(int level) { this.level = level; } public int getLevel() { return level; } } public class Client { public static void main(String[] args) { Handler handler1 = new ConcreteHandler1(); Handler handler2 = new ConcreteHandler2(); handler1.setSuccessor(handler2); Request request1 = new Request(1); handler1.handleRequest(request1); Request request2 = new Request(2); handler1.handleRequest(request2); Request request3 = new Request(3); handler1.handleRequest(request3); } } ``` 在上面的示例中,我们定义了一个抽象处理者类Handler和两个具体处理者类ConcreteHandler1和ConcreteHandler2。每个处理者都可以处理请求,或将其传递给下一个处理者。我们还定义了一个Request类,它包含请求的级别。 在客户端代码中,我们创建了两个处理者对象,并将它们链接在一起形成一个处理者链。然后,我们创建了三个请求对象,并将它们发送到处理者链中进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值