【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,交给子类实现。

各具体策略在继承时,只需关心 怎么取数据 和 怎么加工数据。

两种模式结合的妙处

策略模式:解决"选择哪个策略类来处理数据"。

模板方法模式:解决"所有策略类内部流程一致,差异点由子类填补

相关推荐
福大大架构师每日一题21 小时前
ollama v0.40.11发布:macOS原生语音生成上线,d3决策模型正式加入
macos·策略模式
AIex-YH4 天前
发酵罐里点一盏灯:光发酵,正在重算微藻蛋白的成本账
运维·制造·策略模式
snakecy4 天前
macOS 安装 LaTeX 全流程指南:从 MacTeX 到中文排版
macos·策略模式
钱栈up9 天前
从 macOS 切回 Windows,我用 5 个免费工具把 80% 操作习惯搬了回来
windows·macos·策略模式
kunicoding11 天前
C++ 策略模式实战:写一个可以“一键换输出“的日志系统
开发语言·c++·策略模式
峥嵘life12 天前
Android16 开机后立即打开相机闪退问题分析与解决总结
android·开发语言·数码相机·策略模式
智慧城市203013 天前
关键供应商连续交付不合格批次,说明质量风险可能持续存在。企业需要建立“批次隔离、加严检验、驻厂遏制、复检放行、供应商升级”的处置闭环,同时统筹保供。
数据分析·策略模式·战略咨询·流程管理
happy_baymax14 天前
Dell G3 3590 黑苹果实战:OpenCore 1.0.8 + NullMoth 驱动让 GTX 1660 跑起 Metal
策略模式
遇码14 天前
macOS 触摸板捏合在 GPUI 里无响应:vendor 打补丁,把手势合成为 cmd+滚轮事件
rust·图形渲染·策略模式·桌面应用·gpui
mmsx15 天前
Android 架构分层:MVVM 与 MVP 共存,网络层怎么切
android·策略模式·mvvm·mvp