DDD领域驱动模型理解

文章目录

  • 前言
  • 一、概念
  • 二、domain层设计
    • 1、聚合根
    • 2、贫血模型,充血模型
  • 三、对比
  • 四、总结

领域驱动模型学习网站


前言

最近DDD领域驱动模型非常火热,包括面试的时候也会被问到,就特地去学习了解下

一、概念

DDD(domain driver design)领域驱动模型,其实不是技术,而是一种架构思路。
我们把他和我们熟悉的MVC进行对比下,传统情况下,简单类比
M(domain dao service)
V(view视图渲染)如Thymeleaf这种技术
C(controller)
在这里我们可以看到M层做的东西太多了,这里揉杂了(domain实体类,dao操作,service业务处理)
那么DDD是什么概念呢?
相当于,我们把传统的MVC中M层给具体化。网上基于DDD也给出了四层架构,我们就以这个来讲
比如,我们可以把M层,抽象出两层来,
biz应用层,domain实体层
其中biz中做整合domain实体业务出来
domian层就事DDD设计的核心

二、domain层设计

我们举例在学校里面,我们以班级划分为一个领域,我们可以这样设计
班级里面有老师和学生,那么我们就可以抽象出老师实体和学生实体
DDD领域驱动模型理解_第1张图片

1、聚合根

聚合根,就是外界要调用这个domain领域中的方法,总负责人
比如上面班级这个领域,比如外面有人要找某个学生,他们要去找老师(teacher)聚合根询问,而不能直接去问学生(student)

2、贫血模型,充血模型

贫血模型
特别好理解,像我们使用spring创建的实体类,默认只实现set/get方法这种就是贫血模型,意思是这中模型特别简单,没有其他功能

充血模型
DDD领域驱动模型,使用的就是充血模型。
我们还是以上面班级这个领域来讲,如teacher或者student对象,不仅有set/get方法。我们还可以在他们对象中加入特有的方法。比如teacher,我们可以加上teach教这个方法。也可以在student这个对象上面加上study方法。这样当我们通过领域获取teacher或者student对象的时候,就可以直接调用teach或者study方法,
而不用而外创建公共teacherService.teach(Teacher teacher)或者studentService.study(Student student)这种方法

三、对比

DDD领域驱动模型理解_第2张图片
上面图片指的是单体情况下的比较
从图中,我们可以看到DDD刚开始使用的时候,即使项目复杂低的情况下,成本最高,但随着项目复杂度不断升高,DDD的成本像比其他两种设计来讲确是最少的。
transation script可以理解是c语言这种面向过程的设计
table module可以理解为是现在大家都在使用的,先设计表,生成domain实体类后再去crud的方式。目前这种方式虽然会随着项目复杂度升高,成本也会指数级上涨。但是一般我们会做微服务,所以也不会出现图中指数上涨的情况,

四、总结

DDD其实0几年早就提出来了,但是DDD太抽象了,目前还没有大规模落地的项目,其实也没有见到它的好处特别明显

推荐一篇解释通俗易懂的文章:足球比赛

你可能感兴趣的:(架构,架构)