设计模式
责任链(Chain Of Responsibility)

责任链(Chain Of Responsibility)

通过责任链模式, 你可以为某个请求创建一个对象链. 每个对象依序检查此请求并对其进行处理或者将它传给链中的下一个对象。

适用于哪些场景 .

取数组中大于 10 的元素列表, 取列表中不为空的元素列表

对 url 进行 session 权限校验时, 遍历每一个 filter 实例判断是否满足.

实现

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 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 enum RequestType {
    type1, type2
}
 
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