责任链模式-升级版

news/2024/11/13 9:48:14/

责任链模式

  • 前言
  • 一、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<>();/***自动加载顺序*/@Autowiredpublic 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 {/*** 第一个检查**/@Overridepublic 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 {@Overridepublic String dealCorrectCypher(String str) {log.debug("----------第二个检查 start----------");log.debug("----------第二个检查 start----------");return str;}}

四、调用

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

总结

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


http://www.ppmy.cn/news/1518873.html

相关文章

深度学习(11)---Swin Transformer详解

文章目录 一、引言二、结构三、Patch Merging操作四、W-MSA详解五、SW-MSA详解 一、引言 1. 在原论文中&#xff0c;首先在开头作者就分析&#xff0c;当前的Transformer从NLP迁移到CV上没有大放异彩主要原因集中在&#xff1a;  (1) 两个领域涉及的规模不同&#xff0c;NLP的…

uniapp实现区域滚动、下拉刷新、上滑滚动加载更多

背景&#xff1a; 在uniapp框架中&#xff0c;有两种实现办法。第1种&#xff0c;是首先在page.json中配置页面&#xff0c;然后使用页面的生命周期函数&#xff1b;第2种&#xff0c;使用<scroll-view>组件&#xff0c;然后配置组件的相关参数&#xff0c;包括但不限于&…

Java面试题:equals和==的区别与联系分别是什么?

1. 运算符 是一个运算符&#xff0c;其用于比较两个变量的内存地址是否相等&#xff1b;对于基本数据类型(int、char、Boolean等)&#xff0c;比较的是它们的值&#xff1b;而对于引用数据类型的话(String、Object、ArrayList等)&#xff0c;比较的是引用&#xff0c;也就是对…

Golang | Leetcode Golang题解之第377题组合总和IV

题目&#xff1a; 题解&#xff1a; func combinationSum4(nums []int, target int) int {dp : make([]int, target1)dp[0] 1for i : 1; i < target; i {for _, num : range nums {if num < i {dp[i] dp[i-num]}}}return dp[target] }

【Kubernetes知识点问答题】第一篇

目录 1.ca-certificates, gnupg, lsb-release 三个包的解释。 2.docker-ce, docker-ce-cli, containerd.io, docker-compose-plugin 作用。 3.K8s 在 1.2 之后就不再支持 docker&#xff0c;请解释对错。 4.举例说明创建容器以及以交互方式访问容器的命令&#xff1f; 1.ca-…

Durid解析SQL语句

在外面的需求中&#xff0c;有很多需要解析SQL语句的地方&#xff0c;我们采用Durid来进行解析。 Durid可以将sql进行详细的拆分成多个部分 解析where解析SQLSelectItem解析update语句解析limit解析group by 还可以动态修改sql&#xff0c;比如在原sql上增加条件修改sql运行的…

libtorch---day03[自定义导数]

参考pytorch。 背景 希望使用勒让德多项式拟合一个周期内的正弦函数。 真值&#xff1a; y s i n ( x ) , x ∈ [ − π , π ] ysin(x),x\in\left[-\pi,\pi\right] ysin(x),x∈[−π,π] torch::Tensor x torch::linspace(-M_PI, M_PI, 2000, torch::kFloat); torch::Ten…

前端配置环境

工具类配置 一、下载Git Bash 下载地址 二、下载google浏览器 下载地址 三、下载微信开发者工具 下载地址 四、下载vscode 下载地址 1、安装中文包 安装中文包 教程 2、安装插件 3、vscode中使用git 教程 4、setting.json 我自己常用的&#xff1a; {"editor.fontSiz…