前言:
术语“六角形建筑”已经存在很长时间了。足够长的时间,这个主题的主要资源已经脱机了一段时间,并且直到最近才从档案中解救出来。

但是,我发现关于如何以这种体系结构样式实际实现应用程序的资源很少。本文的目的是提供一种用Java和Spring以六边形样式实现Web应用程序的自以为是的方式。

什么是“六角形建筑”?

与常见的分层体系结构样式相反,“六角形体系结构”的主要特征是组件之间的依赖关系“指向内部”,指向我们的领域对象:

六边形只是一种描述应用程序核心的奇特方法,该应用程序由领域对象,在其上操作的用例以及为外界提供接口的输入和输出端口组成。

1、域对象

在具有业务规则的域中,域对象是应用程序的命脉。域对象可以包含状态和行为,行为越接近状态,代码将越容易理解,推理和维护。

域对象没有任何外部依赖性。它们是纯Java,并提供了用于用例的API。

由于域对象不依赖于应用程序的其他层,因此其他层的更改不会影响它们。它们可以不受依赖地演变,这是“单一责任原则”(“ SOLID”中的“ S”)的主要示例,该原则指出组件应该只有一个更改的理由。对于我们的域对象,原因是业务需求的变化。

只需承担一项责任,我们就可以演化域对象,而不必考虑外部依赖关系。这种可扩展性使六角形体系结构样式非常适合在实践域驱动设计时。在开发过程中,我们只是遵循自然的依赖关系流程:我们开始在域对象中进行编码,然后从那里开始,如果不是域驱动的,那么我不知道是什么。

2、用例

我们知道用例是用户使用我们的软件所做的抽象描述。在六角形体系结构样式中,将用例提升为我们代码库的“一等公民”是有意义的。

从这个意义上讲,用例是一个处理特定用例周围所有内容的类。作为示例,让我们考虑银行应用程序中的用例“将钱从一个帐户发送到另一个帐户”。

我们将创建一个SendMoneyUseCase具有独特API 的类,该API允许用户转移资金。该代码包含特定于用例的所有业务规则验证和逻辑,因此无法在域对象中实现。其他所有内容都委托给域对象(例如,可能存在域对象Account)。

与域对象类似,用例类不依赖于外部组件。当它需要六角形之外的东西时,我们创建一个输出端口。

3、输入和输出端口

域对象和用例在六边形内,即在应用程序的核心内。每次与外部的通信都是通过专用的“端口”进行的。

输入端口是一个简单的接口,可由外部组件调用,并由用例实现。调用此类输入端口的组件称为输入适配器或“驱动”适配器。

输出端口还是一个简单的接口,如果我们的用例需要外部的东西(例如,数据库访问),则可以用它们来调用。该接口旨在满足用例的需求,但由称为输出或“驱动”适配器的外部组件实现。如果您熟悉SOLID原理,则这是依赖关系反转原理(在SOLID中为“ D”

Java和Spring的六边形架构:在代码中体现“六角形建筑”相关推荐

  1. asm 5 java,java – 使用ASM(5.x)在字节代码中检测运行时的递归方法调用:howto?

    问题如下; Java代码中的方法是: Rule foo() { return sequence(foo(), x()); } 这将引发解析循环,当然应该避免;但是,这是合法的: Rule foo() ...

  2. java 很多if_java 使用策略模式解决代码中包含太多的if else

    1.首先创建一个enum枚举类 代码附上: public enum SystemErrorCode { QUIT(":quit", "", "com. ...

  3. android java 指针,opencv android:向我的代码中添加cascade分类器后出现空指针异常

    我在casecadeclassifier.java类中收到空指针异常 在这里: Mat objects_mat = objects; detectMultiScale_4(nativeObj, ima ...

  4. java中用spring boot连接oracle数据库

    java中用spring boot连接oracle数据库 代码下载链接 百度云:https://pan.baidu.com/s/1dU_z2pUS2NSfowI4_mJ4Ow 提取码:mmlm CSD ...

  5. java多态优化多个if_脑壳疼!代码中那么多“烦人”的if else

    if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else 会让我们感到脑壳疼. 图片来自 Pexels 例如下面这个伪代码: 是不是很崩溃?虽然他是伪代码,并且看起来也 ...

  6. 怎样优化代码中那么多的if else

    if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else 会让我们感到脑壳疼. 例如下面这个伪代码: 是不是很崩溃?虽然他是伪代码,并且看起来也很夸张,但在现实中,当我 ...

  7. java 云架构_java版Spring Cloud云架构代码结构构建

    本篇我们根据架构图进行代码的构建.根据微服务化设计思想,结合spring cloud一些优秀的项目,如服务发现.治理.配置化管理.路由负载.安全控制等优秀解决方案,使用Maven技术将框架进行模块化. ...

  8. java打印一个空心六边形_六边形架构 Java 实现

    六边形架构是一种设计风格,经过分层实现核心逻辑与外部对象隔离.其核心逻辑是业务模块,外部元素是整合点,好比数据库.外部 API.界面等.它将软件分为内部与外部,内部包含了核心业务逻辑与领域层(所谓分层 ...

  9. 六边形算法java_六边形架构 Java 实现

    (给ImportNew加星标,提高Java技能) 编译:唐尤华 链接:shipilev.net/jvm-anatomy-park/2-transparent-huge-pages/ 六边形架构是一种设 ...

最新文章

  1. 小米 android 刷4.0,小米如何刷MIUI4.0系统教程
  2. 改变Android ProgressBar样式颜色
  3. c++求平均值_云顶之弈S4:六射手娱乐吃鸡!人均刮痧王,每个人都是主C
  4. 把Sql数据转换为业务数据的几种方法
  5. 2.3 线性变换引入
  6. PHP获取input中的值相同报错,laravel单元测试之phpUnit中old()函数报错解决_php实例...
  7. C++:数字逆向输出
  8. 【Vue2.0】—github小案例(二十三)
  9. 四川大学计算机专业调剂,2019四川大学计算机学院考研调剂信息(第二批)
  10. 游戏挂机计算机自己保护怎么办,游戏中遇到玩家挂机该如何应对?做好这5件事可以降低输的机率...
  11. [4.6]-AutoSAR零基础学习-CAN通信协议
  12. mt管理器小白破解之路-基础篇第一课
  13. Scrapy网络爬虫系统
  14. 禁不住诱惑?不可描述的应用之下暗藏巨大风险
  15. 外汇交易提醒 ,美元升势停不下来?
  16. LSD(线段检测测试文件)
  17. python网易云收费_小白都能学会的Python爬虫网易云音乐
  18. Visual Studio2022快速生成函数说明文档
  19. 【nlp学习】中文命名实体识别(待补充)
  20. 计算图像每行占用的字节数

热门文章

  1. “数字化医疗新利器!呼析宝电子听诊器携AI智能助力远程诊断“
  2. volatile适用场合
  3. Java发送邮箱——QQ邮箱
  4. java编译找不到符号_编译java代码时报错找不到符号
  5. 恢复Windows照片查看器
  6. 向量和矩阵的 1范数、2范数
  7. 亚马逊、Reddit及Mozilla等公司下个月将举行“网络中立”抗议活动
  8. 荣耀x30i和x20对比
  9. k均值聚类算法考试例题_KMeans (K均值)算法讲解及实现
  10. 华为FreeBuds 5降噪好不好?