六边形架构或六角架构是Alistair Cockburn在2005年提出,解决了传统的分层架构所带来的问题,实际上它也是一种分层架构,只不过不是上下或左右,而是变成了内部和外部。在领域驱动设计(DDD)和微服务架构中都出现了六边形架构的身影,在《实现领域驱动设计》一书中,作者将六边形架构应用到领域驱动设计的实现,六边形的内部代表了application和domain层,而在Chris Richardson对微服务架构模式的定义中,每个微服务使用六边形架构设计,足见六边形架构的重要性。那么让我们一探究竟,它为何如此受青睐。

问题

传统的分层架构具有广泛的应用,例如经典的三层架构,把系统分为表示层、业务逻辑层、数据访问层。在Martin Fowler的《企业应用架构模式》一书中做过深入阐述,本书04年出版,时至今日分层架构仍然是常用的设计方法,分层架构可以降低耦合、提高复用、分而治之,但同时也还是存在一些问题:

应用逻辑在不同层泄露,导致替换某一层变得困难、难以对核心逻辑完整测试:你是否有过困惑,代码到底应该放在哪个层,虽然定义了各层的职责,但是总有人不严格遵循层次的分界,对于三层架构,常常会出现业务逻辑写在了表示层,或者业务逻辑直接和数据访问绑定。

传统的分层架构是一维的结构,有时应用不光是上下的依赖,可能是多维的依赖,这时一维的结构就无法适应了。

六边形架构又称为端口-适配器,这个名字更容器理解。六边形架构将系统分为内部(内部六边形)和外部,内部代表了应用的业务逻辑,外部代表应用的驱动逻辑、基础设施或其他应用。内部通过端口和外部系统通信,端口代表了一定协议,以API呈现。一个端口可能对应多个外部系统,不同的外部系统需要使用不同的适配器,适配器负责对协议进行转换。这样就使得应用程序能够以一致的方式被用户、程序、自动化测试、批处理脚本所驱动,并且,可以在与实际运行的设备和数据库相隔离的情况下开发和测试。

内涵

六边形架构的重点体现在以下几个方面:

关注点

对于分层架构中层次的界定,Martin Fowler给出了一个判定的方法,就是如果把表示层换成其他实现,如果和原来的表示层有重复实现的内容,那么这部分内容就应该放到业务逻辑层。那么如何让开发人员在系统设计过程中始终保持这种视角,传统的分层架构是难以做到的。六边形架构有一个明确的关注点,从一开始就强调把重心放在业务逻辑上,外部的驱动逻辑或被驱动逻辑存在可变性、可替换性,依赖具体技术细节。而业务逻辑相对更加稳定,体现应用的核心价值,需要被详尽的测试。

外部可替换

一个端口对应多个适配器,是对一类外部系统的归纳,它体现了对外部的抽象。应用通过端口为外界提供服务,这些端口需要被良好的设计和测试。内部不关心外部如何使用端口,从一开始就要假定外部使用者是可替换的。六边形的六并没有实质意义,只是为了留足够的空间放置端口和适配器,一般端口数不会超过4个。适配器可以分为2类,“主”、“从”适配器,也可称为“驱动者”和“被驱动者”。

自动测试

在六边形架构中,自动化测试和用户具有同等的地位,在实现用户界面的同时就需要考虑自动化测试。它们对应相同的端口。六边形架构不仅让自动化测试这件事情成为设计第一要素,同时自动化测试也保证应用逻辑不会泄露到用户界面,在技术上保证了层次的分界。

依赖倒置

六边形架构必须遵循如下规则:内部相关的代码不能泄露到外部。所谓的泄露是指不能出现内部依赖外部的情况,只能外部依赖内部,这样才能保证外部是可以替换的。对于驱动者适配器,就是外部依赖内部的。但是对于被驱动者适配器,实际是内部依赖外部,这时需要使用依赖倒置,由驱动者适配器将被驱动者适配器注入到应用内部,这时端口的定义在应用内部,但是实现是由适配器实现。

android 六边形简书,深入理解六边形架构相关推荐

  1. android计步器简书,自定义View-仿QQ运动步数进度效果

    自定义View-仿QQ运动步数进度效果 一.写在前面 (1) 图一,仿QQ步数运行效果 (2) 图二,完整的圆效果 完整代码请看这 二.正文开始 (1)首先来个三部曲,自定义属性,布局设置,属性获取 ...

  2. android 仿简书评论,Android 开发仿简书登录框可删除内容或显示密码框的内容

    简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...

  3. android 仿简书评论,Android仿简书搜索框效果的示例代码

    前言 之前用简书的时候一直是在web端,后来下载了客户端,看到了搜索的那个动画,就尝试的去写了,没写之前感觉挺容易的,写了之后,就感觉里面还是有些要注意的东西的.话不多说,直接上图. Activity ...

  4. android ffmpeg 简书,偶遇FFmpeg(三)——Android集成

    熟悉命令之后,自然是对其根据自己的需求进行应用了.所以久等的第三编文章就来放放水.记录一下在Android端的集成. 文章组织架构 接下来几遍文章将会按照以下结构来进行组织. 编译FFmpeg For ...

  5. android jsoup简书,jsoup爬虫简书首页数据做个小Demo

    昨天LZ去面试,遇到一个大牛,被血虐一番,发现自己基础还是很薄弱,对java一些原理掌握的还是不够稳固,比如java反射注解,知道一点就是说不出来,很尴尬... 生命不止,学习不止啊 之前那个项目 Q ...

  6. Android仿简书、淘宝等APP View弹出效果

    在用简书App的时候觉得这个View的弹出效果特别好,而且非常平滑. 先看看效果: 主要是scale,alpha,translation几个普通动画组合,这里不再分析. 实现效果图: 代码:https ...

  7. android仿简书编辑器,类似zine,简书的app移动编辑器-Light Seven

    原标题:类似zine,简书的app移动编辑器-Light Seven 无论你是否从事文字编辑工作,我相信每个人都会接触到文字编辑.既然接触到文字编辑,顺理成章的就会接触到文字编辑的应用和软件. 在生活 ...

  8. android rxjava2 简书,RXJava2学习

    什么是RxJava 一个可观测的序列来组成异步的.基于事件的程序的库.(简单来说:它就是一个实现异步操作的库) RxJava 好在哪? RxJava 其实就是提供一套异步编程的 API,这套 API ...

  9. android 65536 简书,app编译打包时的65536问题

    两种情况,第一种: 第一种non-jumbo instruction UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexIndexOverflowE ...

最新文章

  1. 梯度下降(Gradient Descent)的收敛性分析
  2. hadoop浅尝 第一个hadoop程序
  3. 文件处理-写模式操作文件
  4. 利用python制作漂亮的词云图_利用python制作漂亮的词云图
  5. vue --- 模块从子组件获取数据
  6. 分享一个JAVA专业接口开发利器,牛牛牛新鲜出炉!!!
  7. wordpress页面里可不可以写php,WordPress开发中如何在html中包含php
  8. 在 Linux 上使用 Docker 安装 Portainer
  9. 新手必须知道的典型自动脱螺纹注射模设计!!!
  10. java game nokia 5233 model,诺基亚S60/^3完美运行GBA游戏教程 重回孩提时代
  11. 融云 SDK 5.0.0 功能迭代
  12. Sybase数据库按条件导出数据文件
  13. Oracle LiveLabs实验:Application Continuity Fundamentals
  14. 开源蜜罐T-pot 19.03安装和使用
  15. CNDS 创建属于自己的专栏
  16. 工业软件CAD、CAE、CAM介绍
  17. 如何抢注好的top域名
  18. VB 任意随机数(N-M)的通用函数(单取、多取存入数组、排序等功能) 内附随机数介绍
  19. 读者言论经典 [ 光影人像 东海陈光剑 的博客 ]
  20. 深度学习100例-循环神经网络(RNN)实现股票预测 | 第9天

热门文章

  1. 【Spring注解】@Condition条件注册
  2. EventBus3.0开发详解 近万开发者收藏
  3. drm linux 内核,Linux内核DRM实现分析——基于i915
  4. 树莓派python蓝牙_Fen9Pi-05.树莓派 UNO蓝牙通信
  5. java 在线rsa解密_通用的Java RSA加密工具类,可在线验证通过
  6. php 上个月天数,php日期所在月的天数_PHP教程
  7. Netty详解(七):Netty 编解码以及消息头编解码器
  8. 如何用Java做玫瑰花数_c语言如何输出玫瑰花数?(代码示例)
  9. docker导入MySQL文件_Docker容器中Mysql数据的导入/导出详解
  10. c++ 句柄 计算控件坐标_练习答案|| 计算机基础第【28】期