设计模式-责任链模式(Chain of Responsibility Pattern)

上一篇 <<<创建对象的方式汇总
下一篇 >>>策略模式(Strategy Pattern)


责任链模式:避免请求发送者与接收者耦合在一起,将多个对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

设计模式-责任链模式(Chain of Responsibility Pattern)_第1张图片

应用场景

  • ERP系统 审批流程 流程审批 总经理、人事经理、项目经理
  • 网关控制 Api接口限流、黑名单、用户会话、参数过滤、session过滤等
  • 风控系统 失信名单 信用卡是否逾期 蚂蚁信用积分等
  • 多条件流程判断,权限控制
  • java过滤器


    设计模式-责任链模式(Chain of Responsibility Pattern)_第2张图片

责任链模式优缺点

优点:
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)
<<<策略模式(Strategy Pattern)
<<<模板方法模式(Template Pattern)
<<<外观/门面模式(Facade Pattern)
<<<建造者模式(Builder Pattern)
<<<适配器模式(Adapter Pattern)
<<<原型模式(Prototype Pattern)
<<<工厂相关模式(Factory Pattern)

你可能感兴趣的:(设计模式-责任链模式(Chain of Responsibility Pattern))