一、单层结构不分层

最开始开发项目时,由于需求较少,用一个单独的工程文件就可以满足开发的需求了,不需要进行划分。

二、MVC 分层和三层

到后面需求越来越多,于是就把文件进行分解,怎么分解?有人提出了 MVC 的分层方式。

MVC 分层是一个 3 层结构,将整个应用划分为:

  • M:model 模型层,用于封装应用业务逻辑相关数据和对数据处理方法。
  • V:view 表现层,把数据展示给用户。
  • C:controller,控制器,把不同层组织起来,用来控制程序的流程。

最有名的框架就是 Spring MVC。Spring MVC 架构如下:

如果从业务角度来分 3 层:

  • 数据库访问层(DAO)
  • 业务逻辑层(Business)
  • 表现层(UI)

java 代码的包分层:

  • controller:控制层,输出数据到表示层
  • dao:数据库访问层,对数据库访问的操作
  • entity:model 实体层,把数据库表字段的映射到 java 代码
  • service:业务逻辑层business/服务层service,业务逻辑层上面可能还有一个服务层

在 java 项目中,一些资源会放在 resources 里,比如 js,css,html,配置文件等

  • resources

    • UI(CSS, HTML) 表示层

三、N 层架构

N 层架构是在三层架构上的进一步细分。

(www.herbertograca.com)

  • 原生浏览器应用程序,渲染和运行用户界面,向服务器应用发送请求;
  • 应用服务器,包括了展现层、应用层、领域层和持久化层;
  • 数据库服务器,应用服务器用它来完成数据的持久化。

这个由三层架构变化而来的 N 层架构,尽管用户界面是在客户浏览器渲染和运行,但是用户界面是在存于服务器上并在它上面编译,它解决了

客户端更新问题。

四、领域驱动设计DDD用到的架构

Eric Evans 于 2003 年出版了《领域驱动设计:软件核心复杂性应对之道》,在书中他创造了领域驱动设计方法

五、EBI 架构

EBI 架构(Entity-Boundary-Interactor,实体-边界-交互器)。

Ivar Jacobson 早在 1992 年就在他的著作 Object-Oriented Software Engineering: A use case driven approach中提出了这个模式。

那时,Jacobson 实际上把它叫做实体-接口-控制(Entity-Interface-Control),但是后来改成了 EBI,避免“接口”和编程语言中的结构“接口”混淆,以及“控制”和 MVC 中的控制器混淆。

六、端口和适配器架构(六边形架构)

2005年,Alistair Cockburn构思了端口和适配器架构 (又称六边形架构)并记录在他的博客中。

(www.herbertograca.com)

七、洋葱架构

2008 年 Jeffrey Palermo 提出了洋葱架构 。它在端口和适配器架构中贯彻了将领域放在应用中心。

(www.herbertograca.com)

它明确了端口和适配器中关于依赖的方向:

  • 外层依赖内层。
  • 内层对外层无感知。

耦合的方向是从外层指向中心,它提供了一个完全独立的对象模型(领域模型),该模型位于架构的核心,不依赖其它任何层次。我们拥有了在不影响内层的情况下改变外层的灵活性。

洋葱架构的关键原则:

  • 围绕独立的对象模型构建应用
  • 内层定义接口,外层实现接口
  • 依赖的方向指向圆心
  • 所有的应用代码可以独立于基础设施编译和运行

—— Jeffrey Palermo 2008, The Onion Architecture: part 3

八、整洁架构

Robert C. Martin(大名鼎鼎的 Uncle Bob)于2012年在他的一篇博客中发表了整洁架构的观点,并在一些会议上做了关于该架构的演讲。站在 EBI 架构、六边形架构和洋葱架构的肩膀上的架构。

九、清晰架构

https://herbertograca.com/2017/11/16/explicit-architecture-01-ddd-hexagonal-onion-clean-cqrs-how-i-put-it-all-together/

融合 DDD、洋葱架构、整洁架构、CQRS 等的架构。

十、参考

分层架构设计模式总结-MVC,洋葱架构,整洁架构,六边形架构,DDD等等的更多相关文章

  1. MVC到底是设计模式还是一种框架还是一种架构? https://www.zhihu.com/question/31079945

    具体知乎讨论内容:https://www.zhihu.com/question/31079945 MVC到底是设计模式还是一种框架还是一种架构? 我认为它是3种设计模式的演变和组合:观察者模式(Obs ...

  2. iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构

    本文由CocoaChina译者lynulzy(社区ID)翻译 作者:Bohdan Orlov 原文:iOS Architecture Patterns 在 iOS 中使用 MVC 架构感觉很奇怪? 迁 ...

  3. 朱晔的互联网架构实践心得S1E8:三十种架构设计模式(下)

    朱晔的互联网架构实践心得S1E8:三十种架构设计模式(下) [下载本文PDF进行阅读] 接上文,继续剩下的15个模式. 数据管理模式 16.分片模式:将数据存储区划分为一组水平分区或分片 一直有一个说 ...

  4. 架构模式:MVC与MVVM

    本文探讨如下几个问题: 什么是MVC 什么是MVVM MVC与MVVM对架构属性的影响 MVC实例SpringMVC MVVM实例Vue MVC.MVVM与Layer中的Model,Controlle ...

  5. iOS - 架构模式 - 解密 MVC、MVP、MVVM、VIPER架构

    在 iOS 中使用 MVC 架构感觉很奇怪? 迁移到MVVM架构又怀有疑虑?听说过 VIPER 又不确定是否真的值得切换? 相信你会找到以上问题的答案,如果没找到请在评论中指出. 你将要整理出你在 i ...

  6. 腾讯T8纯手写66个微服务架构设计模式,全部学会真的“变强”了

    微服务的概念虽然直观易懂,但“细节是魔鬼”,微服务在实操落地的环节中存在诸多挑战.我们在为企业提供PaaS.人工智能.云原生平台等数字化转型解决方案时也发现,企业实现云原生,并充分利用PaaS能力的第 ...

  7. 同事跳槽阿里P7,甩我一份微服务架构设计模式文档,看完我也去

    给所有微服务架构开发者的忠告,我想对你们说: 第一,要记住微服务不是解决所有问题的万能“银弹”. 第二,编写整洁的代码和使用自动化测试至关重要,因为这是现代软件开发的基础. 第三,关注微服务的本质,即 ...

  8. 如何结合整洁架构和MVP模式提升前端开发体验 - 整体架构篇

    本文不详细介绍什么是整洁架构以及 MVP 模式,自行查看文章结尾相关链接文章. 整洁架构粗略介绍 下图为整洁架构最原始的结构图: Entities/Models:实体层,官方说法就是封装了企业里最通用 ...

  9. MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构

    在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...

  10. Magento架构分析,Magento MVC 设计分析

    Magento架构分析,Magento MVC 设计分析 分类:Magento 标签:Magento MVC.Magento架构 669人浏览 Magento 采用类似 JAVA的架构,其扩展与稳定性 ...

随机推荐

  1. [转帖]Xargs用法详解

    https://www.cnblogs.com/cheyunhua/p/8796433.html 1. 简介 之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要, ...

  2. [转帖]setsockopt(setsockopt的使用方法及注意事项)

    http://xingzuo.aitcweb.com/9156453.html 1. setsockopt简介 setsockopt是一个系统调用函数,用于设置套接字选项.套接字是指通信的两个端点之间 ...

  3. [转帖]看6大国产CPU加速替代,谁才是“王者”选手?

    https://baijiahao.baidu.com/s?id=1761150458273739276&wfr=spider&for=pc 2023-03-23 17:33湖北匠心计 ...

  4. vue中sync的使用原来这么简单

    sync的使用场景 有些时候子组件需要修改父组件传递过来的prop, 要去改变父组件的状态的时候就需要使用aync 看见这里有些同学可能会问?? 不是说不可以修改父组件传递到子组件的值吗? 为啥要修改 ...

  5. vue3跟新视图遇见神奇现象

    场景描述 今天遇见一个问题, tableAllFun 函数中写了一个 index=1; 然后在 otherAllFun 函数中去改变这个index=2的值 奇怪的事情发生了 在视图index展示的值是 ...

  6. 关于async函数的错误处理

    1. 关于async函数的错误处理 有些时候,我们请求的接口可能会报错: 从而导致后面的代码无法去执行: 这样就会造成页面上某些状态出错! 那么怎么样才能 既能捕获到错误 还能让代码往后面执行呢 2. ...

  7. js解析上传APK文件的详细信息

    前端解析APK版本信息 需要安装这个包,可以使用cnpm或者npm npm 安装 app-info-parser ( 命令:npm install app-info-parser) APKInfo为i ...

  8. 从零开始配置 vim(6)——缩写

    关于vim能快速编辑文本的能力,我们见识到了 operator + motion ,见识到了. 范式和宏.甚至可以使用命令来加快文本编辑.在后面我们又介绍了快捷键绑定来快速执行我们想要的操作.今天我们 ...

  9. 超级AI助手:全新提升!中文NLP训练框架,快速上手,海量训练数据

    "超级AI助手:全新提升!中文NLP训练框架,快速上手,海量训练数据,ChatGLM-v2.中文Bloom.Dolly_v2_3b助您实现更智能的应用!" 1.简介 目标:基于py ...

  10. 1.6 编写双管道ShellCode

    本文将介绍如何将CMD绑定到双向管道上,这是一种常用的黑客反弹技巧,可以让用户在命令行界面下与其他程序进行交互,我们将从创建管道.启动进程.传输数据等方面对这个功能进行详细讲解.此外,本文还将通过使用 ...