从 MVC 架构到三层(3-Tier)架构

news2024/9/27 9:29:49

一、MVC 存在的痛点问题

对于业务逻辑不甚复杂的场景,MVC 尚能胜任。但随着前端 MVVM(Model-View-View-Model)开发模式的兴起,尤其是前端框架如 VueReact 的普及,服务端的 MVC 设计模式使用场景变得越来越少,因为已不再需要服务端渲染 View

此外,MVC 其实分层设计模式仍然粒度较粗:

  • Model 层级的代码既维护数据,也封装着业务逻辑,随着业务逻辑变得越来越复杂,这一层功能逻辑会变得越来越臃肿不易维护。
  • 对于团队管理来讲,ControllerModel职责边界比较模糊,对于开发人员写好代码的要求会比较高。

二、3-Tier Architecture(三层架构)

虽然有时 MVC 也被称为三层架构,但三层架构是有特定术语(3-Tier Architecture)的。

2.1 表示层 — UI

User Interface 位于三层构架的最上层,与用户直接接触,主要是 B/S 中的 WEB 页面,也可以是 API 接口。表示层的主要功能是实现系统数据的传入与输出,在此过程中不需要借助逻辑判断操作就可以将数据传送到 BLL 系统中进行数据处理,处理后会将处理结果反馈到表示层中。换句话说,表示层就是实现用户界面 / API 接口功能,将用户的需求传达和反馈,并用 BLL 或者是 Model 进行调试,保证用户体验。

2.2 业务逻辑层 — BLL

Business Logic Layer 的功能是对具体问题进行逻辑判断与执行操作,接收到表现层 UI 的用户指令后,会连接数据访问层 DAL,业务逻辑层在三层构架中位于表示层与数据层中间位置,同时也是表示层与数据层的桥梁,实现三层之间的数据连接和指令传达,可以对接收数据进行逻辑处理,实现数据的增删改查等功能,并将处理结果反馈到表示层 UI 中,实现软件功能。

2.3 数据访问层 — DAL

Data Access Layer 是数据库的主要操控系统,实现数据的增删改查等操作,并将操作结果反馈到业务逻辑层 BLL。在实际运行的过程中,数据访问层没有逻辑判断能力,为了实现代码编写的严谨性,提高代码阅读程度,一般软件开发人员会在该层中实现通用数据能力进行封装(例如通过 ORM 组件)来保证数据访问层 DAL 数据处理功能。

2.4 模型定义层 — Model

模型定义也常用 Entity 实体对象来表示,主要用于数据库表的映射对象,在信息系统软件实际开发的过程中,要建立对象实例,将关系数据库表采用对象实体化的方式表现出来,辅助软件开发中对各个系统功能的控制与操作执行。建立实体类库,进而实现各个结构层的参数传输,提高代码的阅读性。从本质上看,实体类库主要服务于表示层、业务逻辑层以及数据访问层,在三层之间进行数据参数传输,强化数据表示的简约性。

需要注意区分的是,这里的Model和MVC设计模式中的Model虽然都是一个名字但是差别巨大,职责完全不同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/354403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NetSuite Intercompany Framework 101

今朝,谈一谈Intercompany Framework,这是一个彰显NetSuite市场野心的基础功能框架。从20.2开始逐渐浮出水面,虽然经过过往的几个版本,不断推出组成功能,但目前仍然未见其全貌。 作为顾问,你必须关注它&…

详解JavaScript的形参,实参以及传参

文章目录 前言一、参数是什么?二、形参和实参 1.形参 2.实参三、传参 1.参数传递的对应关系2.两个传参的例子 总结前言 编程初学者在接触JavaScript这门语言时,很难搞懂里面的逻辑,这就会导致入门慢,入门难。这种难度一般…

Banana Pi BPI-R3 评测:详细信息、功能

Banana Pi BPI-R3 路由板著名的 Banana Pi 品牌背后的公司 Sinovoip Co., Ltd 刚刚宣布了一款名为 Banana Pi BPI-R3 的带有两个 SFP 端口的新型开源路由器。它可能是市场上首批具有内置光接口的单板路由器之一。这种出色的产品对于连接到快速光纤互联网的用户特别有益&#xf…

【PyTorch学习4】《PyTorch深度学习实践》——线性回归(Linear Regression)

目录一、实现框架二、程序实现三、代码讲解1.self.linear torch.nn.Linear(1, 1)2.model(x_data)3.criterion torch.nn.MSELoss(reductionsum),loss criterion(y_pred, y_data)一、实现框架 1、Prepare dataset 2、Design model using Class (inherit from nn.M…

【Leedcode】顺序表必备的三道面试题(附图解)

顺序表必备的三道面试题(附图解) 文章目录顺序表必备的三道面试题(附图解)前言一、第一题1.题目2.思路图解3.源码二、第二题1.题目2.思路图解3.源码三、第三题1.题目2.思路图解3.源码总结前言 本文给大家介绍三道顺序表学习过程中…

【项目精选】javaEE土地档案管理系统(源码+论文+视频)

技术:java、jsp、struts、spring、hibernate 数据库:oracle 集成开发工具:eclipse 点击下载源码 本土地项目管理系统在可行性研究的基础上,是为了进一步明确土地项目管理系统的软件需求,以便安排项目规划和进度&#x…

ARM+LINUX嵌入式学习路线

嵌入式学习是一个循序渐进的过程,如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式Linux方向,关注这个方向,大概分3个阶段: 1、嵌入式linux上层应用,包括QT的GUI开发 2、嵌入式linux系统开发 3、…

Python|每日一练|字符串|递归|链表|单选记录:字符串转换整数 (atoi)|阶乘后的零| K 个一组翻转链表

1、字符串转换整数 (atoi)(字符串) 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃…

Golang 方法笔记

Golang中的方法是作用在指定的数据类型上的,因此自定义类型都可以有方法。方法定义func (recevier type) methodName (参数列表) (返回值列表) {方法体return 返回值}基本申明和调用type A struct {Num int}func (a A) test() {fmt.Println(a.Num)}说明:…

Python快速上手系列--邮件发送--详解篇

本章就来一起学习一下跑完自动化脚本后如何自动的发送邮件到指定的邮箱。zmail操作:1. 导包 import zmail2. 邮件内容,包含:主题(subject)、正文(content_text)、附件(attachments)3. 发件人信息,包含:发件人账号&…

什么牌的运动耳机比较好、运动耳机排行榜10强

现在运动健身的潮流持续不下,而且人们长期坐于办公室办公,严重影响身体的健康,这时不论是去健身房锻炼,还是户外跑步都是非常必要的了,而蓝牙耳机作为运动必备的一款数码产品,更是受到了大家的青睐&#xf…

2023/02/18 ES6对象属性的解读

1 属性的可枚举性和遍历 <script>const obj {userName: zhaoshuai-lc,userAge: 26,userSex: male}let res Object.getOwnPropertyDescriptors(obj);console.log(res); </script>描述对象的 [ enumerable ] 属性, 称为“可枚举性”, 如果该属性为 [ false ], 就表…

如何实现外网访问内网ip?公网端口映射或内网映射来解决

本地搭建服务器应用&#xff0c;在局域网内可以访问&#xff0c;但在外网不能访问。如何实现外网访问内网ip&#xff1f;主要有两种方案&#xff1a;路由器端口映射和快解析内网映射。根据自己本地网络环境&#xff0c;结合是否有公网IP&#xff0c;是否有路由权限&#xff0c;…

0.4如何使用cmake来管理项目

如何使用cmake来管理项目 【opencv源码解析0.1】VS如何优雅的配置opencv环境 【opencv源码解析0.2】如何编译opencv库源码 【opencv源码解析0.3】调试opencv源码以及使用cmake来管理项目 前面几篇文章我们都是围绕Visual Studio 2019这个IDE来展开的&#xff0c;IDE为我们做了…

【OJ】小熊猫的肉质品

&#x1f4da;Description: 自从可爱的小熊猫来到浙商大后便再也不想吃那些膳食纤维了&#xff0c;比如&#xff1a;竹子。所以&#xff0c;骞哥&#xfeff;不得不帮助国宝寻找一些肉类来维持能量&#xff0c;使得小熊猫不至于饿死在全球某工商。但是&#xff0c;你知道的淘…

Spring Cloud Alibaba--seata微服务详解之分布式事务(三)

上篇讲述gateway的部署和使用&#xff0c;gateway统一管理和转发了HTTP请求&#xff0c;在互联网中大型项目一定存在复杂的业务关系&#xff0c;尤其在商城类软件中如淘宝、PDD等商城&#xff0c;尤其在秒杀场景中&#xff0c;并发量可以到达千万级别&#xff0c;此时数据库就会…

第五十六章 树状数组(一)

第五十六章 树状数组一、前缀和的缺陷二、树状数组1、作用2、算法分析3、算法实现&#xff08;1&#xff09;lowbits()&#xff08;2&#xff09;插入&#xff08;3&#xff09;查询三、例题1、问题题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示2、代码一、前缀和…

【SCL】1200应用项目: 四节传送带机械手模拟控制

使用SCL编写小应用:四节传送带模拟和机械手模拟控制 文章目录 目录 文章目录 前言 一、四节传送带模拟控制 1.控制要求 2.参考图 3.接线图和I/0分配 4.编写程序 1.逆序启动 2.顺序停止 3.故障输入 4.调试 5.完整代码 二、机械手控制 1.控制要求 2. 接线图和I/0分配 3.编写程序 …

JVM内存模型深度剖析与优化

1. Java语言的跨平台特性 2. JVM整体结构及内存模型 堆存放着对象信息每个线程都会分配一块属于自己的内存空间&#xff08;栈空间&#xff09; 每个方法都会分配一块内存空间&#xff08;栈桢&#xff09;&#xff0c;上图 compute()方法 和 main()方法 都会分配到各自的栈桢空…

git 学习笔记

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件,可以敏捷高效地处理任何或小或大的项目。Git 与常用的版本控制工具 CVS, Subversion 等不同&#xff0c;它采用了分布式版本库的方式&#xff0c;不需要服务器端软件支持。 一、安装配置…