责任链模式是一种行为设计模式,它允许你创建一个对象链。每个对象依次检查传递给它的请求,并决定是否要处理它。责任链模式有一些优点和缺点。
优点:
-
松散耦合: 责任链模式使得发送者和接收者不直接相互依赖,从而降低了系统中对象之间的耦合度。每个处理器都独立处理请求,不需要知道整个链的结构。
-
灵活性: 责任链模式使得可以动态地调整和扩展处理链。你可以轻松地新增或删除处理器,而无需修改现有的代码。
-
单一职责原则: 责任链模式有助于遵循单一职责原则,每个具体处理器只负责处理自己关心的请求。
-
简化对象: 发送者无需知道请求的最终处理者,降低了发送者和处理者之间的复杂性。
缺点:
-
请求未必被处理: 如果责任链未正确配置,或者没有合适的处理器处理请求,请求可能无法被处理。这可能是设计不当或配置错误导致的。
-
性能影响: 如果责任链过长,请求可能需要遍历整个链才能被处理。这可能会影响性能,特别是在链条很长且处理器处理时间较长的情况下。
-
难以调试: 当一个请求通过责任链时,难以确定哪个具体处理器最终处理了请求。这可能导致调试和维护的困难。
-
不适用于处理多个独立请求: 如果一个处理器处理的请求不仅取决于当前请求,还取决于其他请求或系统状态,责任链模式可能不是最佳选择。
场景使用:
请假OA审批:这里简单的文字描述
1.首选常见一个handler抽象类
2.组长/项目经理/人事经理实现这个抽象类
3.通过在工厂模式中实现找到第一个实例对象和最后一个实例对象,在实例对象中添加下一个实例指向(这里对比链表理解)
我们通过工厂类找到事先设置好的实例对象(bean)顺序 这里一个个1请假顺序执行 组长>项目经理>人事经理
替换:我们可以通过数据库替换事先的工厂模式,通过mysql表的形式
表的结构:id bean对象 指向的下个对象
找到第一个实例开始的对象,找到下个对象
通过springUtils工具类和获取数据库字段获取spring 容器bean对象
从第一个对象开始引用下个对象,一直引用
(注意这里:可以借用一个临时对象存放引用责任链的对象,防止覆盖,这里临时对象改变,则第一个开始的对象也会相应改变)