
本文介绍如何将传统过程式算法重构为面向对象设计,通过策略模式、职责链与条件驱动执行相结合的方式,消除重复代码,提升流程可配置性与可维护性。
本文介绍如何将传统过程式算法重构为面向对象设计,通过策略模式、职责链与条件驱动执行相结合的方式,消除重复代码,提升流程可配置性与可维护性。
在将遗留过程式算法迁移至面向对象范式时,核心挑战往往不在于功能实现,而在于流程结构的抽象合理性。您描述的场景——多个步骤按序执行、部分步骤条件跳过、不同用例路径各异——本质上是一个可变流程编排问题,而非简单的类继承问题。若采用“抽象基类 + 子类重写 execute()”的粗粒度方案,极易导致逻辑分散、调用顺序硬编码、新增用例需修改多处,违背开闭原则。
更优解是采用组合优于继承的设计思想,构建三层职责清晰的结构:
1. 步骤抽象:定义可插拔的原子操作
每个处理阶段(如 initializeVariables、sortData)封装为独立的策略类,实现统一接口:
public interface ProcessingStep {
void execute(Context context);
boolean shouldExecute(Context context); // 条件判断委托给步骤自身
}
public class AddDataFromDraft implements ProcessingStep {
@Override
public void execute(Context context) {
// 实际业务逻辑
context.getData().addAll(context.getDraft().getData());
}
@Override
public boolean shouldExecute(Context context) {
return context.getDraft() != null;
}
}2. 上下文统一:承载共享状态与决策依据
Context 对象集中管理所有步骤间流转的数据、配置标志及外部依赖,避免参数冗长传递:
public class Context {
private List<Data> data = new ArrayList<>();
private Draft draft;
private Version previousVersion;
private boolean useExternalSource = true;
// getter/setter 省略
}3. 流程引擎:声明式编排与动态执行
引入 Pipeline 类,以列表形式声明执行序列,运行时自动过滤并调用符合条件的步骤:
public class Pipeline {
private final List<ProcessingStep> steps;
public Pipeline(List<ProcessingStep> steps) {
this.steps = steps;
}
public void execute(Context context) {
for (ProcessingStep step : steps) {
if (step.shouldExecute(context)) {
step.execute(context);
}
}
}
}
// 使用示例:不同用例复用同一引擎,仅变更步骤列表
Pipeline useCase1 = new Pipeline(Arrays.asList(
new InitializeVariables(),
new SaveTemporaryData(),
new AddDataFromExternalSource(),
new SortData(),
new PrepareOutput()
));
Pipeline useCase2 = new Pipeline(Arrays.asList(
new InitializeVariables(),
new SaveTemporaryData(),
new AddDataFromDraft(), // 替换为条件步骤
new AddDataFromExternalSource(),
new SortData(),
new PrepareOutput()
));关键优势与注意事项
- ✅ 零重复逻辑:步骤复用率高,新增用例只需组合现有步骤或编写新策略类;
- ✅ 测试友好:每个 ProcessingStep 可独立单元测试,Pipeline 可模拟 Context 验证执行流;
- ⚠️ 避免过度设计:若流程分支极少且稳定,简单 if 判断(如原答案所示)反而更直观;
- ⚠️ 警惕状态污染:确保 Context 的线程安全性(如使用 ThreadLocal 或每次新建实例);
- ? 进阶扩展:可引入 DSL(如 Pipeline.builder().when(draftExists).then(addFromDraft).elseIf(...))进一步提升可读性。
最终,真正的“结构优化”不在于类的数量,而在于将变化点(执行顺序、跳过条件)显式化、可配置化、可组合化。这正是面向对象设计中“封装变化”的本质体现。










