设计模式-职责链模式

职责链模式

 定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.

  一. 抽象处理者

  抽象处理者实现了三个职责:

    定义一个请求的处理方法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() 为空而抛出异常,具体内容需根据业务逻辑进行编写。

经验分享 程序员 微信小程序 职场和发展