1.模式定义:
为请求创建了一个接收者对象的链。
如请求频率、登录认证、授权认证、敏感词过滤等操作,就跟gateway网关登录授权过滤判断一样。
class Request{ //这里简单做数据模拟
public boolean isLogin; //是否登录了
public boolean isFrequentOk; //是否符合调用频率
public boolean isToken; //token认证
public Request(boolean isLogin,boolean isFrequentOk,boolean isToken){
this.isLogin = isLogin;
this.isFrequentOk = isFrequentOk;
this.isToken = isToken;
}
}
abstract class Handler{
public Handler next;
public Handler(Handler next) {
this.next = next;
}
abstract boolean process(Request request);
}
class RequestFrequentHandler extends Handler{
public RequestFrequentHandler(Handler next) {
super(next);
}
@Override
boolean process(Request request) {
System.out.println("进行访问频率控制");
if(request.isFrequentOk){
if(next == null){
return true;
}
if(!next.process(request)){
return false;
}
else{
return true;
}
}
return false;
}
}
class LoginHandler extends Handler{
public LoginHandler(Handler next) {
super(next);
}
@Override
boolean process(Request request) {
System.out.println("进行登录判断");
if(request.isLogin){
if(next == null){
return true;
}
if(!next.process(request)){
return false;
}
else{
return true;
}
}
return false;
}
}
class TokenHandler extends Handler{
public TokenHandler(Handler next) {
super(next);
}
@Override
boolean process(Request request) {
System.out.println("进行token认证");
if(request.isToken){
if(next == null){
return true;
}
if(!next.process(request)){
return false;
}
else{
return true;
}
}
return false;
}
}
public class ChainOfResponsibility {
public static void main(String[] args) {
Request request = new Request(true, true, true);
RequestFrequentHandler requestFrequentHandler = new RequestFrequentHandler(new LoginHandler(new TokenHandler(null)));
if(requestFrequentHandler.process(request)){
System.out.println("访问正常");
}else{
System.out.println("访问异常");
}
}
}
2.应用场景:
一个请求的处理需要多个对象当中的一个或几个协作处理。
优点:
1.请求的发送者和接受者解耦
2.可以控制执行顺序
3.符合开闭原则和单一职责原则
3.经典案例
1javax.servlet.Filter2javax.servlet.FilterChain