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

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

一、项目方案

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

二、代码实现

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

1、定义Vo

BaseDataVo

java 复制代码
@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

java 复制代码
@Getter
@Setter
public class NodeVo extends BaseDataVo{
    String esn;
    String name;
}

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

java 复制代码
@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所需的接口

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

IDataOperationService定义增删改查模板方法

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

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

AbstractDataProcessor

java 复制代码
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层

java 复制代码
@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业务处理类

java 复制代码
@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业务处理类

java 复制代码
@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

java 复制代码
@DS("mysql1")
@Repository("NodeMapper")
public interface NodeMapper extends BaseMapper<NodeVo> {

}

NodeAutoMapper

java 复制代码
@DS("mysql1")
@Repository("NodeAutoMapper")
public interface NodeAutoMapper extends BaseMapper<NodeAutoVo> {

}

6、DataOperationController控制层

java 复制代码
@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

相关推荐
智慧城市20304 小时前
183页PPT,麦肯锡战略屋品牌屋营销模型:打通战略、品牌与供应链的落地闭环
策略模式·战略咨询·流程管理
智慧城市20306 小时前
556页集团供应链、营销案例,从断裂到贯通:构建生产供应链、财务成本与营销数字化的四步战略落地闭环
策略模式
意法半导体STM3218 天前
【官方原创】如何为STM32CubeMX2配置Visual Studio Code配置方案
vscode·stm32·单片机·嵌入式硬件·策略模式·stm32cubemx·嵌入式开发
山东点狮信息科技有限公司19 天前
企业级 MES 制造执行系统架构设计与实践
spring cloud·性能优化·系统架构·策略模式·点狮
zzqssliu19 天前
基于策略模式与责任链的代购商品多源采集架构实战
架构·策略模式
mxpan20 天前
macOS 13+ 上使用 macFUSE + NTFS-3G 读写 NTFS 移动硬盘技术说明
macos·策略模式
折哥的程序人生 · 物流技术专研20 天前
Java 23 种设计模式:从踩坑到精通 | 番外:编排器+策略模式在多平台电子面单中的实战(含性能压测)
设计模式·策略模式·代码重构·java设计模式·编排器·电子面单·从踩坑到精通
忧云21 天前
2026年最新 Cursor 国内使用 DeepSeek API等各模型使用完整教程
ai编程·策略模式·cursor·byok·cursor使用国内大模型
AIex-YH21 天前
三域贯通11/12:生物制造的“死亡之谷“,CDMO 是桥还是船?
运维·制造·策略模式
回忆2012初秋22 天前
【Nginx】原理、配置与运维实战(2)
运维·nginx·策略模式