首页

专栏

java

文章详情

0

DDD思维导图

洪永佳发布于 今天 10:07

常见相关问题

DDD概念

DDD,全称Domain-Driven Design, 是一种处理复杂领域的设计思想,它试图分离技术实现的复杂性,并围绕业务概念构建领域模型来控制业务的复杂性,以解决软件难以理解,难以演进的问题。它通过边界划分将复杂业务领域简单化,帮我们设计出清晰的领域和应用边界,可以很容易地实现架构演进。

DDD是面向对象的设计思想,是面向对象设计的一种升华。

领域驱动设计提出了一套核心构造块(Building Blocks,如聚合、实体、值对象、领域服务、领域工厂、仓储、领域事件,等),这些构造块是对面向对象领域建模的一些核心最佳实践的浓缩。这些构造块可以使得我们的设计更加标准、有序。

实体(Entity) & 值对象(Value Object)

实体与面向对象中的概念类似,在这里再次提出是因为它是领域模型的基本元素。在领域模型中,实体应该具有唯一的标识符,从设计的一开始就应该考虑实体,决定是否建立一个实体也是十分重要的。值对象和我们说的编程中数值类型的变量是不同的,它仅仅是没有唯一标识符的实体,比如有两个收获地址的信息完全一样,那它就是值对象,并不是实体。值对象在领域模型中是可以被共享的,他们应该是“不可变的”(只读的),当有其他地方需要用到值对象时,可以将它的副本作为参数传递。

服务

当我们在分析某一领域时,一直在尝试如何将信息转化为领域模型,但并非所有的点我们都能用Model来涵盖。对象应当有属性,状态和行为,但有时领域中有一些行为是无法映射到具体的对象中的,我们也不能强行将其放入在某一个模型对象中,而将其单独作为一个方法又没有地方,此时就需要服务。服务是无状态的,对象是有状态的。所谓状态,就是对象的基本属性:高矮胖瘦,年轻漂亮。服务本身也是对象,但它却没有属性(只有行为),因此说是无状态的。 服务存在的目的就是为领域提供简单的方法。为了提供大量便捷的方法,自然要关联许多领域模型,所以说,行为(Action)天生就应该存在于服务中。 服务具有以下特点:

服务中体现的行为一定是不属于任何实体和值对象的,但它属于领域模型的范围内

服务的行为一定设计其他多个对象

服务的操作是无状态的

模块

对于一个复杂的应用来说,领域模型将会变的越来越大,以至于很难去描述和理解,更别提模型之间的关系了。模块的出现,就是为了组织统一的模型概念来达到减少复杂性的目的的。而另一个原因则是模块可以提高代码质量和可维护性,比如我们常说的高内聚,低耦合就是要提倡将相关的类内聚在一起实现模块化。模块应当有对外的统一接口供其他模块调用,比如有三个对象在模块a中,那么模块b不应该直接操作这三个对象,而是操作暴露的接口。模块的命名也很有讲究,最好能够深层次反映领域模型。 聚合 聚合被看作是多个模型单元间的组合,它定义了模型的关系和边界。每个聚合都有一个根,根是一个实体,并且是唯一可被外访问的。正是如此,聚合可以保证多个模型单元的不变性,因为其他模型都参考聚合的根。所以要想改变其他对象,只能通过聚合的根去操作。根如果没有了,那么聚合中的其他对象也将不存在。 一个简单的例子如下: customer是该聚合的根,其他的都是内部对象,如果外部需要用户地址,拷贝一份传递出去即可。显而易见,用户如果不存在,其他信息均无意义。

工厂

在大型系统中,实体和聚合通常是很复杂的,这就导致了很难去通过构造器来创建对象。工厂就决解了这个问题,它把创建对象的细节封装起来,巧妙的实现了依赖反转。当然对聚合也适用(当建立了聚合根时,其他对象可以自动创建)。工厂最早被大家熟知可能还是在设计模式中,的确,在这里提到的工厂也是这个概念。但是不要盲目的去应用工厂,以下场景不需要工厂:

构造器很简单

构造对象时不依赖于其他对象的创建

用策略模式就可以解决

仓库

仓库封装了获取对象的逻辑,领域对象无须和底层数据库交互,它只需要从仓库中获取对象即可。仓库可以存储对象的引用,当一个对象被创建后,它可能会被存储到仓库中,那么下次就可以从仓库取。如果用户请求的数据没在仓库中,则会从数据库里取,这就减少了底层交互的次数。

统一语言

统一语言(Ubiquitous Language),是领域驱动设计中一个非常重要的概念。任何一个领域驱动设计的项目,都需要一种通用语言,一套通用的词汇。因为没有通用的语言,就没有一致的概念,沟通就会遇到障碍,最后的领域模型和软件也就无法满足领域内的真实业务需求。通用语言是领域专家和开发人员在对领域问题的沟通、需求的讨论、开发计划的制定、领域模型的设计,以及开发人员之间对领域模型的具体编码落地实现,等一系列过程中,所有人员使用的一种通用语言。话句话说,就是无论是沟通时所用的词汇、还是领域模型中的概念、还是代码中出现的类名与方法,只要是相同的意思,那就应该使用相同的词汇。可以看出,这种通用语言不是一下子就可以形成,而是在一个各方人员讨论的过程中,不断发现、明确,与精炼出来的。

模型驱动设计

分层架构:UI层,应用层,领域层以及基础设施层。

UI层(User Interface) 负责向用户展现信息,并且会解析用户行为,即常说的展现层。

应用层Application Layer 应用层没有任何的业务逻辑代码,它很简单,它主要为程序提供任务处理。

领域层Domain Layer 这一层包含有关领域的信息,是业务的核心,领域模型的状态都直接或间接(持久化至数据库)存储在这一层。

基础设施层Infrastructure Layer 为其他层提供底层依赖操作。 层结构的划分是很有必要的,只有清晰的结构,那么最终的领域设计才宜用,比如用户要预定航班,向Application Layer的service发起请求,而后Domain Layler从Infrastructure Layer获取领域对象,校验通过后会更新用户状态,最后再次通过Infratructure Layer持久化到数据库中。

DDD设计的步骤

根据需求划分出领域、限界上下文;

分析每一个限界上下文中的实体、值对象;

聚合实体、值对象,划分出聚合范围、聚合根;

设计聚合根的仓储;

实际操作,不断反馈,迭代模型

java思维导图DDD

阅读 32发布于 今天 10:07

赞收藏

分享

本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议

洪永佳

一枚保持激情的程序员,一起分享学习技术之路

28声望

4粉丝

关注作者

0 条评论

得票时间

提交评论

洪永佳

一枚保持激情的程序员,一起分享学习技术之路

28声望

4粉丝

关注作者

宣传栏

目录

常见相关问题

DDD概念

DDD,全称Domain-Driven Design, 是一种处理复杂领域的设计思想,它试图分离技术实现的复杂性,并围绕业务概念构建领域模型来控制业务的复杂性,以解决软件难以理解,难以演进的问题。它通过边界划分将复杂业务领域简单化,帮我们设计出清晰的领域和应用边界,可以很容易地实现架构演进。

DDD是面向对象的设计思想,是面向对象设计的一种升华。

领域驱动设计提出了一套核心构造块(Building Blocks,如聚合、实体、值对象、领域服务、领域工厂、仓储、领域事件,等),这些构造块是对面向对象领域建模的一些核心最佳实践的浓缩。这些构造块可以使得我们的设计更加标准、有序。

实体(Entity) & 值对象(Value Object)

实体与面向对象中的概念类似,在这里再次提出是因为它是领域模型的基本元素。在领域模型中,实体应该具有唯一的标识符,从设计的一开始就应该考虑实体,决定是否建立一个实体也是十分重要的。值对象和我们说的编程中数值类型的变量是不同的,它仅仅是没有唯一标识符的实体,比如有两个收获地址的信息完全一样,那它就是值对象,并不是实体。值对象在领域模型中是可以被共享的,他们应该是“不可变的”(只读的),当有其他地方需要用到值对象时,可以将它的副本作为参数传递。

服务

当我们在分析某一领域时,一直在尝试如何将信息转化为领域模型,但并非所有的点我们都能用Model来涵盖。对象应当有属性,状态和行为,但有时领域中有一些行为是无法映射到具体的对象中的,我们也不能强行将其放入在某一个模型对象中,而将其单独作为一个方法又没有地方,此时就需要服务。服务是无状态的,对象是有状态的。所谓状态,就是对象的基本属性:高矮胖瘦,年轻漂亮。服务本身也是对象,但它却没有属性(只有行为),因此说是无状态的。 服务存在的目的就是为领域提供简单的方法。为了提供大量便捷的方法,自然要关联许多领域模型,所以说,行为(Action)天生就应该存在于服务中。 服务具有以下特点:

服务中体现的行为一定是不属于任何实体和值对象的,但它属于领域模型的范围内

服务的行为一定设计其他多个对象

服务的操作是无状态的

模块

对于一个复杂的应用来说,领域模型将会变的越来越大,以至于很难去描述和理解,更别提模型之间的关系了。模块的出现,就是为了组织统一的模型概念来达到减少复杂性的目的的。而另一个原因则是模块可以提高代码质量和可维护性,比如我们常说的高内聚,低耦合就是要提倡将相关的类内聚在一起实现模块化。模块应当有对外的统一接口供其他模块调用,比如有三个对象在模块a中,那么模块b不应该直接操作这三个对象,而是操作暴露的接口。模块的命名也很有讲究,最好能够深层次反映领域模型。 聚合 聚合被看作是多个模型单元间的组合,它定义了模型的关系和边界。每个聚合都有一个根,根是一个实体,并且是唯一可被外访问的。正是如此,聚合可以保证多个模型单元的不变性,因为其他模型都参考聚合的根。所以要想改变其他对象,只能通过聚合的根去操作。根如果没有了,那么聚合中的其他对象也将不存在。 一个简单的例子如下: customer是该聚合的根,其他的都是内部对象,如果外部需要用户地址,拷贝一份传递出去即可。显而易见,用户如果不存在,其他信息均无意义。

工厂

在大型系统中,实体和聚合通常是很复杂的,这就导致了很难去通过构造器来创建对象。工厂就决解了这个问题,它把创建对象的细节封装起来,巧妙的实现了依赖反转。当然对聚合也适用(当建立了聚合根时,其他对象可以自动创建)。工厂最早被大家熟知可能还是在设计模式中,的确,在这里提到的工厂也是这个概念。但是不要盲目的去应用工厂,以下场景不需要工厂:

构造器很简单

构造对象时不依赖于其他对象的创建

用策略模式就可以解决

仓库

仓库封装了获取对象的逻辑,领域对象无须和底层数据库交互,它只需要从仓库中获取对象即可。仓库可以存储对象的引用,当一个对象被创建后,它可能会被存储到仓库中,那么下次就可以从仓库取。如果用户请求的数据没在仓库中,则会从数据库里取,这就减少了底层交互的次数。

统一语言

统一语言(Ubiquitous Language),是领域驱动设计中一个非常重要的概念。任何一个领域驱动设计的项目,都需要一种通用语言,一套通用的词汇。因为没有通用的语言,就没有一致的概念,沟通就会遇到障碍,最后的领域模型和软件也就无法满足领域内的真实业务需求。通用语言是领域专家和开发人员在对领域问题的沟通、需求的讨论、开发计划的制定、领域模型的设计,以及开发人员之间对领域模型的具体编码落地实现,等一系列过程中,所有人员使用的一种通用语言。话句话说,就是无论是沟通时所用的词汇、还是领域模型中的概念、还是代码中出现的类名与方法,只要是相同的意思,那就应该使用相同的词汇。可以看出,这种通用语言不是一下子就可以形成,而是在一个各方人员讨论的过程中,不断发现、明确,与精炼出来的。

模型驱动设计

分层架构:UI层,应用层,领域层以及基础设施层。

UI层(User Interface) 负责向用户展现信息,并且会解析用户行为,即常说的展现层。

应用层Application Layer 应用层没有任何的业务逻辑代码,它很简单,它主要为程序提供任务处理。

领域层Domain Layer 这一层包含有关领域的信息,是业务的核心,领域模型的状态都直接或间接(持久化至数据库)存储在这一层。

基础设施层Infrastructure Layer 为其他层提供底层依赖操作。 层结构的划分是很有必要的,只有清晰的结构,那么最终的领域设计才宜用,比如用户要预定航班,向Application Layer的service发起请求,而后Domain Layler从Infrastructure Layer获取领域对象,校验通过后会更新用户状态,最后再次通过Infratructure Layer持久化到数据库中。

DDD设计的步骤

根据需求划分出领域、限界上下文;

分析每一个限界上下文中的实体、值对象;

聚合实体、值对象,划分出聚合范围、聚合根;

设计聚合根的仓储;

实际操作,不断反馈,迭代模型

ddd java 例子_【Java】DDD思维导图相关推荐

  1. javaio流_万字长文+思维导图帮你梳理 Java IO 流,还学不会你来打我(值得收藏)...

    前言 在上一篇的文章获取不错的浏览量后,继续加更的念头一直徘徊在心中,本来是想花段时间深入学习tomcat的,可是tomcat的源码中就有至关重要的NIO,于是得先整一下NIO,但是NIO的基础是BI ...

  2. java类与接口思维导图_详解java接口基础知识附思维导图

    接口: 官方的含义是---->java接口是一系列方法的声明,是一些方法特征的集合 疑问: 那为什么不用抽象类呢?把他们共有的方法集合起来放在一个抽象类里面,同样可以调用哇,但是反过来想一想如果 ...

  3. java思维导图源代码_如何使用思维导图解读java开源项目

    思维导图与java 思维导图是个很神奇的工具,它具有结构化.可视化.更接近人类大脑认知的特点. 我们在阅读项目的时候往往是无头无脑的随便看源码,其实这是种错误的学习的方法.学习得多注重积累,有输入就要 ...

  4. java英语ppt_来了!思维导图一键转PPT来了!

    都说科技改变生活,本咸鱼真是深有体会.自从用了WPS的一键美化和智能PPT,准时下班耶稣都拦不住我. 但作为摸鱼圣手的我,在高效办公的路上never give up! 在第1001次对着窗外的星星许愿 ...

  5. java基础入门第二版思维导图,Java 学习--你应该有份思维导图了(基础篇)

    每一门知识,除了理解它的一些原理用法之外,我觉得还有一点比较重要,那就是多整理笔记做总结. 以下是我自己亲自整理的关于 Java 学习的思维导图,分享出来希望能对大家在学习 Java 过程中有所帮助, ...

  6. Java后端以及部分前端思维导图

    今天分享一下我在Java前后端的学习内容,将我学过的知识汇聚成了思维导图,仅供参考,仅仅只是我个人所掌握的,一定是还有很多的技术,可能是我没有学到,也可能是我忘记写入,总之这份导图只代表我个人所学,请 ...

  7. java集合框架总结之思维导图

    思维导图

  8. 【java】总结的一些思维导图

    [前言] 推荐一款喜欢的手机思维导图软件叫mindly,导图风格我很喜欢. [导图们] [总结] 导出成image 型的里边写的细节的注释没有了, 导出成pdf的话会自动生成一页注释页. 很nice!

  9. 关于主机的思维导图_读《思维导图》系列丛书----我用思维导图做什么?

    多图预警! 作者简介:深圳一所公立高中的生物老师,日常是备备课,读读书,打打球,吹吹牛. 我将从以下几个方面介绍我是如何使用思维导图的. 图1:介绍我如何使用思维导图的思维导图 1.我平时用思维导图来 ...

  10. 导数与微分的知识点思维导图_高中生物思维导图知识点总结

    今天小编给大家整理一份高中生物思维导图知识点总结 ,打印出来给孩子学习吧,需要的请点下面赞同,并评论:我要高中生物思维导图知识点总结, 点头像私信获取,希望给你的孩子有所帮助. 刚开始学生物的时候,第 ...

最新文章

  1. 【C++】C++11 STL算法(九):番外篇
  2. 挑战NLP、量子计算难题,300多支本科生队伍同场角逐,2020 ASC超算竞赛一触即发...
  3. python一行没写完用什么隔离_在CherryPy中请求隔离是如何工作的。我不明白基本的想法...
  4. 自动批量修改linux用户密码
  5. 数据库优化:SQL 查找是否存在,别再 count 了,很耗费时间的!
  6. linux跨版本升级,深度Deepin系统支持跨版本升级
  7. linux查看redis内存,Linux查看redis占用内存的方法
  8. linux搭建web服务器原理,【LINUX】linux搭建web服务器
  9. Module build failed: ReferenceError: Unknown plugin module-resolver specified
  10. 利用poi开源jar包操作Excel时删除行内容与直接删除行的区别
  11. Java学习笔记之log4j与commons-logging转
  12. Python:一文让你彻底理解numpy中axis=-1/0/1/2... [实例讲解:np.argmax(axis= -1 0 1 2) np.sum(aixs= -1 0 1 2)]
  13. StringUtils,FileUtils,PropertiesUtils,DataBaseUtils
  14. java 开源im_开源的im即时通讯系统
  15. 电力安全工作规程发电厂和变电站电气部分_全国勘察设计注册电气工程师(发输变电)专业考试标准、规范目录...
  16. 正确打开adams软件_Adams2017 64位证书安装图文教程
  17. 塔尔寺景点门票销售管理系统
  18. AP(affinity propagation)聚类算法
  19. 【攻防世界web】NewsCenter
  20. 微信终于出新功能了:自动登录该设备

热门文章

  1. win10修改ntp服务器地址,修改win10 ntp服务器地址
  2. Win10版本那么多怎么区别
  3. (原创)[短小精悍系列]RGB(RGI/RGV)颜色明度(亮度)计算公式 (又称灰度公式,彩色照片转黑白照片时能派上用场)
  4. linux防火墙开放端口无法打开,LInux 开启防火墙网站无法访问问题
  5. iNode客户端“未收到服务器回应,即将强行下线,请检查终端能否正常访问网络或者与管理员联系”问题与解决方式...
  6. html图片缩放全部显示不全,100% width CSS 在缩小/放大窗口时候内容被截断或显示不全...
  7. 小学计算机写字板教案,小学第二册信息技术《第9课走进“写字板”》教学参考...
  8. 基于机智云的智能花盆2.0
  9. 阿里云对象存储oss私有桶生成链接
  10. 关于数据科学的十本好书