责任链模式-Chain of Responsibility
名称:
责任链模式 (Chain of Responsibility Pattern)-对象行为型模式
问题:
The Chain of Responsibility pattern establishes a chain within a system, so that a message can either be handled at the level where it is first received, or be directed to an object that can handle it.
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
适用性:
-有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
-你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
-可处理一个请求的对象集合应被动态指定。
协作:
当客户提交一个请求时。请求沿链传递直至有一个ConcreteHandler对象负责处理它。
优点和缺点:
1、降低耦合度。该模式使得一个对象无需知道是其他哪一个对象处理其请求。
2、增强了给对象指派职责的灵活性。当在对象中分配职责时,职责链给你更多的灵活性。
3、不保证被接受
解决方案:
1、 模式的参与者
1、Handler
-定义一个处理请求的接口。
-(可选)实现后继链。
2、ConcreteHandler
-处理它所负责的请求。
-可访问它的后继者。
-如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
3、Client
-向链上的具体处理者对象提交请求。
2.实现方式
abstract class Handler { private Handler next; public void setNext(Handler next) { this.next=next; } public Handler getNext() { return next; } public abstract void handleRequest(String request); }
class ConcreteHandler1 extends Handler { public void handleRequest(String request) { if(request.equals("Handler1")) { System.out.println("process on Handler1!"); } else { if(getNext()!=null) { getNext().handleRequest(request); } else { System.out.println("no processor"); } } } }
class ConcreteHandler2 extends Handler { public void handleRequest(String request) { if(request.equals("Handler2")) { System.out.println("process on Handler2!"); } else { if(getNext()!=null) { getNext().handleRequest(request); } else { System.out.println("no processor"); } } } }
public class ChainOfResponsibilityPattern { public static void main(String[] args) { Handler handler1=new ConcreteHandler1(); Handler handler2=new ConcreteHandler2(); handler1.setNext(handler2); handler1.handleRequest("two"); } }
参考资料
《设计模式:可复用面向对象软件的基础》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具