设计模式-职责链模式
职责链模式
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.
一. 抽象处理者
抽象处理者实现了三个职责:
-
定义一个请求的处理方法handlerMessage(),是唯一对外开放的方法 定义一个链的编排方式setNext(),用于设置下一个处理者 定义了具体的请求者必须实现的两个方法,即定义自己能够处理的级别的getHandlerLevel()方法及具体的处理任务echo()方法
1 public abstract class Handler { 2 3 private Handler nextHandler; //下一个处理者 4 5 public final Response handlerMessage(Request request) { 6 Response response = null; 7 8 if(this.getHandlerLevel().equals(request.getRequestLevel())) { //判断是否是自己的处理级别 9 response = this.echo(request); 10 } else { 11 if(this.nextHandler != null) { //下一处理者不为空 12 response = this.nextHandler.handlerMessage(request); 13 } else { 14 //没有适当的处理者,业务自行处理 15 } 16 } 17 18 return response; 19 } 20 21 //设定下一个处理者 22 public void setNext(Handler handler) { 23 this.nextHandler = handler; 24 } 25 26 //每个处理者的处理等级 27 protected abstract Level getHandlerLevel(); 28 29 //每个处理者都必须实现的处理任务 30 protected abstract Response echo(Request request); 31 32 }
二. 具体处理者
这里我们定义三个具体处理者,以便能组成一条链,ConcreteHandlerB及ConcreteHandlerC就不再赘述了。
1 public class ConcreteHandlerA extends Handler { 2 3 @Override 4 protected Level getHandlerLevel() { 5 //设置自己的处理级别 6 return null; 7 } 8 9 @Override 10 protected Response echo(Request request) { 11 //完成处理逻辑 12 return null; 13 } 14 15 }
三. Level类
Level类负责定义请求和处理级别,具体内容需根据业务产生。
1 public class Level { 2 //定义一个请求和处理等级 3 }
四. Request类
Request类负责封装请求,具体内容需根据业务产生。
1 public class Request { 2 3 //请求的等级 4 public Level getRequestLevel() { 5 return null; 6 } 7 8 }
五. Response类
Response类负责封装链中返回的结果,具体内容需根据业务产生。
1 public class Response { 2 //处理者返回的数据 3 }
六. Client客户端
我们在场景类或高层模块中对类进行组装,并传递请求,返回结果。如下对三个具体处理者进行组装,按照1→2→3的顺序,并得出返回结果。
1 public class Client { 2 3 public static void main(String[] args) { 4 Handler handler1 = new ConcreteHandlerA(); 5 Handler handler2 = new ConcreteHandlerB(); 6 Handler handler3 = new ConcreteHandlerC(); 7 8 //设置链中的阶段顺序 1->2->3 9 handler1.setNext(handler2); 10 handler2.setNext(handler3); 11 12 //提交请求返回结果 13 Response response = handler1.handlerMessage(new Request()); 14 } 15 16 }
当然这是个未完成的模板,最终结果会因为 request.getRequestLevel() 为空而抛出异常,具体内容需根据业务逻辑进行编写。