目录
- 定义
- 使用场景
- 代码示例
- 结尾
定义
在对某个对象进行多步骤处理的时候,保持其的处理步骤的扩展性,这是个人对这个设计模式的理解
使用场景
对于请求信息与响应信息的处理,以及对于一些对象啊或者文本有敏感词汇需要处理的时候可以使用。
代码示例
首先定义一个对象,这个对象可以是任意的类型,只要他需要经过多步骤的处理都可以使用这个设计模式来确保他的后续处理具有扩展性。
class Text{ String t; public String getT() { return t; } public void setT(String t) { this.t = t; } }
定义一个责任环的接口 ,每一环调用doFilter对对象进行处理
interface Filter{ //处理逻辑的方法 Boolean doFilter(Text text); }
定义几个责任环的实现,doFilter是对对象的业务处理,这里就不写业务了
class F1 implements Filter{ //这里的返回值可以经过业务判断来决定返回的是true还是false,这个返回值决定着是否继续往下一环执行 //这里暂定是第一环节就返回false不执行第二环了 @Override public Boolean doFilter(Text text) { text.setT(text.getT() + "F1 处理结束"); return true; } } class F2 implements Filter{ @Override public Boolean doFilter(Text text) { text.setT(text.getT() + "F2 处理结束"); return true; } } class F3 implements Filter{ @Override public Boolean doFilter(Text text) { text.setT(text.getT() + "F3 处理结束"); return false; } } class F4 implements Filter{ @Override public Boolean doFilter(Text text) { text.setT(text.getT() + "F4 处理结束"); return true; } }
上面有了责任环,那我们需要将每一环扣起来形成一个链子,这时候需要一个定义一个责任链
//这里责任链的接口为什么要实现责任环的接口呢?,为了方便多条条责任链可以相互连接 class FilterChain implements Filter{ //这个集合就是责任链本链了 Listfilters = new ArrayList<>(); //编程小技巧,返回本身可以实现链式编程。 public FilterChain add(Filter filter){ filters.add(filter); return this; } @Override public Boolean doFilter(Text text) { for (Filter filter : filters){ //这里是关键,判断责任链是否继续执行下一环,如果当前环返回false就不执行下一环了。 if (!filter.doFilter(text)) return false; } return true; } }
main方法中执行一下
public static void main(String[] args) { Text text = new Text(); text.setT("这是一条文本"); //责任链A FilterChain filterChainA = new FilterChain(); filterChainA.add(new F1()).add(new F2()); // 责任链B FilterChain filterChainB = new FilterChain(); filterChainB.add(new F3()).add(new F4()); //连接前执行 filterChainA.doFilter(text); System.out.println(text.getT()); text.setT(text.getT() + "|"); System.out.println("_________________________________________"); //责任链A连接责任链B filterChainA.add(filterChainB); //连接后执行,这里注意,F3返回的是false 所以F4不会执行 filterChainA.doFilter(text); System.out.println(text.getT()); }
下面是执行结果
是不是觉得到这就结束了?no no no,这只是基础的应用,还有升级版的,下面就是升级版的,也是我们在日常编程中对request和response的处理要用到的东西,service的FilterChain方法 下面模拟一下。
首先先模拟定义一下我们的request和response这里就简单一点了。直接用字符串代替了
class Response{ String response; public String getResponse() { return response; } public void setResponse(String response) { this.response = response; } } class Request{ String request; public String getRequest() { return request; } public void setRequest(String request) { this.request = request; } }
然后是我们收悉的责任环的接口
interface Filter{ //这里需要对请求和响应的消息都进行处理,并且要求处理的顺序是相反的。 //request 进来处理步骤是1、2、3,response 出去处理步骤是3、2、1 //所以要把我们的FilterChain 带到参数里,这里有点类似与递归的套娃感觉 void doFilter(Request request ,Response response , FilterChain chain ); }
然后是我们的责任链
class FilterChain{ Listfilters = new ArrayList<>(); //这里定义的下标用于定位我们当前的环数,这里注意了使用了下标的方式就不可以责任链连接责任链了 //因为add进来的责任链只是集合中的一个元素,不管你的责任链多长,都只占一个元素。 //会导致你的责任链连接后执行的是责任链A本身的长度加上你连接的责任链条数的下标数的处理结果 Integer index = 0; public FilterChain add(Filter filter){ filters.add(filter); return this; } public void doFilter(Request request ,Response response, FilterChain chain) { if (index == filters.size()) return; Filter f = filters.get(index); index++; f.doFilter(request,response,chain); } }
重点来了,为什么可以实现他 request 进来处理步骤是1、2、3,response 出去处理步骤是3、2、1
class FilterChainOne implements Filter{ @Override public void doFilter(Request request, Response response, FilterChain chain) { request.setRequest(request.getRequest() + "FilterChainOne 处理结束"); //当前是 request执行完了,去执行我们的下一环 chain.doFilter(request , response , chain); //只有全部的责任环都执行完才会到这里,有点类似递归 response.setResponse(response.getResponse() + "FilterChainOne 处理结束"); } } class FilterChainTwo implements Filter{ @Override public void doFilter(Request request, Response response, FilterChain chain) { request.setRequest(request.getRequest() + "FilterChainTwo 处理结束"); chain.doFilter(request , response , chain); response.setResponse(response.getResponse() + "FilterChainTwo 处理结束"); } }
main方法执行是一样的。
public static void main(String[] args) { Request request = new Request(); request.setRequest("这是一个request"); Response response = new Response(); response.setResponse("这是一个response"); //责任链 FilterChain filterChain = new FilterChain(); filterChain.add(new FilterChainOne()).add(new FilterChainTwo()); //执行 filterChain.doFilter(request,response,filterChain); System.out.println(request.getRequest()); System.out.println(response.getResponse()); }
结果展示
结尾
感谢大家的耐心阅读,如有建议请私信或评论留言。
如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步
如有不足之处请批评指正。