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

【1】策略模式 + 模板方法模式的联合应用

策略模式 + 模板方法模式的联合应用 的一个典型场景;你已经在代码中用到了策略模式,现在又引入了模板方法模式来解决“取数逻辑不同”的问题。下面我给你做一个系统梳理

🎯 策略模式(Strategy Pattern)在这里的作用

📌 定义
策略模式关注的是:一类问题有多种算法(策略)可选,运行时依据上下文选择合适的策略来处理。
它本质上就是 → 把行为抽象成接口,具体逻辑由不同实现类完成。

📌 在你的场景里
需要解决的问题: wafer 移动图表 (WaferMovingChart) 有多种展示方式,不同类型的 Chart 需要不同的处理逻辑。
抽象接口:
Java

public interface WtwrChartStrategy {
WtwrChartType getType();
void handleChartData(WaferMovingChartReq request, WaferMovingChartVO response);
}
多个策略实现:
ModuleTimeStrategy
ProcessingTimeStrategy
WaferMoveStrategy
工厂&上下文:
Service 不需要 if/else/switch,而是通过 chartStrategyFactory.getStrategy(request.getChartType()) 来挑选合适的策略。
📌 优点
扩展性:新增一种 Chart,只需写一个 Strategy 类,注册进工厂即可。
解耦:业务 Service 不关心处理细节,只管挑选策略。
单一职责:每种 Chart 的处理逻辑只在对应策略中维护。
👉 所以这里的大框架就是策略模式,它解决的核心是:不同 Chart 类型,使用不同业务处理逻辑。

🎯 模板方法模式(Template Method Pattern)在这里的作用

📌 定义
模板方法模式关注的是:某一类算法的执行步骤是固定的,但其中某些步骤细节可以交给子类决定。
父类提供“流程骨架”,子类只需实现“可变部分”。

📌 在你的场景里
不同策略类(Strategy)虽然业务处理逻辑不同,但它们的 总体调用流程 却非常相似:

获取数据(不同策略的数据源可能不一样:数据库、API 或缓存)
判空(统一逻辑)
加工数据(每个策略各自不同)
设置到响应对象
于是你把这个公共流程提炼到一个抽象基类里 (AbstractWtwrChartStrategy),里面写了:

Java

@Override
public final void handleChartData(WaferMovingChartReq request, WaferMovingChartVO response) {
List dataList = fetchData(request); // 交给子类
if (CollectionUtils.isEmpty(dataList)) { // 统一空处理
return;
}
doHandle(request, response, dataList); // 交给子类
}
子类就只需要:

fetchData → 各自实现从哪里取数据
doHandle → 各自实现怎么加工数据
📌 优点
代码复用:避免不同策略中都写一遍 if (empty) return;…
清晰边界:父类管流程,子类管细节。
强制一致性:所有策略必须遵循统一的执行流程,不会有人忘了判空。
👉 模板方法模式解决的核心是:统一流程控制,让子类只关心差异点。

🎯 两者结合的价值

在这个场景里,策略模式 和 模板方法模式 是组合使用的:

策略模式 → 保证了灵活性:每种 Chart 类型独立成策略,可以随时扩展/替换。
模板方法模式 → 保证了规范性:即便策略再多,它们都遵循同样的处理流程。
可以这样理解:

策略模式 决定 挑哪个厨师来做菜(ModuleTime、ProcessingTime、WaferMove)。
模板方法模式 决定 厨师做菜的流程必须相同(取菜→检查→切配→出菜),但每个厨师可以选择买菜市场、配料方式不同。
结果是:
你既能“随便换厨师”(策略模式),又能“保证所有厨师做菜方式靠谱一致”(模板方法模式)。
——灵活 + 规范,两全其美 ✨

🎯 总结对比

在这里插入图片描述

总结:
策略模式让你能“横向扩展”不同算法,模板方法模式让你能“纵向统一”它们的流程
所以,在这个项目里,它们一起解决了“既要扩展多种 Chart 策略,又要统一流程规范”的问题。

类图

在这里插入图片描述

解读
Strategy 模式部分

WtwrChartStrategy 是策略接口(定义所有策略统一行为)。
ModuleTimeStrategy、ProcessingTimeStrategy、WaferMoveStrategy 都是策略的不同实现(不同业务逻辑)。
Template Method 模式部分

AbstractWtwrChartStrategy 是一个“骨架”:
定义了 handleChartData() 的固定执行流程(不可更改,final)。
定义了两个抽象方法 fetchData & doHandle,交给子类实现。
各具体策略在继承时,只需关心 怎么取数据 和 怎么加工数据。
两种模式结合的妙处
策略模式:解决“选择哪个策略类来处理数据”。
模板方法模式:解决“所有策略类内部流程一致,差异点由子类填补

http://www.xdnf.cn/news/1461025.html

相关文章:

  • 具身智能的工程落地:视频-控制闭环的实践路径
  • 手写React状态hook
  • AI测试:自动化测试框架、智能缺陷检测、A/B测试优化
  • 分片上传-
  • Boost搜索引擎 网络库与前端(4)
  • 力扣hot100:搜索二维矩阵 II(常见误区与高效解法详解)(240)
  • OpenBMC之编译加速篇
  • 三、神经网络
  • VisionPro联合编程相机拍照 九点标定实战
  • pinia状态管理的作用和意义
  • SSD固态硬盘加速优化-明显提高固态硬盘的效率并保持峰值性能-供大家学习研究参考
  • Ubuntu 22.04 网络服务安装配置
  • 硬件开发1-51单片机3-串口
  • 三阶Bezier曲线曲率极值及对应的u的计算方法
  • LeetCode 994 腐烂的橘子
  • 【C语言】深入理解指针(4)
  • 【LeetCode热题100道笔记】旋转图像
  • pycharm解释器使用anaconda建立的虚拟环境里面的python,无需系统里面安装python。
  • MySQL复制技术的发展历程
  • Spring启示录
  • 从传统CNN到残差网络:用PyTorch实现更强大的图像分类模型
  • BenTsao本草-中文医学大模型
  • 【算法--链表】61.旋转链表--通俗讲解
  • 【Day 44】Shell-Git版本控制器
  • 【Python】数据可视化之分类图
  • Day2p2 夏暮客的Python之路
  • 数学建模25c
  • [数据结构] 链表
  • 深度学习之第七课卷积神经网络 (CNN)调整学习率
  • MySQL子查询的分类讲解与实战