文章目录
大家好,我是程序员卷卷狗。
今天我们要聊一个在复杂系统设计中越来越常见的概念—— DDD,领域驱动设计。
如果你的项目满足以下三个特征:
改一个需求要动好几个模块;
新人接手看不懂业务逻辑;
产品、开发、测试经常“各说各的”;
那你可能已经踩在 DDD 想解决的问题上了。我在做某业务系统时深有体会,后来用上 DDD,才发现原来“架构设计”不仅是分层,更是一种让业务与代码对齐的思维方式。
这篇文章就带你一起看看:DDD 是怎么让系统“变得更懂业务”的。
一、DDD是什么?
讲 DDD 时,最容易被忽略的其实是它的两面性:
一面是理念——“从业务出发”的架构思想;
一面是落地——“让模型说话”的充血设计。
理解了这两点,也就理解了 DDD 的精髓。
1.1 DDD的概念
DDD(Domain-Driven Design,领域驱动设计) 是一种软件架构思想。
核心目标:让系统设计围绕业务领域本身来展开,而不是以技术框架为中心。
简单说:
DDD 是“从业务出发”的设计方式,关注“领域模型”——也就是业务规则、核心概念、行为逻辑,而不仅仅是数据库或控制层。
DDD 主要分三层:
- 领域层(Domain Layer):核心业务逻辑所在,包含实体、值对象、聚合、领域服务等。
- 应用层(Application Layer):负责编排业务流程,调用领域对象完成任务。
- 基础设施层(Infrastructure Layer):处理数据库、消息队列、API 调用等技术细节。

1.2 DDD的充血模型
在 DDD 中,“模型”不仅保存数据,还包含业务行为,这称为 充血模型(Rich Domain Model)。
与之相对的是“贫血模型(Anemic Model)”,即只有属性、没有行为的类。

例子:

充血模型的特点:
- 把行为逻辑封装到对象内部;
- 避免“上帝类”Service;
- 模型具备自我验证与业务自治;
- 提高可读性、可维护性、可测试性。
一句话总结:
DDD 是以业务为中心的设计思想,
相比 MVC,它能更好地应对复杂业务变化。
而“充血模型”正是它实现业务自治与高内聚的关键。
二、 DDD VS MVC
2.1 从工程架构角度看 DDD 与 MVC
| 对比点 | MVC | DDD |
|---|---|---|
| 出发点 | 技术分层(Controller、Service、DAO) | 业务分层(应用层、领域层、基础设施层) |
| 核心关注 | 表现层与数据层的解耦 | 业务逻辑与领域建模 |
| 逻辑位置 | 分散在 Service 或 Controller | 封装在领域对象内部 |
| 架构结果 | 层次清晰但业务碎片化 | 模型贴近业务,边界清晰 |
给出下面的图进行对比:
MVC架构:

DDD架构:

工程层面上,MVC 通过分层让代码结构更清晰,但往往忽视了业务逻辑的聚合;
而 DDD 则让系统结构与业务语义保持一致,为后续的“充血模型”与领域封装提供了天然的土壤。
2.2 从模型思想看 DDD 与 MVC
| 对比点 | 贫血模型(MVC 常见) | 充血模型(DDD 核心) |
|---|---|---|
| 模型结构 | 仅有属性,无业务行为 | 属性 + 行为封装在同一对象 |
| 逻辑归属 | 逻辑由外部 Service 处理 | 逻辑由对象自身完成 |
| 业务内聚 | 弱,数据被动 | 强,模型自我驱动 |
| 代码特征 | 面向过程式调用 | 面向对象式设计 |
DDD 领域驱动设计的中心,主要在于领域模型的设计,以领域所需驱动功能实现和数据建模。一个领域服务下面会有多个领域模型,每个领域模型都是一个充血结构。一个领域模型 = 一个充血结构

从模型思想上看,MVC 的贫血模型让数据与行为割裂,业务逻辑散落在外部服务中;
而 DDD 的充血模型让对象拥有自我行为与业务语义,实现了真正的高内聚与可维护性。
它让系统不只是“执行代码”,而是在“表达业务”。
三、DDD 的核心构建
在理解了 DDD 的整体思想后,我们需要进一步了解它是如何在代码层面“承载业务”的。
DDD 的领域层由一组核心构件组成——它们像拼图一样,共同构成业务世界的模型。
核心构件一览
| 构件 | 作用 | 示例 |
|---|---|---|
| 实体(Entity) | 拥有唯一标识的业务对象,生命周期较长 | 用户、订单 |
| 值对象(Value Object) | 无唯一 ID,仅用于描述属性或状态 | 地址、金额、时间区间 |
| 聚合与聚合根(Aggregate / Root) | 聚合是业务一致性的边界,聚合根是入口 | 订单聚合:订单为根,订单项为内部对象 |
| 领域服务(Domain Service) | 处理跨实体的领域逻辑 | 支付结算、库存校验 |
| 仓储(Repository) | 负责实体的持久化抽象 | OrderRepository 保存订单 |
图:DDD 核心构件的可视化比喻

图中的卡通人物很好地展示了几个构件的关系:
实体(Entity):
类似人的“身体”“头部”“四肢”,是系统中有独立存在意义的业务对象,拥有唯一身份(ID),生命周期长。
值对象(Value Object):
像“短裤”“臂带”“胡子”,它们描述实体的属性状态,但并不独立存在,随时可更换、销毁。
聚合与聚合根(Aggregate / Root):
整个“人”就是一个聚合,聚合根(比如“人”本身)是访问聚合内部组件的唯一入口,保证整体的一致性。
领域服务(Domain Service):
比如“穿衣”“移动”这样的动作,它们涉及多个部分协作,因此独立为服务,不属于某个具体部位。
仓储(Repository):
相当于“记忆”或“档案系统”,负责把人的状态保存、重建出来——让领域对象持久存在。
小结:
实体和值对象定义了领域中的“名词”,
聚合根定义了“边界”,
领域服务定义了“动作”,
仓储保证了它们能被保存与重建。这套机制让 DDD 不只是思想,而是一种让业务世界在代码中成形的设计方法。
四、DDD 的落地与思考
DDD 的真正价值,不仅仅在于概念的新颖或分层的严谨,而在于它提供了一种让系统更贴近业务本质的设计方式。
它让我们从“以技术为中心”的思维,转变为“以领域为中心”的思维——从代码去理解业务,而不是仅仅去实现功能。
在实际工程中,DDD 并不是要推翻传统的 MVC 架构,而是让系统在原有框架基础上注入业务语义。
MVC 解决的是结构清晰的问题,而 DDD 解决的是业务内聚与长期演进的问题。
当一个系统的业务逻辑变得复杂、多团队协作频繁、需求迭代迅速时,DDD 的建模思想就能发挥出真正的威力。
DDD 的落地往往可以分为三个阶段:
- 从识别核心领域开始 —— 通过领域划分、限界上下文,厘清系统的业务边界;
- 建立充血模型与聚合根 —— 让每个领域对象承担自己的职责,使业务逻辑内聚在模型中;
- 完善协作机制与仓储抽象 —— 通过领域服务与仓储层,让业务逻辑与数据持久化自然衔接。
落地 DDD 的过程并不意味着增加复杂度,而是一次认知结构的重构。
在 DDD 的指导下,开发者不再仅仅写“能运行的代码”,而是写“能表达业务的代码”;
系统不再是冰冷的功能集合,而成为一个能够反映真实业务关系的“业务镜像”。
DDD 的终极目标,是让业务和代码融为一体。
当开发者能用代码讲述业务故事,产品经理能读懂核心模型,
当系统结构与业务逻辑保持一致、自然演化时,
——那便是 DDD 真正的落地与价值所在
关注我,带你了解更多技术干货。
5万+

被折叠的 条评论
为什么被折叠?



