设计模式-职责链模式
职责链模式
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.
一. 抽象处理者
抽象处理者实现了三个职责:
-
定义一个请求的处理方法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() 为空而抛出异常,具体内容需根据业务逻辑进行编写。
