面向对象重构流程化算法:类设计去重优化方案咨询
优化重构方案建议
针对你提出的流程化算法转面向对象的重复代码问题,结合四个场景的执行流程,可以通过以下几种方式优化,消除重复同时保持扩展性:
1. 模板方法模式+策略接口:分离固定流程与可变步骤
首先,将所有场景固定的前置步骤(initializeVariables()、saveTemporaryData())放在抽象基类中,把可变的addData系列方法抽象为策略接口,再让子类根据场景组合策略并实现后续流程的差异部分。
示例代码:
// 抽象数据添加策略 interface DataAddStrategy { void addData(DataContext context); } // 各策略实现 class ExternalSourceAddStrategy implements DataAddStrategy { @Override public void addData(DataContext context) { context.addDataFromExternalSource(); } } class DraftAddStrategy implements DataAddStrategy { @Override public void addData(DataContext context) { context.addDataFromDraft(); } } class PreviousVersionAddStrategy implements DataAddStrategy { @Override public void addData(DataContext context) { context.addDataFromPreviousVersion(); } } // 抽象流程基类 abstract class DataProcessingFlow { protected DataContext context = new DataContext(); // 固定前置流程,所有场景共享 protected void executePreSteps() { context.initializeVariables(); context.saveTemporaryData(); } // 抽象方法:子类实现可变的中间步骤组合 protected abstract void executeVariableSteps(); // 固定后置流程 protected void executePostSteps() { context.sortData(); context.prepareOutput(); } // 统一执行入口 public final void execute() { executePreSteps(); executeVariableSteps(); executePostSteps(); } } // FIRST场景子类 class FirstProcessingFlow extends DataProcessingFlow { @Override protected void executeVariableSteps() { new ExternalSourceAddStrategy().addData(context); } } // SECOND场景子类 class SecondProcessingFlow extends DataProcessingFlow { @Override protected void executeVariableSteps() { new DraftAddStrategy().addData(context); new ExternalSourceAddStrategy().addData(context); } } // DataContext封装所有操作方法 class DataContext { public void initializeVariables() { /* 实现逻辑 */ } public void saveTemporaryData() { /* 实现逻辑 */ } public void addDataFromExternalSource() { /* 实现逻辑 */ } public void addDataFromDraft() { /* 实现逻辑 */ } public void addDataFromPreviousVersion() { /* 实现逻辑 */ } public void sortData() { /* 实现逻辑 */ } public void prepareOutput() { /* 实现逻辑 */ } }
这种方式把重复的前置/后置流程统一在基类,可变部分通过策略接口复用,避免子类重复编写相同的步骤调用。
2. 命令模式+流程配置:完全消除流程代码重复
如果后续可能新增更多场景,可以把每个操作封装为Command对象,然后为每个场景配置对应的命令执行序列,基类只负责执行序列即可,完全不用为每个场景写子类。
示例代码:
// 命令接口 interface ProcessingCommand { void execute(DataContext context); } // 各操作对应的命令实现 class InitializeVariablesCommand implements ProcessingCommand { @Override public void execute(DataContext context) { context.initializeVariables(); } } class SaveTemporaryDataCommand implements ProcessingCommand { @Override public void execute(DataContext context) { context.saveTemporaryData(); } } class AddDataFromExternalSourceCommand implements ProcessingCommand { @Override public void execute(DataContext context) { context.addDataFromExternalSource(); } } // 其他命令类(AddDataFromDraft、AddDataFromPreviousVersion等)同理实现 // 流程执行器 class FlowExecutor { private List<ProcessingCommand> commandSequence; private DataContext context = new DataContext(); public FlowExecutor(List<ProcessingCommand> commandSequence) { this.commandSequence = commandSequence; } public void execute() { for (ProcessingCommand command : commandSequence) { command.execute(context); } } } // 场景配置示例 public class FlowConfig { public static FlowExecutor createFirstFlow() { return new FlowExecutor(Arrays.asList( new InitializeVariablesCommand(), new SaveTemporaryDataCommand(), new AddDataFromExternalSourceCommand(), new SortDataCommand(), new PrepareOutputCommand() )); } public static FlowExecutor createSecondFlow() { return new FlowExecutor(Arrays.asList( new InitializeVariablesCommand(), new SaveTemporaryDataCommand(), new AddDataFromDraftCommand(), new AddDataFromExternalSourceCommand(), new SortDataCommand(), new PrepareOutputCommand() )); } // THIRD、FOURTH场景配置同理编写 }
这种方式的优势是新增场景只需添加配置代码,无需修改现有类,完全符合开闭原则,也彻底消除了流程调用的重复代码。
3. 提取公共步骤组:简化子类流程代码
如果不想引入过多设计模式,也可以在抽象基类中提取重复的步骤组合方法,比如把多个连续出现的步骤封装成一个方法,子类直接调用即可。
例如:
abstract class DataProcessingFlow { protected DataContext context = new DataContext(); protected void commonPreSteps() { context.initializeVariables(); context.saveTemporaryData(); } protected void commonFinalSteps() { context.sortData(); context.prepareOutput(); } public abstract void execute(); } class FirstProcessingFlow extends DataProcessingFlow { @Override public void execute() { commonPreSteps(); context.addDataFromExternalSource(); commonFinalSteps(); } } class ThirdProcessingFlow extends DataProcessingFlow { @Override public void execute() { commonPreSteps(); context.addDataFromDraft(); context.addDataFromPreviousVersion(); context.addDataFromExternalSource(); commonFinalSteps(); } }
这种方式简单直接,适合场景变化不多的情况,快速减少重复代码。
内容的提问来源于stack exchange,提问作者Anna Setiva
相关产品推荐
相关产品推荐

