分层架构设计模式总结-MVC,洋葱架构,整洁架构,六边形架构,DDD等等
一、单层结构不分层
最开始开发项目时,由于需求较少,用一个单独的工程文件就可以满足开发的需求了,不需要进行划分。
二、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 架构、六边形架构和洋葱架构的肩膀上的架构。
九、清晰架构
融合 DDD、洋葱架构、整洁架构、CQRS 等的架构。
十、参考
- https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1/
- https://herbertograca.com/2017/07/03/the-software-architecture-chronicles/
- https://herbertograca.com/2017/09/07/domain-driven-design/
- https://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html
- https://www.jianshu.com/p/d87d5389c92a 洋葱架构(译)
- https://www.jianshu.com/p/395814410cf5 EBI 架构(译)
分层架构设计模式总结-MVC,洋葱架构,整洁架构,六边形架构,DDD等等的更多相关文章
- MVC到底是设计模式还是一种框架还是一种架构? https://www.zhihu.com/question/31079945
具体知乎讨论内容:https://www.zhihu.com/question/31079945 MVC到底是设计模式还是一种框架还是一种架构? 我认为它是3种设计模式的演变和组合:观察者模式(Obs ...
- iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构
本文由CocoaChina译者lynulzy(社区ID)翻译 作者:Bohdan Orlov 原文:iOS Architecture Patterns 在 iOS 中使用 MVC 架构感觉很奇怪? 迁 ...
- 朱晔的互联网架构实践心得S1E8:三十种架构设计模式(下)
朱晔的互联网架构实践心得S1E8:三十种架构设计模式(下) [下载本文PDF进行阅读] 接上文,继续剩下的15个模式. 数据管理模式 16.分片模式:将数据存储区划分为一组水平分区或分片 一直有一个说 ...
- 架构模式:MVC与MVVM
本文探讨如下几个问题: 什么是MVC 什么是MVVM MVC与MVVM对架构属性的影响 MVC实例SpringMVC MVVM实例Vue MVC.MVVM与Layer中的Model,Controlle ...
- iOS - 架构模式 - 解密 MVC、MVP、MVVM、VIPER架构
在 iOS 中使用 MVC 架构感觉很奇怪? 迁移到MVVM架构又怀有疑虑?听说过 VIPER 又不确定是否真的值得切换? 相信你会找到以上问题的答案,如果没找到请在评论中指出. 你将要整理出你在 i ...
- 腾讯T8纯手写66个微服务架构设计模式,全部学会真的“变强”了
微服务的概念虽然直观易懂,但“细节是魔鬼”,微服务在实操落地的环节中存在诸多挑战.我们在为企业提供PaaS.人工智能.云原生平台等数字化转型解决方案时也发现,企业实现云原生,并充分利用PaaS能力的第 ...
- 同事跳槽阿里P7,甩我一份微服务架构设计模式文档,看完我也去
给所有微服务架构开发者的忠告,我想对你们说: 第一,要记住微服务不是解决所有问题的万能“银弹”. 第二,编写整洁的代码和使用自动化测试至关重要,因为这是现代软件开发的基础. 第三,关注微服务的本质,即 ...
- 如何结合整洁架构和MVP模式提升前端开发体验 - 整体架构篇
本文不详细介绍什么是整洁架构以及 MVP 模式,自行查看文章结尾相关链接文章. 整洁架构粗略介绍 下图为整洁架构最原始的结构图: Entities/Models:实体层,官方说法就是封装了企业里最通用 ...
- MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构
在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...
- Magento架构分析,Magento MVC 设计分析
Magento架构分析,Magento MVC 设计分析 分类:Magento 标签:Magento MVC.Magento架构 669人浏览 Magento 采用类似 JAVA的架构,其扩展与稳定性 ...
随机推荐
- [转帖]TiDB的tikv节点的压缩算法
简介:TiDB的tikv节点实用的RocksDB,RocksDB的默认压缩算法为:[no:no:lz4:lz4:lz4:zstd:zstd] RocksDB 每一层数据的压缩方式,可选的值为:no,s ...
- [转帖]SpringBoot项目banner.txt生成教程
文章目录 近期在做毕业设计,后端框架用到了SpringBoot,可以自己个性化设置banner.txt 地址:https://www.bootschool.net/ascii 可以直接下载,然后直接将 ...
- [转帖]ubuntu下配置iptables、ufw端口转发
iptables 端口转发(CentOS) 注意:一来一去 在中转服务器操作 iptables -t nat -A PREROUTING -p tcp --dport [端口号] -j DNAT -- ...
- [转帖]Linux IO调度之队列、队列深度
有关数据结构 请求队列:struct request_queue 请求描述符:struct request 队列深度 可以在端口队列中等待IO请求数量: 具体代表其值的是request_queue的成 ...
- [转帖]docker编译speccpu2017
实验步骤: 1.下载docker和speccpu2017 2.docker下载镜像,创建容器 3.将下载的宿主机speccpu2017拷贝到docker创建的容器中(docker cp) 4.在doc ...
- [转帖]awk命令 去掉重复行
https://developer.aliyun.com/article/885946?spm=a2c6h.24874632.expert-profile.263.7c46cfe9h5DxWK lin ...
- [转帖]总结:nginx502:Tomcat调优之acceptCount
问题背景:UI页面点击会偶尔返回error,检查调用日志,发现nginx报502报错,因此本文即排查502报错原因. 如下红框可知,访问本机个备机的服务502了,用时3秒左右(可见并不是超时) 先给出 ...
- R2M分布式锁原理及实践
作者:京东科技 张石磊 1 案例引入 名词简介: 资源:可以理解为一条内容,或者图+文字+链接的载体. 档位ID: 资源的分类组,资源必须归属于档位. 问题描述:当同一个档位下2条资源同时审批通过时, ...
- SpringBoot中Bean的条件装配
目录 概述 Profile Conditional ConditionalOn ConditionalOnProperty 概述 众所周知,SpringBoot最腻害的地方就是容器,开发人员的日常工作 ...
- echarts中坐标与标签刻度对齐
xAxis: { data: ["土地.房屋及建筑物", "遇用设备", "遇用设备", "裤子", "家具. ...