目录
责任链(Chain of Responsibility)模式的定义:也叫职责链模式。为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,所以责任链将请求的发送者和请求的处理者解耦了。

Handler: 定义处理请求的接口,并且实现后继链(successor)
- public abstract class Handler {
- protected Handler successor;
-
- public Handler(Handler successor) {
- this.successor = successor;
- }
-
- protected abstract void handleRequest(Request request);
- }
- public class ConcreteHandler1 extends Handler {
- public ConcreteHandler1(Handler successor) {
- super(successor);
- }
-
- @Override
- protected void handleRequest(Request request) {
- if (request.getType() == RequestType.type1) {
- System.out.println(request.getName() + " is handle by ConcreteHandler1");
- return;
- }
- if (successor != null) {
- successor.handleRequest(request);
- }
- }
- }
- public class ConcreteHandler2 extends Handler{
- public ConcreteHandler2(Handler successor) {
- super(successor);
- }
-
- @Override
- protected void handleRequest(Request request) {
- if (request.getType() == RequestType.type2) {
- System.out.println(request.getName() + " is handle by ConcreteHandler2");
- return;
- }
- if (successor != null) {
- successor.handleRequest(request);
- }
- }
- }
- public enum RequestType {
- type1, type2
- }
-
- public class Request {
- private RequestType type;
- private String name;
-
- public Request(RequestType type, String name) {
- this.type = type;
- this.name = name;
- }
-
- public RequestType getType() {
- return type;
- }
-
- public String getName() {
- return name;
- }
- }
- public class Client {
- public static void main(String[] args) {
- Handler handler1 = new ConcreteHandler1(null);
- Handler handler2 = new ConcreteHandler2(handler1);
- Request request1 = new Request(RequestType.type1, "request1");
- handler2.handleRequest(request1);
- Request request2 = new Request(RequestType.type2, "request2");
- handler2.handleRequest(request2);
- }
- }
- request1 is handle by ConcreteHandler1
- request2 is handle by ConcreteHandler2
JDK中的实现
java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()