当前位置: 首页 > news >正文

DDD架构

1.DDD架构的概念:
领域驱动设计(Domain-Driven Design, DDD)是一种软件设计方法,旨在将软件系统的设计和开发焦点集中在领域模型上,以解决复杂业务问题
2.DDD架构解决了什么问题:
在以前的mvc架构种,三层结构,简单明了。但是当项目越来越大,维护的时间久了的话,就会出现问题,各种PO,VO,DTO对象越来越多,并且会出现多个接口调用同一个VO对象
会导致实体类越来膨胀,时间久了实体类的定义越来越模糊。就变成了一屎山代码。

而DDD是让各个模块尽可能的都在自己的领域包中。那样会尽可能的减少PO VO的调用,相当于在MVC的基础,将实体类的贫血模型,改成了充血模型。

3.DDD架构各个模块
在这里插入图片描述

xfg-frame-api 接口定义
其实该module更多做的是为xfg-frame-trigger提供定义好的RPC接口,但是不仅仅只有这些,还有像HTTP接口,MQ接口,甚至TASK接口都可以在xfg-frame-api中定义好,
因为xfg-frame-trigger引用了xfg-frame-api,所以会直接impl即可

xfg-frame-app 应用封装
该module在我看来是应用启动和配置这一层的,比如你可以设置一些基本的配置,如AOP配置,线程池配置,数据库连接池配置等,通过整个项目的配置文件也在此处,包括 mybatis.xml 和 application.yaml等配置。这个类可以说是非常的重要,打包镜像就是在这一层,该module引入了xfg-frame-trigger 触发调用 和 xfg-frame-infrastructure 基础设施,也就是说将来在打包的时候,它可以被理解为专门为了启动服务而存在的
xfg-frame-domain 领域封装
领域模型服务,是一个非常重要的模块,无论怎么做DDD的分层架构,domain肯定是要存在的,那么在这一层中就要一个个的细分领域模型,也就是包含每个领域模型都要有的三大要素:“模型 仓库 服务”。
xfg-frame-infrastructure 基础设施|
这个层是依赖于domain领域层的,因为在domain层定义了仓库接口 需要在基础层实现,这是一个依赖倒置的一种设计思路。

前面说到了,在基础层实现了domain领域的接口,实现了其对应的接口的功能,而 xfg-frame-trigger中也引用了domain,那么通过多态,实际上,那么trigger中引入的domain里的仓库方法实际上由infrastructure 实现了
xfg-frame-trigger 触发调用
该层相对好理解,主要用于提供接口实现,消息接收,任务执行等,相当于触发器层,主要引入了 domain api 和 types
xfg-frame-types 类型定义
主要是作为通用类型定义层,在我们的系统开发中,会有很多类型的定义,包括基本的Response,Contants和枚举。它们会被其他层引用。

4.领域分层
这个地方是我认为DDD的核心部分了,也就是domain部分,前面其实还是较少介绍的,只说了其包含三个部分“模型 仓库 服务” 但是实际上包含着更多的内容,
如下图所示:

值对象:表示没有唯一标识的业务实体,例如商品的名称、描述、价格等。
实体对象:表示具有唯一标识的业务实体,例如订单、商品、用户等;
聚合对象:是一组相关的实体对象的根,用于保证实体对象之间的一致性和完整性;

4.1依赖倒置原则
依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。其核心思想是:要面向接口编程,不要面向实现编程。依赖倒置原则是实现开闭原则的重要途径之一,它降低了客户与实现模块之间的耦合

理解:高层模块不应该直接调用底层模块的具体实现,应该调用底层模块的抽象,这样当底层模块进行修改的时候不会影响高层模块。

4.2开闭原则
开闭原则(Open Closed Principle, OCP)是面向对象设计的基本原则之一,它要求软件实体(如模块、类、方法等)应当对扩展开放,对修改关闭。这意味着当软件的需求发生变化时,我们不需要修改原有的代码,而是通过扩展的方式来满足新的需求。
对扩展开放:允许在不修改现有代码的情况下增加新的功能或行为。
对修改关闭:限制对现有代码的修改,以减少代码的耦合性和提高系统的可维护性。

实现开闭原则的方法包括:
抽象约束,封装变化:通过接口或抽象类定义一个相对稳定的抽象层,而将可变的部分封装在具体实现类中。这样,当软件需要变化时,只需要添加新的实现类来扩展功能,而不需要修改原有的代码。
依赖抽象而非具体实现:通过依赖抽象类或接口而不是具体实现类来编程,可以提高代码的可复用性和可维护性。
使用设计模式:如策略模式、模板方法模式等,这些模式可以帮助我们更好地遵循开闭原则,实现代码的灵活性和可扩展性。

5.MVC分层架构
分层架构是典型的架构例子,该架构将元素按照“层”的方式组织,每个层有定义明确的职责,同时限制了层与层之间的依赖关系。即:每一层只能依赖于紧邻的下层或下面的任何层。以常见的三层架构为例(三层架构是应用于逻辑视图的分层架构),三层架构将应用程序的类组织展示如图2.1所示:

在实际开发过程中,三层架构随着业务的逐渐庞大会出现很明显的弊端,比如,在表示层中有逻辑层的代码,导致在实际的三层架构模型中,下层会依赖上层,违背了三层分层机构只能上层依赖下层的原则,导致分层边界越来越模糊。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 快速将一个网址打包成一个exe可执行文件
  • 大数据基础:Hadoop之HDFS重点架构原理
  • CentOS 8升级gcc版本
  • redis的Bitmap 、HyperLogLog、Geo相关命令和相关场景
  • AtCoder Beginner Contest 361
  • SQL 字段类型-上
  • 旗晟机器人AI智能算法有哪些?
  • JRE、JVM、JDK分别是什么。
  • Django学习第六天
  • 构造函数注入@RequiredArgsConstructor
  • arp缓存中毒实验
  • 【大模型LLM面试合集】大语言模型架构_layer_normalization
  • 【HarmonyOS NEXT】鸿蒙线程安全容器集collections.ArrayBuffer
  • self_attention python代码
  • 超高精电容传感器PCAP01调试+LABVIEW数据可视化调试手记
  • JS 中的深拷贝与浅拷贝
  • [case10]使用RSQL实现端到端的动态查询
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • DataBase in Android
  • Flex布局到底解决了什么问题
  • js对象的深浅拷贝
  • leetcode98. Validate Binary Search Tree
  • Making An Indicator With Pure CSS
  • nfs客户端进程变D,延伸linux的lock
  • PAT A1120
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • 服务器从安装到部署全过程(二)
  • 关于Flux,Vuex,Redux的思考
  • 入门到放弃node系列之Hello Word篇
  • 深度解析利用ES6进行Promise封装总结
  • 问题之ssh中Host key verification failed的解决
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 自制字幕遮挡器
  • No resource identifier found for attribute,RxJava之zip操作符
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 湖北分布式智能数据采集方法有哪些?
  • #android不同版本废弃api,新api。
  • #QT项目实战(天气预报)
  • (12)Hive调优——count distinct去重优化
  • (day18) leetcode 204.计数质数
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (二)Linux——Linux常用指令
  • (计算机网络)物理层
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (一)UDP基本编程步骤
  • (转)ORM
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转载)OpenStack Hacker养成指南
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .JPG图片,各种压缩率下的文件尺寸
  • .NET MVC 验证码
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 的程序集加载上下文
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理