在责任链模式中,多个处理对象之间,通过每个处理对象保存其下家的引用而连接成一条链。请求在链上传递,直到链上的某个对象决定处理它。客户端不知道请求将被哪个对象处理, 因此系统可以在不影响客户端的情况下,重新组织和分配责任。
有文章将责任链模式分成纯净的责任链和不纯净的责任链。纯净的责任链是一旦某个处理对象决定处理请求,那么它不会将请求继续向后传递;非纯净的责任链是某个处理对象在处理完请求之后,仍然会把请求向后传递。责任链模式是非常常用的行为型设计模式。比如 Nginx 将 HTTP 请求的处理划分成若干个阶段,每个阶段完成不同的责任,每个阶段处理完成之后,按照情形决定是否将请求传递给下一阶段;在 Java Servlet 中,请求和响应对象会逐个地经过若干个 Filter,最终达到 Servlet,Servlet 执行完成后,请求和响应对象又将反向地通过这些 Filter,每个 Filter 负责不同的责任,比如鉴权、记录日志等。
Handler
抽象处理者角色。主要定义以下两个接口:
ConcreteHandler
具体请求处理者可以处理请求,也可以将请求传递给下家