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/天,具体规则查看活动详情