You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

面向对象重构流程化算法:类设计去重优化方案咨询

优化重构方案建议

针对你提出的流程化算法转面向对象的重复代码问题,结合四个场景的执行流程,可以通过以下几种方式优化,消除重复同时保持扩展性:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:39:36