java 23种设计模式之行为型模式—责任链模式(17)
那么首先我们因该知道什么是责任链模式:
Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request。也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。
假设,我们服务器收到一个请求,我们需要对这个请求写出业务逻辑
请求包括:get 、 post 、 put 、 delete 一共4个请求,我们需要拦截这4个请求
比如此时我们收到的是put请求,那么在get和post这个拦截器里面我们也有自己的业务逻辑,但是最终他们会传递,会吧这个put请求给put拦截器来处理
怎么样,这个思路是不是和我们struts2或springmvc里面的拦截器和过滤器类似,是的,他们用的就是责任链模式。
那么,我们就来写一下我们的这个小demo吧
首先:抽象处理者(Handler)角色
package com.sjms.responsibility_1; /* * 假定我们需要拦截get post put delete请求 * 并且拦截的顺序就是 get post put delete * 业务逻辑我们随便写 */ public abstract class intercept { protected intercept successor; //需要实现的业务方法 public abstract void interceptRequest(String request); //获得下一个拦截 执行 public intercept getSuccessor() { return successor; } //设置当前拦截的下一个拦截 public void setSuccessor(intercept successor) { this.successor = successor; } }
然后:具体处理者(ConcreteHandler)角色
我们这里有4个角色:get 、post、put、delete
还有一个最终的角色:final。
因为如果我们收到的请求不是这四类怎么办,那就由最后一个拦截器来处理
这4个拦截器角色的基本代码框架都差不多的,可根据自己的 业务逻辑修改
1、get拦截器
public class interceptGet extends intercept{ @Override public void interceptRequest(String request) { if(request.toLowerCase().equals("get")){ System.out.println("当前的请求是get,已经被处理"); }else{ System.out.println("当前的请求是:"+request+",不能由‘interceptGet’处理,交给下一个拦截器处理"); this.getSuccessor().interceptRequest(request);; } } }2、post拦截器
public class interceptPost extends intercept{ @Override public void interceptRequest(String request) { if(request.toLowerCase().equals("post")){ System.out.println("当前的请求是post,已经被处理"); }else{ System.out.println("当前的请求是:"+request+",不能由‘interceptPost’处理,交给下一个拦截器处理"); this.getSuccessor().interceptRequest(request);; } } }3、put拦截器
public class interceptPut extends intercept{ @Override public void interceptRequest(String request) { if(request.toLowerCase().equals("put")){ System.out.println("当前的请求是put,已经被处理"); }else{ System.out.println("当前的请求是:"+request+",不能由‘interceptPut’处理,交给下一个拦截器处理"); this.getSuccessor().interceptRequest(request);; } } }4、delete拦截器
public class interceptDelete extends intercept{ @Override public void interceptRequest(String request) { if(request.toLowerCase().equals("delete")){ System.out.println("当前的请求是delete,已经被处理"); }else{ System.out.println("当前的请求是:"+request+",不能由‘interceptDelete’处理,交给下一个拦截器处理"); this.getSuccessor().interceptRequest(request);; } } }如果我们后期还要增加其他拦截器,只需要增加一个拦截器类就可以了
5、最终拦截器
如果收到的请求不是我们定义的四类怎么办,就需要一个最终的拦截器来处理
public class interceptFinal extends intercept{ @Override public void interceptRequest(String request) { System.out.println("如果运行到这里,那应该是出现什么意外:或许您的请求来自月球"); } }最后是客户端代码,如下:
public class Client { public static void main(String[] args) { intercept intercept1 = new interceptGet(); intercept intercept2 = new interceptPost(); intercept intercept3 = new interceptPut(); intercept intercept4 = new interceptDelete(); intercept intercept5 = new interceptFinal(); //这里可自行修改顺序,根据您的业务来定义顺序 intercept1.setSuccessor(intercept2); intercept2.setSuccessor(intercept3); intercept3.setSuccessor(intercept4); intercept4.setSuccessor(intercept5); //这里请自行修改 intercept1.interceptRequest("put"); } }打印结果如下:
当前的请求是:put,不能由‘interceptGet’处理,交给下一个拦截器处理
当前的请求是:put,不能由‘interceptPost’处理,交给下一个拦截器处理
当前的请求是put,已经被处理
如果这里是其他请求,如XXXsss请求
intercept1.interceptRequest("XXXsss");
打印结果如下:
当前的请求是:XXXsss,不能由‘interceptGet’处理,交给下一个拦截器处理
当前的请求是:XXXsss,不能由‘interceptPost’处理,交给下一个拦截器处理
当前的请求是:XXXsss,不能由‘interceptPut’处理,交给下一个拦截器处理
当前的请求是:XXXsss,不能由‘interceptDelete’处理,交给下一个拦截器处理
如果运行到这里,那应该是出现什么意外:或许您的请求来自月球
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情