利用策略模式+模板方法实现项目中运维功能

前段时间项目中有个需求:实现某业务的运维功能,主要是对10张数据库表的增删改查,没有复杂的业务逻辑,只是满足运维人员的基本需要,方便他们快速分析定位问题。这里简单记录分享下实现方案,仅供参考。

一、项目方案

根据不同的表定义各自的Vo,然后继承公共的BaseDataVo。设计接口IDataProcessor和抽象处理类AbstractDataProcessor,这个AbstractDataProcessor定义增删改查模板方法。根据不同策略执行不同的processor,比如NodeProcessorService、NodeAutoProcessorService等。
请添加图片描述

二、代码实现

这里只实现了查询方法,其他增加、删除、修改可以依次实现!

1、定义Vo

BaseDataVo

@Getter
@Setter
public class BaseDataVo implements Serializable {
    private Integer id;
    private String creator;
    private String last_update_by;
    private Date create_time;
    private Date last_update_time;
}

NodeVo

@Getter
@Setter
public class NodeVo extends BaseDataVo{
    String esn;
    String name;
}

2、设计表名及对应服务枚举类TableNameServiceEnum

@Getter
@AllArgsConstructor
public enum TableNameServiceEnum {

    NODE("nodeVo", "nodeProcessorService"),
    NODE_AUTO("nodeAutoVo", "nodeAutoProcessorService");
    private String tableName;
    private String serviceName;
    public static Map<String, String> map = new HashMap<>();

    static {
        Arrays.stream(values()).forEach(v->map.put(v.getTableName(),v.getServiceName()));
    }

    public static String getServiceName(String tableName){
        return map.get(tableName);
    }
}

3、IDataProcessor用于定义AbstractDataProcessor所需的接口

public interface IDataProcessor {
    // 这里只实现了查询方法,其他增加、删除、修改可以依次实现
    List<? extends BaseDataVo> findList(SearchVo searchVo, String tableName);
}

IDataOperationService定义增删改查模板方法

public interface IDataOperationServices {
    List<? extends BaseDataVo> findList(SearchVo searchVo, String tableName);
}

4、抽象处理类及各自业务实现

AbstractDataProcessor

public abstract class AbstractDataProcessor implements IDataProcessor {

    @Override
    public List<? extends BaseDataVo> findList(SearchVo searchVo, String tableName) {
        return findPagedList(searchVo,tableName);
    }

    // 这里定义模板方法,执行具体的processor
    protected abstract List<? extends BaseDataVo> findPagedList(SearchVo searchVo, String tableName);
}

DataOperationService业务处理service层

@Service
public class DataOperationService implements IDataOperationServices {

    @Autowired
    private Map<String, IDataProcessor> dataProcessMap;

    // 这里根据tableName获取执行不同的processor
    @Override
    public List<? extends BaseDataVo> findList(SearchVo searchVo, String tableName) {
        return Optional.ofNullable(tableName)
                .filter(name -> !name.isEmpty())
                .map(this::getDataProcessor)
                .map(processor -> processor.findList(searchVo, tableName))
                .orElse(null);
    }

    // 这里根据tableName获取获取不同的processor
    private IDataProcessor getDataProcessor(String tableName) {
        String serviceName = TableNameServiceEnum.getServiceName(tableName);
        return dataProcessMap.get(serviceName);
    }
}

node_auto业务处理类

@Service
public class NodeAutoProcessorService extends AbstractDataProcessor{
    @Autowired
    private NodeAutoMapper nodeAutoMapper;
    @Override
    protected List<? extends BaseDataVo> findPagedList(SearchVo searchVo, String tableName) {
        QueryWrapper<NodeAutoVo> nodeAutoVoQueryWrapper = new QueryWrapper<>();
        nodeAutoVoQueryWrapper.eq("esn",searchVo.getEsn());
        nodeAutoVoQueryWrapper.eq("name",searchVo.getName());
        return nodeAutoMapper.selectList(nodeAutoVoQueryWrapper);
    }
}

node业务处理类

@Service
public class NodeProcessorService extends AbstractDataProcessor{
    @Autowired
    private NodeMapper nodeMapper;
    @Override
    protected List<? extends BaseDataVo> findPagedList(SearchVo searchVo, String tableName) {
        QueryWrapper<NodeVo> nodeVoQueryWrapper = new QueryWrapper<>();
        nodeVoQueryWrapper.eq("esn",searchVo.getEsn());
        nodeVoQueryWrapper.eq("name",searchVo.getName());
        return nodeMapper.selectList(nodeVoQueryWrapper);
    }
}

5、各自对应Mapper

这里是设置在多数源场景下,使用mysql1配置
NodeMapper

@DS("mysql1")
@Repository("NodeMapper")
public interface NodeMapper extends BaseMapper<NodeVo> {

}

NodeAutoMapper

@DS("mysql1")
@Repository("NodeAutoMapper")
public interface NodeAutoMapper extends BaseMapper<NodeAutoVo> {

}

在这里插入图片描述

6、DataOperationController控制层

@RestController
public class DataOperationController {

    @Autowired
    private DataOperationService dataOperationService;

    @RequestMapping("findList")
    public List<? extends BaseDataVo> findList(@RequestBody SearchVo searchVo, @RequestParam String tableName) {
        return dataOperationService.findList(searchVo, tableName);
    }
}

三、测试方案

1、根据不同的tableName,查询结果有区别

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、项目结构及源码地址

在这里插入图片描述
源码下载:点我下载 欢迎Star

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/592683.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习Rust的第27天:Rust中的pwd

过去几天我们一直在重新创建 GNU 核心实用程序的基本功能&#xff0c;而今天&#xff0c;我们将做一些有点太简单的事情&#xff0c; pwd 这个实用程序是用于打印Linux终端中的工作目录。 Understanding the utility 了解实用程序 Running the pwd command, we get an output l…

SpringBoot使用AOP注解记录操作日志

一、前言 日志&#xff1a;指系统所指定对象的某些操作和其操作结果按时间有序的集合。 操作日志&#xff1a;主要是对某个对象进行新增操作或者修改操作后记录下这个新增或者修改&#xff0c;操作日志要求可读性比较强。比如张三在某个时间下了订单买了某个商品&#xff01; …

linux实验(数据库备份)

以下所有操作皆以机房电脑上的虚拟机为基础环境 下载链接&#xff1a;Linux课程机房虚拟机# 切换到root用户 su - root安装数据库mysql 5.7 rpm -ivh https://mirrors4.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64/mysql-community-common-5.7.29-1.el7.x…

Llama改进之——SwiGLU激活函数

引言 今天介绍LLAMA模型引入的关于激活函数的改进——SwiGLU1&#xff0c;该激活函数取得了不错的效果&#xff0c;得到了广泛地应用。 SwiGLU是GLU的一种变体&#xff0c;其中包含了GLU和Swish激活函数。 GLU GLU(Gated Linear Units,门控线性单元)2引入了两个不同的线性层…

Linux(openEuler、CentOS8)常用的IP修改方式(文本配置工具nmtui+配置文件+nmcli命令)

----本实验环境为openEuler系统<以server方式安装>&#xff08;CentOS类似&#xff0c;可参考本文&#xff09;---- 一、知识点 &#xff08;一&#xff09;文本配置工具nmtui(openEuler已预装) nmtui&#xff08;NetworkManager Text User Interface&#xff09;是一…

ZooKeeper以及DolphinScheduler的用法

目录 一、ZooKeeper的介绍 数据模型 ​编辑 操作使用 ①登录客户端 ​编辑 ②可以查看下面节点有哪些 ③创建新的节点&#xff0c;并指定数据 ④查看节点内的数据 ⑤、删除节点及数据 特殊点&#xff1a; 运行机制&#xff1a; 二、DolphinScheduler的介绍 架构&#…

计算机毕业设计Python+Spark知识图谱高考志愿推荐系统 高考数据分析 高考可视化 高考大数据 大数据毕业设计

毕业设计&#xff08;论文&#xff09;任务书 毕业设计&#xff08;论文&#xff09;题目&#xff1a; 基于大数据的高考志愿推荐系统 设计&#xff08;论文&#xff09;的主要内容与要求&#xff1a; 主要内容&#xff1a; 高…

贝叶斯回归

1. 贝叶斯推断的定义 简单来说&#xff0c;贝叶斯推断 (Bayesian inference) 就是结合“经验 (先验)”和“实践 (样本)”&#xff0c;得出“结论 (后 验)”。 2. 什么是先验&#xff1f; 贝叶斯推断把模型参数看作随机变量。在得到样本之前&#xff0c;根据主观经验和既有知…

巧记英语单词

页面 在输入框中填写英语单词的谐音 这样的话就进行了一次英语单词的记忆练习。 页面代码 <% layout(/layouts/default.html, {title: 英语单词管理, libs: [dataGrid]}){ %> <div class"main-content"><div class"box box-main">&l…

anaconda、cuda、tensorflow、pycharm环境安装

anaconda、cuda、tensorflow、pycharm环境安装 anaconda安装 anaconda官方下载地址 本文使用的是基于python3.9的anaconda 接下来跟着步骤安装&#xff1a; 检验conda是否成功安装 安装CUDA和cuDNN 提醒&#xff0c;CUDA和cuDNN两者必须版本对应&#xff0c;否者将会出错…

my-room-in-3d中的电脑,电视,桌面光带发光原理

1. my-room-in-3d中的电脑&#xff0c;电视&#xff0c;桌面光带发光原理 最近在github中&#xff0c;看到了这样的一个项目&#xff1b; 项目地址 我看到的时候&#xff0c;蛮好奇他这个光带时怎么做的。 最后发现&#xff0c;他是通过&#xff0c;加载一个 lightMap.jpg这个…

大型语言模型的新挑战:AMR语义表示的神秘力量

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 引言&#xff1a;AMR在大型语言模型中的作用 在自然语言处理&#xff08;NLP&#xff09;的领域中&#xff0c;抽象意义表示&…

查找算法与排序算法

查找算法 二分查找 (要求熟练) // C// 二分查找法&#xff08;递归实现&#xff09; int binarySearch(int *nums, int target, int left, int right) // left代表左边界&#xff0c;right代表右边界 {if (left > right) return -1; // 如果左边大于右边&#xff0c;那么…

esp8266与uno使用软串口通信

esp8266的d6和d5分别与uno的5和6管脚连接&#xff1a; uno程序&#xff1a; //uno #include <SoftwareSerial.h> SoftwareSerial s(5,6);//(RX,TX)void setup(){s.begin(9600);Serial.begin(9600); }void loop(){int data50;if (s.available() > 0) {char c s.read(…

【错题集-编程题】比那名居的桃子(滑动窗口 / 前缀和)

牛客对应题目链接&#xff1a;比那名居的桃子 (nowcoder.com) 一、分析题目 1、滑动窗口 由题意得&#xff0c;我们是要枚举所有大小为 k 的子数组&#xff0c;并且求出这段⼦数组中快乐值和羞耻度之和。因此&#xff0c;可以利用滑动窗口的思想&#xff0c;用两个变量维护大小…

【区块链】共识算法简介

共识算法简介 区块链三要素&#xff1a; 去中心化共识算法智能合约 共识算法作为区块链三大核心技术之一&#xff0c;其重要性不言而喻。今天就来简单介绍共识算法的基本知识。 最简单的解释&#xff0c;共识算法就是要让所有节点达成共识&#xff0c;保证少数服从多数&#x…

从零开始学AI绘画,万字Stable Diffusion终极教程(六)

【第6期】知识补充 欢迎来到SD的终极教程&#xff0c;这是我们的第六节课&#xff0c;也是最后一节课 这套课程分为六节课&#xff0c;会系统性的介绍sd的全部功能&#xff0c;让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 …

初识C语言——第九天

ASCII定义 在 C 语言中&#xff0c;每个字符都对应一个 ASCII 码。ASCII 码是一个字符集&#xff0c;它定义了许多常用的字符对应的数字编码。这些编码可以表示为整数&#xff0c;也可以表示为字符类型。在 C 语言中&#xff0c;字符类型被定义为一个整数类型&#xff0c;它占…

C/C++开发,opencv-ml库学习,K近邻(KNN)应用

目录 一、k近邻算法 1.1 算法简介 1.2 opencv-k近邻算法 二、cv::ml::KNearest应用 2.1 数据集样本准备 2.2 KNearest应用 2.3 程序编译 2.4 main.cpp全代码 一、k近邻算法 1.1 算法简介 K近邻算法&#xff08;K-Nearest Neighbor&#xff0c;KNN&#xff09;基本原理是…

Vue按照顺序实现多级弹窗(附Demo)

目录 前言1. 单个弹窗2. 多级弹窗 前言 强化各个知识点&#xff0c;以实战融合&#xff0c;以下两个Demo从实战提取 1. 单个弹窗 部署按钮框以及确定的方法即可 截图如下所示&#xff1a; 以下Demo整体逻辑如下&#xff1a; 点击“生成周月计划”按钮会触发showWeekPlanDia…
最新文章