掌握Java设计模式之责任链设计模式(14)

原创
2018/04/25 16:17
阅读数 339

1、概念理解

      举例说明:一家三辈(儿子,父亲,爷爷),去帮助一个一个小学一年级的学生解决一道数学题,这个小学生请求帮助,他就是请求者,儿子先帮忙,儿子不行父亲上,父亲不行爷爷上,爷爷不行那就gg,小学生这个请求者不知道谁能做出来,这种情况就是责任链。

      职责链模式(Chain of Responsibility):使多个对象都有机会处理同一个请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

2、应用场景

1、我们经常的if else判断就可以这样,顺序执行可以考虑,我们可以考虑这种模式,当然策略模式也是可以的,
2、公司准备做一个请假制度,孕妇可以请9天,喜事3天,丧事6天等等这种if else的判断,我们也可以用到责任链模式

    不过这种模式一般很少见到,不过有一处我们体会过,Tomcat中的Filter就是使用了责任链模式,创建一个Filter除了要在web.xml文件中做相应配置外,还需要实现javax.servlet.Filter接口。

3、代码实现

public class Level {

    private int level = 0;

    public Level(int level) {
        this.level = level;
    }

    public int getLevel() {
        return level;
    }

    public boolean above(Level level) {
        if(this.level >= level.getLevel()) {
            return true;
        }else {
            return false;
        }
    }
}
public class Request {
    Level level;

    public Request(Level level) {
        System.out.println("开始请求...");
        this.level = level;
    }

    public Level getLevel() {
        return level;
    }
}
public class Response {
    private String message;
    public Response(String message) {
        System.out.println("处理完请求");
        this.message = message;
    }
    public String getMessage() {
        return message;
    }
}
public abstract class Handler {

    private Handler nextHandler = null;

    public void setNextHandler(Handler handler){
        this.nextHandler = handler;
    }

    protected abstract Level getHandlerLevel();

    public abstract Response response(Request request);

    public final Response handlerRequest(Request request){

        Response response = null;

        if (this.getHandlerLevel().above(request.level)){
                response = this.response(request);
        }else {
            if (nextHandler.nextHandler != null){
                response = this.nextHandler.handlerRequest(request);
            }else {
                System.out.println("没有能够满足条件的");
            }
        }
        return response;
    }
}
public class ConcreteHandler1 extends Handler {
    @Override
    protected Level getHandlerLevel() {
        return new Level(1);
    }

    @Override
    public Response response(Request request) {
        System.out.println("该请求由 ConcreteHandler1 处理");
        return new Response("响应结果 1");
    }
}
public class ConcreteHandler2 extends Handler {
    @Override
    protected Level getHandlerLevel() {
        return new Level(2);
    }

    @Override
    public Response response(Request request) {
        System.out.println("该请求由 ConcreteHandler2 处理");
        return new Response("响应结果 2");
    }
}
public class ConcreteHandler3 extends Handler {
    @Override
    protected Level getHandlerLevel() {
        return new Level(3);
    }

    @Override
    public Response response(Request request) {
        System.out.println("该请求由 ConcreteHandler3 处理");
        return new Response("响应结果 3");
    }
}
public class HandlerUtil {

    public static void handle(int level){
        Handler ch1 = new ConcreteHandler1();
        Handler ch2 = new ConcreteHandler2();
        Handler ch3 = new ConcreteHandler3();
        ch1.setNextHandler(ch2);
        ch2.setNextHandler(ch3);

        Response res1 = ch1.handlerRequest(new Request(new Level(level)));
        if (res1 != null) {
            System.out.println(res1.getMessage());
        }
    }
}

      main函数

public class Main {

    public static void main(String[] args){
       HandlerUtil.handle(2);
       System.out.println("-------------");
       HandlerUtil.handle(4);
    }
}

      结果

          

      其实,总感觉还不如用策略模式或者直接写if else呢,虽然if else的缺点是代码臃肿,耦合度高,而这个责任链设计模式是灵活性比较高,但是写完这个博客没感觉出来,大家还是知道有这么一个模式就好,毕竟你现在有了疑问,将来说不定碰到一个大神,会指点你的。

https://www.jianshu.com/p/9f7d9775bdda 这个还比较ok。

展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部