Spring Boot 中利用模板方法模式处理数据的深度剖析

Spring Boot 中利用模板方法模式处理数据的深度剖析

编码文章call10242025-02-17 11:15:049A+A-

Spring Boot 中利用模板方法模式处理数据的深度剖析

在 Spring Boot 的开发世界里,高效且优雅地处理各类数据是我们常常面临的挑战。当数据来源复杂多样,尤其是要应对不同上游系统发送的数据时,模板方法模式宛如一把利剑,助我们披荆斩棘,打造出简洁、可维护且扩展性强的代码架构。

一、模板方法模式初印象

模板方法模式核心在于定义一个操作的算法骨架,它把一些固定不变、通用的流程步骤固定在抽象基类中,像是数据处理前的准备工作、处理后的收尾事宜,而将那些因具体业务场景(在这里就是不同上游系统)而异的关键数据处理步骤推迟到子类去实现。这就好比一家连锁餐厅,总部制定了统一的点餐、上菜、结账流程框架,但不同地区分店可以根据当地口味特色定制菜品制作环节。

二、Spring Boot 项目中的实战应用

(一)搭建抽象基类 - 数据处理的 “总指挥”

首先,创建一个抽象的基类,它将掌控整个数据处理流程的节奏:

public abstract class AbstractDataHandler {

// 这就是我们的模板方法,定义了“数据处理”这场演出的“剧本”,规定了主要流程

public final void handleData(Map data) {

if (preValidate(data)) {

logStart(data);

doCoreProcessing(data);

postProcess(data);

logCompletion(data);

} else {

handleValidationFailure(data);

}

}

// 抽象方法,是留给“演员”(子类)发挥的空间,实现具体的数据验证规则

protected abstract boolean preValidate(Map data);

// 核心抽象方法,子类在此处尽情展现独特的数据处理“才艺”

protected abstract void doCoreProcessing(Map data);

private void logStart(Map data) {

System.out.println("数据处理启动,来源:" + data.get("source"));

}

private void postProcess(Map data) {

// 这里可以进行一些通用的后置处理,比如数据格式标准化,让数据以更完美的姿态谢幕

data.put("formattedData", formatData(data.get("processedData")));

}

private void logCompletion(Map data) {

System.out.println("数据处理圆满结束,结果:" + data.get("processedStatus"));

}

private String formatData(Object processedData) {

if (processedData instanceof String) {

return ((String) processedData).toUpperCase();

}

return processedData.toString();

}

protected void handleValidationFailure(Map data) {

// 处理验证不通过的情况,如记录错误日志,通知上游等,避免演出“砸场”

System.out.println("数据验证失败:" + data);

}

}

(二)子类定制 - 适配不同上游系统

假设我们有上游系统 X,它发送的数据总是需要进行加密处理,这就好比 X 地区分店有独特的招牌菜制作工艺:

@Component

public class UpstreamXDataHandler extends AbstractDataHandler {

@Override

protected boolean preValidate(Map data) {

return data.containsKey("securityKey");

}

@Override

protected void doCoreProcessing(Map data) {

String rawData = (String) data.get("rawData");

data.put("processedData", encryptData(rawData));

data.put("processedStatus", "success");

}

private String encryptData(String rawData) {

// 简单模拟加密算法,实际应用中使用专业加密库,这是 X 地区的“秘制配方”

return rawData + "encrypted";

}

}

再看上游系统 Y,它的数据侧重于统计分析,如同 Y 地区分店专注于另一道特色菜品:

@Component

public class UpstreamYDataHandler extends AbstractDataHandler {

@Override

protected boolean preValidate(Map data) {

return data.size() > 3;

}

@Override

protected void doCoreProcessing(Map data) {

List values = new ArrayList<>(data.values());

int sum = values.stream().mapToInt(o -> {

if (o instanceof Integer) return (Integer) o;

return 0;

}).sum();

data.put("processedData", "总和为:" + sum);

// 标记数据处理成功,顺利“上菜”

data.put("processedStatus", "success");

}

}

(三)在业务代码中整合运用

@Resource和@Autowired(构造函数注入本质上与@Autowired类似,只是写法不同)都是 Spring 用来实现依赖注入的注解,只不过它们有些细微差别。@Resource默认是按照名称进行注入,如果找不到与名称匹配的 bean,才会按照类型进行匹配;而@Autowired默认是按照类型进行注入,如果存在多个同一类型的 bean,则需要额外的限定符(比如@Qualifier注解)来指定具体要注入的那个。

在我们这个例子中,如果使用@Resource,代码可以这样写:

@Service

public class DataProcessingWorkflow {

// 使用 @Resource 按照名称注入,前提是 bean 的名称要与这里的变量名匹配,或者使用 name 属性指定名称

@Resource

private AbstractDataHandler upstreamXHandler;

@Resource

private AbstractDataHandler upstreamYHandler;

public void processDataFromX(Map data) {

upstreamXHandler.handleData(data);

}

public void processDataFromY(Map data) {

upstreamYHandler.handleData(data);

}

}

关于如何指定使用UpstreamXDataHandler还是UpstreamYDataHandler,当 X 上游来了数据时,在processDataFromX方法中,我们直接调用
upstreamXHandler.handleData(data),这里利用了多态性。因为upstreamXHandler实际指向的是UpstreamXDataHandler类型的对象(由 Spring 容器根据依赖注入配置实例化并赋值),当调用handleData方法时,就会执行UpstreamXDataHandler中重写的具体实现,也就是先执行preValidate验证,如果通过,接着执行doCoreProcessing进行加密处理等一系列流程,最终完成数据处理。同理,当 Y 上游数据到来,processDataFromY方法调用
upstreamYHandler.handleData(data)会触发UpstreamYDataHandler的对应处理逻辑。

三、模板方法模式带来的优势

  1. 代码结构清晰:通过将通用流程和特定业务逻辑分离,阅读代码时能迅速把握整体架构,知道数据从哪里来、经历哪些固定环节、又如何因不同系统而差异化处理。就像看一场结构分明的演出,开场、高潮、结尾一目了然,每个环节各司其职。
  1. 易于维护和扩展:当上游系统的数据处理规则变化,只需在对应的子类中修改doCoreProcessing方法,好比调整某个地区分店的一道菜做法,不影响其他分店和整体运营;若有新的上游系统接入,新增一个子类实现抽象基类方法即可,丝毫不会影响已有代码的稳定性,如同新开一家分店,按总部框架加入特色菜品制作流程。
  1. 可复用性强:抽象基类中的通用方法如日志记录、通用后置处理等,在整个项目的数据处理流程中都能复用,减少重复代码编写,仿佛总部统一采购的餐具、布置的餐厅环境,在各个分店都能派上用场。

总之,在 Spring Boot 项目里巧妙运用模板方法模式处理数据,能让我们在复杂的数据处理战场上从容应对,开发出高质量、易维护的软件系统,开启高效编程之旅。希望这篇博客能为大家点亮模板方法模式应用的明灯,助力项目开发一路畅行!

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4