DDD领域驱动模式

文章目录

  • 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领域驱动模式

1 DDD是什么

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): 提供查找和持久化对象的方法
entity

聚合类

需要接受前端数据以及所需数据库的部分查询字段

exception

自定义业务异常

这里可以写入一个枚举,把所遇到的异常可以写入进去,到时方便直接调用

repository

仓储接口

这里写入的是对于项目中增删改查的接口

service

领域服务

这里写入的是领域接口以及领域接口实现类

领域接口实现类中做出判断,这里可以引入exception自定义异常类中的枚举

Infrastructure

基础实施层

最底层(但与所有层进行交互) 向其他层提供 通用的 技术能力(比如工具类,第三方库类支持,常用基本配置,数据访问底层实现)

基础实施层主要包含以下的内容:

  • 为应用层 传递消息(比如通知)
  • 为领域层 提供持久化机制(最底层的实现)
  • 为用户界面层 提供组件配置
  • 基础设施层还能够通过架构框架来支持四个层次间的交互模式。
factory

聚合工厂类

这里写入的是全是工厂对象

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。
assembler

装配

实现DTO与领域对象之间的相互转换,数据交换,因此Assembler几乎总是同DTO一起出现。

新增DTO对象

更新DTO对象

PO返回DTO

dto

DTO是数据传输的载体,内部不应该存在任何业务逻辑,通过DTO把内部的领域对象与外界隔离

使用数据库部分字段,用来request和response前端数据展示

facade

表面

Façade的用意在于为远程客户端提供粗粒度的调用接口

它的主要工作就是将一个用户请求委派给一个或多个Service进行处理,也就是我们常说的Controller。

用于发送请求给前端接收数据

你可能感兴趣的:(DDD,java,开发语言)