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的缺点是代码臃肿,耦合度高,而这个责任链设计模式是灵活性比较高,但是写完这个博客没感觉出来,大家还是知道有这么一个模式就好,毕竟你现在有了疑问,将来说不定碰到一个大神,会指点你的。