Java 基础
Java 容器
Java 并发
设计模式
目录

责任链

# 责任链(Chain Of Responsibility)

# Intent

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链发送该请求,直到有一个对象处理它为止。

# Class Diagram

  • Handler:定义处理请求的接口,并且实现后继链(successor)

# Implementation

package com.code.chain.example;

public abstract class Handler {

    protected Handler successor;

    public Handler(Handler successor) {
        this.successor = successor;
    }

    protected abstract void handleRequest(Request request);
}
1
2
3
4
5
6
7
8
9
10
11
12
package com.code.chain.example;

public class CommonHandler1 extends Handler {

    public CommonHandler1(Handler successor) {
        super(successor);
    }

    @Override
    protected void handleRequest(Request request) {
        if (request.getType() == RequestType.TYPE1) {
            System.out.println(request.getName() + " is handle by CommonHandler1");
            return;
        }
        if (successor != null) {
            successor.handleRequest(request);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.code.chain.example;

public class CommonHandler2 extends Handler {

    public CommonHandler2(Handler successor) {
        super(successor);
    }


    @Override
    protected void handleRequest(Request request) {
        if (request.getType() == RequestType.TYPE2) {
            System.out.println(request.getName() + " is handle by CommonHandler2");
            return;
        }
        if (successor != null) {
            successor.handleRequest(request);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.code.chain.example;

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;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.code.chain.example;

public enum RequestType {
    TYPE1, TYPE2
}
1
2
3
4
5
package com.code.chain.example;

public class Main {
    public static void main(String[] args) {

        Handler handler1 = new CommonHandler1(null);
        Handler handler2 = new CommonHandler2(handler1);

        Request request1 = new Request(RequestType.TYPE1, "request1");
        handler2.handleRequest(request1);

        Request request2 = new Request(RequestType.TYPE2, "request2");
        handler2.handleRequest(request2);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
request1 is handle by CommonHandler1
request2 is handle by CommonHandler2
1
2

# 参考

  • java.util.logging.Logger#log() (opens new window)
  • Apache Commons Chain (opens new window)
  • javax.servlet.Filter#doFilter() (opens new window)