java 23种设计模式之行为型模式—责任链模式(17)

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