设计模式(10)-责任链模式

定义
为请求的处理创建一个处理链条,链条上的每个节点都可以对请求作出相应的处理,类似于工厂中的生产线.责任链模式的应用较广泛,如工作流,FilterChain,Storm对消息的处理等等.
缺点:
当处理链条较长时,消息经过每一个节点处理,会牺牲较多性能.

1.抽象Handle类

public abstract class Handle {
    //下一个handle
    protected Handle nextHandle = null;

    //设置下一个处理handle.
    public void setNext(Handle nextHandle){
        this.nextHandle = nextHandle;
    }

    //处理请求
    protected abstract Response handleRequest(Request request);

    //获取handle的处理条件
    protected abstract String getCondition();   
}

2.具体Handle类
注:设计模式之禅中将handleRequest在抽象handle中实现有一定局限,毕竟每个handle对消息的处理不同,应由具体handle类实现.

public class Handle1 extends Handle{
    private final static String condition = "1";

    @Override
    public String getCondition() {
        return condition;
    }

    @Override
    protected Response handleRequest(Request request) {
        Response response = null;
        //如果请求条件与本handle的处理条件相同,则处理.
        if(this.getCondition()==request.getReqCondition()){
            response = new Response("请求条件与Handle1的处理条件相同,本条请求被Handle1处理!!!");
        }else{//如果请求条件与handle的处理条件不同,则让下一个handle处理.
            if(null == super.nextHandle){
                response = new Response("请求走完所有handle仍未被处理!!!");
            }
            System.out.println("请求条件与handle1的处理条件不同,本条请求被发送至下一条!!!");
            response = super.nextHandle.handleRequest(request);
        }

        return response;
    }
}
public class Handle2 extends Handle{
    private final static String condition = "2";

    @Override
    public String getCondition() {
        return condition;
    }

    @Override
    protected Response handleRequest(Request request) {
        Response response = null;
        //如果请求条件与本handle的处理条件相同,则处理.
        if(this.getCondition()==request.getReqCondition()){
            response = new Response("请求条件与Handle2的处理条件相同,本条请求被Handle2处理!!!");
        }else{//如果请求条件与handle的处理条件不同,则让下一个handle处理.
            if(null == super.nextHandle){
                response = new Response("请求走完所有handle仍未被处理!!!");
            }
            System.out.println("请求条件与handle2的处理条件不同,本条请求被发送至下一条!!!");
            response = super.nextHandle.handleRequest(request);
        }

        return response;
    }
public class Handle3 extends Handle{
    private final static String condition = "3";

    @Override
    public String getCondition() {
        return condition;
    }

    @Override
    protected Response handleRequest(Request request) {
        Response response = null;
        //如果请求条件与本handle的处理条件相同,则处理.
        if(this.getCondition()==request.getReqCondition()){
            response = new Response("请求条件与Handle3的处理条件相同,本条请求被Handle3处理!!!");
        }else{//如果请求条件与handle的处理条件不同,则让下一个handle处理.
            if(null == super.nextHandle){
                response = new Response("请求走完所有handle仍未被处理!!!");
            }
            System.out.println("请求条件与handle3的处理条件不同,本条请求被发送至下一条!!!");
            response = super.nextHandle.handleRequest(request);
        }

        return response;
    }
}

3.请求体和响应体

public class Request {
    //将请求的执行条件封装进request
    private String reqCondition;

    public Request(String reqCondition){
        this.reqCondition = reqCondition;
    }

    public String getReqCondition(){
        return reqCondition;
    }
}
public class Response {
    private String ResponseStr;

    public Response(String ResponseStr){
        this.ResponseStr = ResponseStr;
    }

    public String getResponseStr(){
        return ResponseStr;
    }
}

4.运行

public class Client {
    public static void main(String[] args) {
        Handle handle1 = new Handle1();
        Handle handle2 = new Handle2();
        Handle handle3 = new Handle3();

        //设置处理链
        handle1.setNext(handle2);
        handle2.setNext(handle3);

        //将请求发送至第一个handle
        Response response = handle1.handleRequest(new Request("3"));
        System.out.println(response.getResponseStr());
    }
}

输出:

请求条件与handle1的处理条件不同,本条请求被发送至下一条!!!
请求条件与handle2的处理条件不同,本条请求被发送至下一条!!!
请求条件与Handle3的处理条件相同,本条请求被Handle3处理!!!

猜你喜欢

转载自blog.csdn.net/chixiaoen/article/details/79397413