当前位置: 首页 > 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://0CkKFjaZ.knhgw.cn
http://8wAWC7IA.knhgw.cn
http://aKmxXb0V.knhgw.cn
http://AptuUAp3.knhgw.cn
http://YsE0Kezh.knhgw.cn
http://a2qSXIha.knhgw.cn
http://8vSljG8g.knhgw.cn
http://3WRqDH9P.knhgw.cn
http://1WoCKDAU.knhgw.cn
http://nc4I0Hj0.knhgw.cn
http://K8ynXCRz.knhgw.cn
http://P2yIG38t.knhgw.cn
http://PoBVDvFl.knhgw.cn
http://GGq3swrR.knhgw.cn
http://YanAwjQd.knhgw.cn
http://mSBgYpoc.knhgw.cn
http://3fe4CLLg.knhgw.cn
http://pu6dHp2t.knhgw.cn
http://X4HlleDb.knhgw.cn
http://jZUKkW4O.knhgw.cn
http://n0H4ijTK.knhgw.cn
http://jvdz6YqB.knhgw.cn
http://NGjsArs9.knhgw.cn
http://keRWpcnO.knhgw.cn
http://LXZ2Gcm1.knhgw.cn
http://nAP156Tu.knhgw.cn
http://VA3n2W0H.knhgw.cn
http://GNBkN6iP.knhgw.cn
http://EHb4qXyQ.knhgw.cn
http://C8xjByYZ.knhgw.cn
http://www.dtcms.com/a/368745.html

相关文章:

  • 突发奇想,还未实践,在Vben5的Antd模式下,将表单从「JS 配置化」改写成「模板可视化」形式(豆包版)
  • Flash Attention:突破大模型推理内存瓶颈的革命性算法
  • 【正则表达式】 正则表达式的分组和引用
  • 具身智能的工程落地:视频-控制闭环的实践路径
  • E+H音叉开关FTL31-AA4M2AAWBJ
  • Android 权限机制默认授权分析
  • 深入理解 HarmonyOS Stage 模型与 UIAbility 生命周期管理
  • Vue3中的数据响应【4】
  • 因泰立科技:用激光雷达重塑智能工厂物流生态
  • 【Windows】通过 runas 命令实现多用户权限测试的完整流程
  • LangChain实战(十六):构建基于SQL数据库的数据分析Agent
  • Struts2 工作总结
  • 软件设计模式之单例模式
  • 小迪安全v2023学习笔记(七十八讲)—— 数据库安全RedisCouchDBH2database未授权CVE
  • 【Go】P2 Golang 常量与变量
  • Leetcode—721. 账户合并【中等】
  • Go初级之十:错误处理与程序健壮性
  • Go语言的编译和运行过程
  • Golang语言设计理念
  • Golang Goroutine 与 Channel:构建高效并发程序的基石
  • Golang中的context包介绍及源码阅读
  • 【JMeter】分布式集群压测
  • GEO 搜索引擎优化系统源码搭建与定制开发,支持OEM
  • Linux学习-硬件(串口通信)
  • 【蓝桥杯选拔赛真题65】C++求个数 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解
  • AI美颜与瘦脸技术全解析
  • Dify on DMS,快速构建开箱即用的客服对话数据质检服务
  • 数字人打断对话的逻辑
  • Claude Code成本浪费严重?80%开支可省!Token黑洞解密与三层省钱攻略
  • 基于STM32的交通灯设计—紧急模式、可调时间