DDD是现在非常火热的架构设计,而且大厂面试也经常考察,下面我就全面来详解DDD架构@mikechen
DDD
DDD,全程是领域驱动设计(Domain-Driven Design,简称 DDD),是一种软件开发方法论。
DDD,主要通过深刻理解业务领域,并将其转化为技术,来实现复杂业务系统的高效设计、和开发。
DDD的作用主要体现在如下4大方面:
第一:促进业务、和技术团队的沟通。
比如:通过建立统一的领域语言,DDD帮助业务、和技术团队,更好地沟通和理解业务需求,减少误解、和沟通成本。
第二:提高代码质量、和可维护性。
比如:DDD强调清晰的领域模型、和边界,鼓励使用面向对象的设计原则,提升代码的可读性、可维护性、和可扩展性。
第三:聚焦业务价值
DDD将关注点放在业务逻辑、和需求上,确保开发的每个功能,都是为了解决实际业务问题,从而最大化业务价值。
第四:应对复杂性
通过划分子领域、和界限上下文(Bounded Context),DDD能够有效地管理、和应对复杂业务领域中的复杂性。
DDD架构
DDD架构通常分为四层结构,这四层各自承担不同的职责,共同构成一个完整的领域驱动设计系统。
如下图所示:

传统的方式,经常会分为三层架构,一般会包含:表示层、业务逻辑层、与数据访问层。
如下:
表示层(Presentation Layer)
- 功能:处理用户界面和用户输入。
- 职责:展示数据,处理用户交互,将用户的请求传递给业务逻辑层,并显示结果。
业务逻辑层(Business Logic Layer)
- 功能:包含应用程序的核心业务逻辑和规则。
- 职责:处理业务逻辑,实现应用程序的核心功能,调用数据访问层进行数据操作。
数据访问层(Data Access Layer)
- 功能:处理与数据库或其他存储系统的交互。
- 职责:执行 CRUD 操作,管理数据持久化,封装对存储的访问逻辑。
但是DDD架构,会分层四层架构,这是与传统架构最大的区别。
1.用户界面层
主要:处理用户界面、和用户输入。
同传统架构,展示数据,处理用户交互,将用户的请求传递给应用层,并显示结果。
2.应用层
应用层:主要实现应用程序的用例、和业务流程,确保应用程序的工作流正确无误。
与传统业务逻辑层的区别:应用层关注的是应用程序的操作、和流程,而不是具体的业务逻辑。
它不包含复杂的业务规则,而是调用领域层中的业务逻辑来完成任务。
3.领域层
领域层是 DDD 的核心层,包含:领域模型、和业务逻辑,这是与传统架构最大的区别点。
领域层,主要复制:定义、和实现领域模型,主要包含:业务逻辑、和领域规则。
比如:包含实体、值对象、聚合根、领域服务。。。。。等。
如下图所示:
1).实体(Entity)
实体:是领域模型中具有唯一标识符的对象。
实体通过唯一标识符,(如ID)来区分其他实体,即使它们的其他属性相同
实体在系统中有自己的生命周期,可以被创建、修改和删除。
假设,我们在一个电商系统中设计订单系统,其中的订单就是一个实体。
public class Order { public Guid Id { get; private set; } public DateTime OrderDate { get; private set; } public string CustomerId { get; private set; } public List<OrderItem> Items { get; private set; } // 其他属性和方法 public void AddItem(OrderItem item) { // 添加商品到订单 } }
2).值对象(Value Object)
值对象,代表某种特定的概念、或属性,并且通常是不可变的。
值对象一旦创建,其属性值不会改变,如果需要更改,通常会创建一个新的值对象。
举一个例子,在电商系统中,Money
类可以作为值对象来表示货币金额。
public class Money { public decimal Amount { get; private set; } public string Currency { get; private set; } public Money(decimal amount, string currency) { Amount = amount; Currency = currency; }
3).聚合(Aggregate)
聚合是一个领域模型中的重要概念,它是一个实体的根,负责管理:聚合内所有的实体、和值对象。
举一个例子,还是电商的场景,比如:订单聚合,就可以包含:订单、物流、发货地址…等。
public class Order { public Guid Id { get; private set; } public DateTime OrderDate { get; private set; } public string CustomerId { get; private set; } public List<OrderItem> Items { get; private set; } // 确保聚合内的一致性 public void AddItem(OrderItem item) { // 添加商品到订单 } public void RemoveItem(OrderItem item) { // 从订单中移除商品 } }
4).领域服务(Domain Service)
领域服务,通常用于处理跨越多个聚合的业务逻辑,或者,处理那些没有明显的归属到某个特定对象的逻辑。
领域服务通常包含:复杂的业务逻辑,它们负责协调多个领域对象之间的交互。
比如:在电商系统中,OrderService
可以作为领域服务来处理跨多个订单的复杂业务逻辑。
5).领域事件(Domain Event)
领域事件:用于表示领域模型中发生的业务事件。
例如,当订单被创建时,可以触发:库存管理系统,更新库存…等事件。
以及,当用户信息被更新时,可以发布领域事件,以同步到其他相关系统。
4.基础设施层(Infrastructure Layer)
与传统数据访问层的区别,基础设施层不仅包括数据访问,还包括其他技术实现,如文件存储、消息队列等。
它与领域层和应用层解耦,以提供对底层技术的支持。
提供持久化、消息传递、网络通信…等底层支持功能,比如:数据库访问、外部系统集成、日志记录…..等。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注作者「mikechen」公众号,获取更多技术干货!

后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》