责任链模式

343 阅读1分钟

概念

将有机会处理同一请求的对象连成一条链,沿着这条链传递这个请求,直到对象处理它为止

使用场景

多个对象可以处理同一请求,但具体哪个对象处理则在运行时动态决定

实现方式

  • Handler ——抽象处理者 :包括拦截处理请求的方法(handleRequest),拦截后真正处理请求的方法(handle),和下一个处理节点对象的引用字段(nextHandler),本处理者的等级字段(handlerLevel)
  • Handler1,Handler2——具体处理者。需要设置等级,下一个节点对象字段,实现handle方法
  • Request—— 抽象请求者,包含处理对象和处理等级
  • Request1,Request2 —— 具体请求者
public abstract class Handler{
    protected Handler nextHandler;

    public final void handleRequest(Request req){
        if(getHandlerLevel() == req.requestLevel){
            handle(req);
        } else {
            if(nextHandler != null){
                nextHandler.handleRequest(req);
            } else {
                System.out.println("all the handle cannot handle the request");
            }
        }
    }

    protected abstract int getHandlerLevel();

    protected abstract void handle(Request req);   
}

public class Handler1 extends Handler {

    @Override
    protected int getHandlerLevel(){
        return 1;
    }

    @Override
    protected void handle (Request req){
        System.out.println("handler1 handle the request");
    }
}

public class Handler2 extends Handler {

    @Override
    protected int getHandlerLevel(){
        return 2;
    }

    @Override
    protected void handle (Request req){
        System.out.println("handler2 handle the request");
    }
}

public class Handler3 extends Handler {

    @Override
    protected int getHandlerLevel(){
        return 3;
    }

    @Override
    protected void handle (Request req){
        System.out.println("handler3 handle the request");
    }
}

public abstract class Request {
    private Object obj; //处理对象

    public Request(Object obj){
        this.obj = obj;
    }

    public Object getContent(){
        return obj;    
    }

    public abstract int getRequestLevel();
}

public class Request extends Request {
    public Request(Object obj){
        super(obj);
    }

    @Override
    public int getRequestLevel(){
        return 1;
    }
}

public class Request2 extends Request {
    public Request(Object obj){
        super(obj);
    }

    @Override
    public int getRequestLevel(){
        return 2;
    }
}


public class Client{
    public static void main(String[] args){
        Handler h1 = new Handler1();
        Handler h2 = new Handler2();
        Handler h3 = new Handler3();
        h1.nextHandler = h2;
        h2.nextHandler = h3;
        Request req = new Request2("Request2");
        h1.handleRequest(req);
    }
}