当前位置: 首页 > article >正文

责任链模式-升级版

责任链模式

  • 前言
  • 一、CypherCorrectionHandler 提供入口
  • 二、AbstractCorrectionHandler 抽象类
  • 三、check 实现类
    • 第一个检查
    • 第二个检查
  • 四、调用
  • 总结


前言

就是记录下,方便自己工作用。
含责任链顺序加载,以及抽象调度链路。

一、CypherCorrectionHandler 提供入口

import com.wonders.cube.sdk.graph.constant.NumberConstant;
import com.wonders.cube.sdk.graph.handler.correctcypher.impl.AbstractCorrectionHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 数据纠错链管理类
 *
 * @author lobster.long
 */
@Slf4j
@Component
public class CypherCorrectionHandler {

    // 责任链中的处理器优先级排序集合
    private List<Integer> orders = new ArrayList<>();
    // 责任链的处理类集合
    private final Map<Integer, AbstractCorrectionHandler> handlerList = new LinkedHashMap<>();
	
	/**
	*自动加载顺序
	*/
    @Autowired
    public CypherCorrectionHandler(ApplicationContext applicationContext) {
        Map<String, AbstractCorrectionHandler> beansOfType = applicationContext.getBeansOfType(AbstractCorrectionHandler.class);
        beansOfType.values().forEach(x -> {
            Class<? extends AbstractCorrectionHandler> aClass = x.getClass();
            int order = aClass.getAnnotation(Order.class).value();
            try {
                handlerList.put(order, aClass.newInstance());
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        orders = handlerList.keySet().stream().sorted().collect(Collectors.toList());
        // 指定处理器的下一个处理器实例
        handlerList.forEach((k, v) -> {
            int size = orders.size() - 1;
            int index = orders.indexOf(k);
            if (size > index) {
                v.setNextHandler(handlerList.get(orders.get(index + 1)));
            }
        });
    }
	
	/**
	* 入口方法
	*/
    public String correctCypher(String cypher, String communityCode) {
        return handlerList.get(NumberConstant.ONE).correctCypher(cypher, communityCode);
    }

}

二、AbstractCorrectionHandler 抽象类

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;

/**
 * 数据纠错处理器
 */
@Slf4j
public abstract class AbstractCorrectionHandler {

    private AbstractCorrectionHandler handler;

    public void setNextHandler(AbstractCorrectionHandler handler) {
        this.handler = handler;
    }

    /**
     * 抽象方法,不同的检查
     * @param str 需要进行check的参数,可以是字符串、也可以是对象
     */
    public abstract String dealCheck(String str);

    public String check(String str) {
        String result = str;
        try {
            result = dealCheck(result, communityCode);
            if (ObjectUtils.isNotEmpty(this.handler)) {
                result = this.handler.check(result);
            }
        } catch (Exception e) {
            log.error("责任链异常,直接退出", e);
        }
        return result;
    }

}

三、check 实现类

第一个检查

import com.wonders.cube.sdk.graph.constant.NumberConstant;
import com.wonders.cube.sdk.graph.constant.RegexConstant;
import com.wonders.cube.sdk.graph.constant.StringConstant;
import com.wonders.cube.sdk.graph.enums.GraphRelationEnum;
import com.wonders.cube.sdk.graph.utils.RegexUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 修正边
 *
 * @author lobster.long
 */
@Order(1)
@Slf4j
@Service
public class CorrectDirectHandler extends AbstractCorrectionHandler {
    /**
     * 第一个检查
     *
     */
    @Override
    public String dealCorrectCypher(String str) {
        log.debug("----------第一个检查 start----------");
        log.debug("----------第一个检查 end----------");
        return str;
    }
  }

第二个检查

import com.wonders.cube.sdk.graph.constant.RegexConstant;
import com.wonders.cube.sdk.graph.utils.RegexUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;

/**
 * @author lobster.long
 */
@Slf4j
@Order(2)
@Service
public class CorrectLabelHandler extends AbstractCorrectionHandler {

    @Override
    public String dealCorrectCypher(String str) {
        log.debug("----------第二个检查 start----------");
       
        log.debug("----------第二个检查 start----------");
        return str;
    }

}

四、调用

   @Resource
   private CypherCorrectionHandler cypherCorrectionHandler;
   
  //调用责任链
   str= cypherCorrectionHandler.correctCypher(str);

总结

重点在CypherCorrectionHandler和AbstractCorrectionHandler这两个类。剩下的实现类反而是最简单的。


http://www.kler.cn/a/282100.html

相关文章:

  • 【论文阅读】主动推理:作为感知行为的理论
  • 第二十一周学习周报
  • 关于 Oracle Database Express Edition 的功能和安装
  • Java基础-Java中的常用类(上)
  • torch.stack 张量维度的变化
  • 【c++笔试强训】(第十一篇)
  • python办公自动化:使用`Python-PPTX`进行文本框和段落操作
  • Python统计FreeMind测试用例数量
  • 【办公类-54-03】20240828班级点名册模版(双休国定假涂成灰色)
  • 网络层 I(网络层的功能)【★★★★★★】
  • wpf prism 《1》、区域 、模块化
  • 2024 年顶级 Flutter UI 框架和库
  • JAVA基础之二-面向对象简述
  • UE5学习笔记16-游戏模式中的一些事件,如何改变网格体和摄像头的碰撞
  • MosaicML-面向生成式AI的机器学习平台
  • 仅利用一维数组实现等值线图效果(附完整代码)
  • TeamTalk消息服务器学习
  • Nuxt3入门:介绍、项目安装和了解视图(第一节)
  • 【Android】Glide模块工作原理
  • 2024最全网络安全工程师面试题(附答案),金九银十找工作必看!
  • CARLA Drone: 首个实现从不同空中视角进行单目3D目标检测,并提供数据集
  • 保证MQ的高可用性:RabbitMQ为例
  • 后端开发刷题 | 面试篇4
  • 合合信息acge模型获C-MTEB第一,文本向量化迎来新突破
  • Git 的基本使用
  • 【js】箭头函数和普通函数在this指向的区别