- DDD领域驱动模式
- 1 DDD是什么
- 2 为啥要用DDD
- POP OOP DDD
- POP OOP DDD各个特点
- 3 DDD的分层架构和构成要素
- 3.1 分层架构
- application.service
- domain
- entity
- exception
- repository
- service
- Infrastructure
- factory
- persistence
- repository.impl
- interfaces
- assembler
- dto
- facade
DDD是领域驱动设计,是Eric Evans于2003年提出的,离现在有19年。
2 为啥要用DDD当软件越来越复杂,实际开发中,大量的业务逻辑堆积在一个巨型类中的例子屡见不鲜,代码的复用性和扩展性无法得到保证。为了解决这样的问题,DDD提出了清晰的分层架构和领域对象的概念,让面向对象的分析和设计进入了一个新的阶段,对企业级软件开发起到了巨大的推动作用。
POP OOP DDD面向过程编程(POP):接触到需求第一步考虑把需求自顶向下分解成一个一个函数。并且在这个过程中考虑分层,模块化等具体的组织方式,从而分解软件的复杂度。当软件的复杂度不是很大,POP也能得到很好的效果。
面向对象编程(OOP):接触到需求第一步考虑把需求分解成一个一个对象,然后每个对象添加一个一个方法和属性,程序通过各种对象之间的调用以及协作,从而实现计算机软件的功能。跟很多工程方法一样,OOP的初衷就是一种处理软件复杂度的设计方法。
领域驱动设计(DDD):接触到需求第一步考虑把需求分解成一个一个问题域,然后再把每个问题域分解成一个一个对象,程序通过各种问题域之间的调用以及协作,从而实现计算机软件的功能。DDD是解决复杂中大型软件的一套行之有效方式,现已成为主流。
POP OOP DDD各个特点POP,无边界,软件复杂度小适用,例如“盖房子”。
OOP,以“对象”为边界,软件复杂度中适用,例如“盖小区”。
DDD,以“问题域”为边界,软件复杂度大适用,例如“盖城市”。
3 DDD的分层架构和构成要素 3.1 分层架构一个项目可以分层几个层级关系
application.service应用层
相对于领域层,应用层是很薄的一层,应用层定义了软件要完成的任务,要尽量简单.
它不包含任务业务规则或知识, 为下一层的领域对象协助任务、委托工作。
它没有反映业务情况的状态,但它可以具有反映用户或程序的某个任务的进展状态。
对外为展现层提供各种应用功能(service)。
对内调用领域层(领域对象或领域服务)完成各种业务逻辑任务(task)。
这一层也很适合写一些任务处理,日志监控
domain领域层
领域层主要负责表达业务概念,业务状态信息和业务规则。 Domain层是整个系统的核心层,几乎全部的业务逻辑会在该层实现。
领域模型层主要包含以下的内容:
- 实体(Entities):具有唯一标识的对象
- 值对象(Value Objects): 无需唯一标识的对象
- 领域服务(Domain Services): 一些行为无法归类到实体对象或值对象上,本质是一些操作,而非事物
- 聚合/聚合根(Aggregates,Aggregate Roots): 聚合是指一组具有内聚关系的相关对象的集合,每个聚合都有一个root和boundary
- 仓储(Repository): 提供查找和持久化对象的方法
聚合类
需要接受前端数据以及所需数据库的部分查询字段
exception自定义业务异常
这里可以写入一个枚举,把所遇到的异常可以写入进去,到时方便直接调用
repository仓储接口
这里写入的是对于项目中增删改查的接口
service领域服务
这里写入的是领域接口以及领域接口实现类
领域接口实现类中做出判断,这里可以引入exception自定义异常类中的枚举
Infrastructure基础实施层
最底层(但与所有层进行交互) 向其他层提供 通用的 技术能力(比如工具类,第三方库类支持,常用基本配置,数据访问底层实现)
基础实施层主要包含以下的内容:
- 为应用层 传递消息(比如通知)
- 为领域层 提供持久化机制(最底层的实现)
- 为用户界面层 提供组件配置
- 基础设施层还能够通过架构框架来支持四个层次间的交互模式。
聚合工厂类
这里写入的是全是工厂对象
PO转DO DO转PO
persistence用于持久化操作
pojo,mapper,service以及对应的Impl
repository.impl应用接口实现类
interfaces用户界面层或者是表示层
最顶层 请求应用层以获取用户所需要展现的数据(比如获取首页的商品数据) 发送命令给应用层要求其执行某个用户命令(实现某个业务逻辑,比如用户要进行转账)
用户界面层应该包含以下的内容:
- 数据传输对象(Data Transfer Object): DTO也常被称作值对象,VO,实质上与领域层的VO并不相同
- DTO是数据传输的载体,内部不应该存在任何业务逻辑,通过DTO把内部的领域对象与外界隔离。
- 装配(Assembler): 实现DTO与领域对象之间的相互转换,数据交换,因此Assembler几乎总是同DTO一起出现。
- 表面,门面(Facade): Façade的用意在于为远程客户端提供粗粒度的调用接口
- 它的主要工作就是将一个用户请求委派给一个或多个Service进行处理,也就是我们常说的Controller。
装配
实现DTO与领域对象之间的相互转换,数据交换,因此Assembler几乎总是同DTO一起出现。
新增DTO对象
更新DTO对象
PO返回DTO
dtoDTO是数据传输的载体,内部不应该存在任何业务逻辑,通过DTO把内部的领域对象与外界隔离
使用数据库部分字段,用来request和response前端数据展示
facade表面
Façade的用意在于为远程客户端提供粗粒度的调用接口
它的主要工作就是将一个用户请求委派给一个或多个Service进行处理,也就是我们常说的Controller。
用于发送请求给前端接收数据



