0

0

面向对象重构中的流程编排模式:用策略链与条件执行替代重复代码

碧海醫心

碧海醫心

发布时间:2026-03-08 09:57:15

|

880人浏览过

|

来源于php中文网

原创

本文介绍如何在面向对象重构中优雅处理多分支线性流程——通过组合策略模式、责任链思想与条件驱动执行,避免子类重复定义执行顺序,消除硬编码调用链,提升可维护性与扩展性。

本文介绍如何在面向对象重构中优雅处理多分支线性流程——通过组合策略模式、责任链思想与条件驱动执行,避免子类重复定义执行顺序,消除硬编码调用链,提升可维护性与扩展性。

在将传统过程式算法迁移到面向对象设计时,一个常见挑战是:多个业务场景共享相似但不完全一致的执行流程(如初始化 → 数据加载 → 变换 → 输出),其中某些步骤依条件跳过,且不同场景的步骤顺序与组合存在差异。若采用“抽象基类 + 子类重写 execute()”的朴素方案,极易导致大量重复的调用序列逻辑(如每个子类都写 step1(); if (cond) step2(); step3(); ...),违背 DRY 原则,也难以应对后续流程变更。

更优解是分离“流程结构”与“步骤行为”,推荐以下三层架构:

1. 步骤抽象化:定义可插拔的操作单元

将每个函数(如 initializeVariables()、addDataFromDraft())封装为独立的、无状态的策略类或函数式接口实现:

Clipfly
Clipfly

一站式AI视频生成和编辑平台,提供多种AI视频处理、AI图像处理工具。

下载
@FunctionalInterface
interface ProcessingStep {
    void execute(Context context);
}

// 示例实现
class InitializeVariablesStep implements ProcessingStep {
    public void execute(Context context) {
        context.setVariables(new HashMap<>());
    }
}

class AddDataFromDraftStep implements ProcessingStep {
    public void execute(Context context) {
        if (context.getDraft() != null) {
            context.getData().addAll(context.getDraft().getData());
        }
    }
}

2. 流程动态化:用配置驱动执行序列

不再由类硬编码调用顺序,而是将每种用例建模为一个步骤列表(List),并由统一调度器执行:

public class PipelineExecutor {
    private final List<ProcessingStep> steps;

    public PipelineExecutor(List<ProcessingStep> steps) {
        this.steps = steps;
    }

    public void execute(Context context) {
        for (ProcessingStep step : steps) {
            step.execute(context);
        }
    }
}

// 按需构建不同流程
PipelineExecutor useCaseA = new PipelineExecutor(Arrays.asList(
    new InitializeVariablesStep(),
    new SaveTemporaryDataStep(),
    new AddDataFromExternalSourceStep(),
    new SortDataStep(),
    new PrepareOutputStep()
));

PipelineExecutor useCaseB = new PipelineExecutor(Arrays.asList(
    new InitializeVariablesStep(),
    new SaveTemporaryDataStep(),
    new AddDataFromDraftStep(),      // 条件步骤,内部自行判断是否执行
    new AddDataFromExternalSourceStep(),
    new SortDataStep(),
    new PrepareOutputStep()
));

3. 条件逻辑内聚化:步骤自身负责守卫逻辑

关键改进点:跳过逻辑不应由调度器判断,而应下沉到具体步骤内部。例如 AddDataFromDraftStep 自行检查 context.getDraft() != null,既保持步骤自治,又避免外部重复条件分支:

class AddDataFromDraftStep implements ProcessingStep {
    @Override
    public void execute(Context context) {
        // 守卫逻辑内聚于此——清晰、可测试、可复用
        if (context.getDraft() == null) return;
        context.getData().addAll(context.getDraft().getData());
    }
}

注意事项与最佳实践

  • Context 对象需精简设计:仅携带各步骤真正需要的数据(如 Map state, Draft draft, List data),避免沦为万能容器;
  • 步骤应无副作用或明确声明副作用:确保可安全重试、跳过或重排序;
  • ⚠️ 避免在步骤中强耦合其他步骤——若某步必须依赖另一步输出,应通过 Context 显式传递,而非直接调用;
  • ? 进阶可引入 StepFilter 或注解(如 @EnabledIf("draftAvailable"))实现声明式条件控制;
  • ? 单元测试聚焦单个步骤行为,集成测试验证完整 Pipeline 行为,大幅提升可测性。

这种设计将“什么要执行”(配置化流程)与“如何执行”(策略化步骤)彻底解耦,既消除了子类中冗余的 if/else 调用链,又为新增用例、步骤复用、运行时流程切换提供了坚实基础——这才是面向对象对流程复杂性的本质回应。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

970

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

252

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1049

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

63

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1848

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

614

2025.10.17

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

44

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号