【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,交给子类实现。
各具体策略在继承时,只需关心 怎么取数据 和 怎么加工数据。
两种模式结合的妙处
策略模式:解决“选择哪个策略类来处理数据”。
模板方法模式:解决“所有策略类内部流程一致,差异点由子类填补