责任链模式 :
使多个对象都有机会处理请求,将这些对象连成一条链,并沿着这条链传递请求,直到有一个符合条件的对象处理它为止。
案例流程:
网关有很多功能: API接口限流, 黑名单拦截, 权限验证, 参数过滤等. 下面我们就通过责任链设计模式来实现网关权限控制,可以看到定义了一个抽象的网关处理器. 然后有4个子处理器的实现类
/**
* 定义抽象的网关处理器类
*/
public abstract class AbstractGatewayHandler {
/**
* 定义下一个网关处理器
*/
protected AbstractGatewayHandler nextGatewayHandler;
public void setNextGatewayHandler(AbstractGatewayHandler nextGatewayHandler) {
this.nextGatewayHandler = nextGatewayHandler;
}
/**
* 抽象网关执行的服务
* @param url
*/
public abstract void service(String url);
}
/**
* API接口限流处理器
*/
public class APILimitGatewayHandler extends AbstractGatewayHandler {
@Override
public void service(String url) {
System.out.println("api接口限流处理, 处理完成");
// 实现具体的限流服务流程
if (this.nextGatewayHandler != null) {
this.nextGatewayHandler.service(url);
}
}
}
/**
* 黑名单处理器
*/
public class BlankListGatewayHandler extends AbstractGatewayHandler {
@Override
public void service(String url) {
System.out.println("黑名单处理, 处理完成");
// 实现具体的限流服务流程
if (this.nextGatewayHandler != null) {
this.nextGatewayHandler.service(url);
}
}
}
/**
* 权限验证处理器
*/
public class PermissionValidationGatewayHandler extends AbstractGatewayHandler {
@Override
public void service(String url) {
System.out.println("权限验证处理, 处理完成");
// 实现具体的限流服务流程
if (this.nextGatewayHandler != null) {
this.nextGatewayHandler.service(url);
}
}
}
/**
* 参数校验处理器
*/
public class ParameterVerificationGatewayHandler extends AbstractGatewayHandler {
@Override
public void service(String url) {
System.out.println("参数校验处理, 处理完成");
// 实现具体的限流服务流程
if (this.nextGatewayHandler != null) {
this.nextGatewayHandler.service(url);
}
}
}
/**
* 网关客户端
*/
public class GatewayClient {
public static void main(String[] args) {
APILimitGatewayHandler apiLimitGatewayHandler = new APILimitGatewayHandler();
BlankListGatewayHandler blankListGatewayHandler = new BlankListGatewayHandler();
ParameterVerificationGatewayHandler parameterVerificationGatewayHandler = new ParameterVerificationGatewayHandler();
PermissionValidationGatewayHandler permissionValidationGatewayHandler = new PermissionValidationGatewayHandler();
apiLimitGatewayHandler.setNextGatewayHandler(blankListGatewayHandler);
blankListGatewayHandler.setNextGatewayHandler(parameterVerificationGatewayHandler);
parameterVerificationGatewayHandler.setNextGatewayHandler(permissionValidationGatewayHandler);
apiLimitGatewayHandler.service("http://www.baidu.com");
}
}
//运行结果:
api接口限流处理, 处理完成
黑名单处理, 处理完成
参数校验处理, 处理完成
权限验证处理, 处理完成
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
//也可以对最后的执行阶段用工厂优化一下:
/**
* 网关处理器工厂
*/
public class GatewayHandlerFactory {
public static AbstractGatewayHandler getFirstGatewayHandler() {
APILimitGatewayHandler apiLimitGatewayHandler = new APILimitGatewayHandler();
BlankListGatewayHandler blankListGatewayHandler = new BlankListGatewayHandler();
ParameterVerificationGatewayHandler parameterVerificationGatewayHandler = new ParameterVerificationGatewayHandler();
PermissionValidationGatewayHandler permissionValidationGatewayHandler = new PermissionValidationGatewayHandler();
apiLimitGatewayHandler.setNextGatewayHandler(blankListGatewayHandler);
blankListGatewayHandler.setNextGatewayHandler(parameterVerificationGatewayHandler);
parameterVerificationGatewayHandler.setNextGatewayHandler(permissionValidationGatewayHandler);
return apiLimitGatewayHandler;
}
}
/**
* 网关客户端
*/
public class GatewayClient {
public static void main(String[] args) {
GatewayHandlerFactory.getFirstGatewayHandler().service("http://www.baidu.com");
}
}
五. 责任链模式总结
- 定义一个抽象的父类, 在抽象的父类中定义请求处理的方法 和 下一个处理者.
- 然后子类处理器继承分类处理器, 并实现自己的请求处理方法
- 设置处理请求链, 可以采用工厂设计模式抽象, 请求者只需要知道整个链条的第一环