责任链模式(Chain of Responsibility Pattern)
责任链模式:避免请求发送者与接收者耦合在一起,将多个对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
应用场景
- ERP系统 审批流程 流程审批 总经理、人事经理、项目经理
- 网关控制 Api接口限流、黑名单、用户会话、参数过滤、session过滤等
- 风控系统 失信名单 信用卡是否逾期 蚂蚁信用积分等
- 多条件流程判断,权限控制
- java过滤器
责任链模式优缺点
优点:
a、请求者和接受者松散耦合,请求者不关心接受者里面具体的执行流程
b、动态组合职责,灵活的分配职责对象,也可以灵活的添加改变对象职责
缺点:
a、产生很多细粒度的对象:因为功能处理都分散到了单独的职责对象中,每个对象功能单一,要把整个流程处理完,需要很多的职责对象,会产生大量的细粒度职责对象。
a、不一定能处理:需要提供默认处理,并且注意构造链的有效性。
责任链模式实现方式核心代码
public abstract class GatewayHandler {
protected GatewayHandler nextGatewayHandler;
public abstract void service();
public void setHandler(GatewayHandler gatewayHandler) {
this.nextGatewayHandler = gatewayHandler;
}
protected void nextService(){
if(nextGatewayHandler!=null){
nextGatewayHandler.service();;
}
}
}
@Component
public class BlacklistHandler extends GatewayHandler {
@Override
public void service() {
System.out.println("黑名单拦截判断....");
nextService();
}
}
// 启动代码
gatewayHandlerService.getDbFirstGatewayHandler().service();
1)、基于工厂模式
public static GatewayHandler getFirstGatewayHandler() {
GatewayHandler gatewayHandler1 = new CurrentLimitHandler();
GatewayHandler gatewayHandler2 = new BlacklistHandler();
gatewayHandler1.setHandler(gatewayHandler2);
GatewayHandler gatewayHandler3 = new ConversationHandler();
gatewayHandler2.setHandler(gatewayHandler3);
return gatewayHandler1;
}
2)、基于数据库模式
public GatewayHandler getDbFirstGatewayHandler() {
// 1.查询数据库第一个handler配置
GatewayHandlerEntity firstGatewayHandlerEntity = gatewayHandlerMapper.getFirstGatewayHandler();
String firstBeanHandlerId = firstGatewayHandlerEntity.getHandlerId();
// 2.从SpringBoot容器获取第一个handler对象
GatewayHandler firstGatewayHandler = SpringUtils.getBean(firstBeanHandlerId, GatewayHandler.class);
// 3. 获取下一个handlerBeanId
String nextBeanHandlerId = firstGatewayHandlerEntity.getNextHandlerId();
// 定义临时循环遍历指针
GatewayHandler tempNextGatewayHandler = firstGatewayHandler;
while (!StringUtils.isEmpty(nextBeanHandlerId)) {
// 4.从SpringBoot容器获取下一个handler对象
GatewayHandler nextGatewayHandler = SpringUtils.getBean(nextBeanHandlerId, GatewayHandler.class);
// 5.从数据库查询该hanlder信息
GatewayHandlerEntity nextGatewayHandlerEntity = gatewayHandlerMapper.getByHandler(nextBeanHandlerId);
// 6.设置下一个white循环遍历hanlderid
nextBeanHandlerId = nextGatewayHandlerEntity.getNextHandlerId();
tempNextGatewayHandler.setHandler(nextGatewayHandler);
tempNextGatewayHandler = nextGatewayHandler;
}
this.firstGatewayHandler = firstGatewayHandler;
return firstGatewayHandler;
}
相关文章链接:
<<<23中常用设计模式总览
<<<代理模式(Proxy Pattern)
<<<装饰模式(Decorator Pattern)
<<<观察者模式(Observer Pattern)
<<<单例模式(Singleton Pattern)
<<<责任链模式(Chain of Responsibility Pattern)
<<<策略模式(Strategy Pattern)
<<<模板方法模式(Template Pattern)
<<<外观/门面模式(Facade Pattern)
<<<建造者模式(Builder Pattern)
<<<适配器模式(Adapter Pattern)
<<<原型模式(Prototype Pattern)
<<<工厂相关模式(Factory Pattern)