当前位置:网站首页>MVC模式和三层架构
MVC模式和三层架构
2022-07-04 15:17:00 【碳烤小肥羊。。。】
MVC模式和三层架构
MVC模式
MVC(Model View Controller)是软件工程中的一种软件设计模式,它把软件系统分为模型、视图和控制器三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
MVC 是一种分层开发的模式,其中:
- M:Model,业务模型,处理业务,应用程序的核心功能,管理这个模块中用的数据和值(bean,dao)。
- C:Controller,控制器,处理请求,调用模型和视图,对用户的输入做出反应,管理用户和视图的交互,是连接模型和视图的枢纽 (servlet/service)。
- V:View,视图,界面展示,管理模型如何显示给用户,它是应用程序的外观(jsp/html)。
控制器(serlvlet)用来接收浏览器发送过来的请求,控制器调用模型(JavaBean)来获取数据,比如从数据库查询数据;控制器获取到数据后再交由视图(JSP)进行数据展示。在这个过程中,控制器其实只是起到了承上启下的作用,它只负责中转(指挥调度),不负责具体的业务操作。
MVC 优点:
- 职责单一,互不影响。每个角色做它自己的事,各司其职。
- 有利于分工协作。
- 有利于组件重用
MVC 缺点: 使得项目架构变得复杂,对开发人员要求高
三层架构
三层架构(3-tier architecture) 是将我们的项目分成了三个层面,分别是 表现层(User Interface layer)
、业务逻辑层(Business Logic Layer)
、数据访问层(Data access layer)
。
区分层次的目的即为了高内聚低耦合的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。
- 数据访问层:对数据库进行CRUD基本操作。
- 业务逻辑层:对业务逻辑进行封装,组合数据访问层中基本功能,形成复杂的业务逻辑功能。例如
注册业务功能
,我们会先调用数据访问层
的selectByName()
方法判断该用户名是否存在,如果不存在再调用数据访问层
的insert()
方法进行数据的添加操作。 - 表现层:接收请求,封装数据,调用业务逻辑层,响应数据。
而整个流程是,浏览器发送请求,表现层的Servlet接收请求并调用业务逻辑层的方法进行业务逻辑处理,而业务逻辑层方法调用数据访问层方法进行数据的操作,依次返回到serlvet,然后servlet将数据交由 JSP 进行展示。
三层架构的每一层都有特有的包名称:
- 表现层:
controller
或者web
- 业务逻辑层:
service
- 数据访问层:
dao
或者mapper
我们经常听到的SSM框架就是对不同层进行的封装:
三层架构优点:
- 开发人员可以只关注整个结构中的其中某一层。
- 可维护性高,可扩展性高。
- 可以降低层与层之间的依赖。
- 有利于标准化。
- 利于各层逻辑的复用。
三层架构缺点:
- 降低了系统的性能。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
- 有时会导致级联的修改,这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。
- 增加了开发成本。
MVC与三层架构的联系
如上图上半部分是 MVC 模式,上图下半部分是三层架构。 MVC 模式
中的 C(控制器)和 V(视图)就是 三层架构
中的表现层,而 MVC 模式
中的 M(模型)就是 三层架构
中的 业务逻辑层 和 数据访问层。
可以将 MVC 模式 理解成是一个大的概念,而 三层架构是对 MVC 模式实现架构的思想。 其实,无论是MVC还是三层架构,都是一种规范,都是奔着高内聚,低耦合的思想来设计的。
MVC与三层架构的异同
不同点
三层架构是程序设计的一种典型架构方式,确立项目后首先做的是对其进行架构设计,三层架构就是把应用程序的分层,从而降低各个模块之间的耦合。而MVC是程序的一种设计模式,即应用程序确立架构后再根据需求决定是否要采用的一种模式, 是一种使程序代码变得条理、逻辑、通用的代码规范。因此二者的区别也就显现出来了,三层架构是一种架构方式而MVC是一种设计模式(或者说是一种设计思想)。
三层架构的分层模式是典型的上下关系,上层依赖于下层。但MVC作为表现模式是不存在上下关系的,而是相互协作关系。即使将MVC当作架构模式,也不是分层模式。MVC和三层架构基本没有比较的意义,是应用于不同领域的技术。
相同点: MVC与三层架构虽然说实质是不同的,但在所达到的目的、所实现的效果是相同的,二者都是为了应用程序解耦,即使应用程序达到”高内聚,低耦合“的目的。
边栏推荐
- leetcode刷题目录总结
- APOC custom functions and procedures
- 祝贺Artefact首席数据科学家张鹏飞先生荣获 Campaign Asia Tech MVP 2022
- Why do you say that the maximum single table of MySQL database is 20million? Based on what?
- How can programmers improve the speed of code writing?
- Capvision Rongying's prospectus in Hong Kong was "invalid": it was strictly questioned by the CSRC and required supplementary disclosure
- ~88 running people practice
- Market trend report, technical innovation and market forecast of China's hair repair therapeutic apparatus
- 散列表
- 2022PMP考试基本情况详情了解
猜你喜欢
矿产行业商业供应链协同系统解决方案:构建数智化供应链平台,保障矿产资源安全供应
Embedded software architecture design - function call
Visual Studio 2019 (LocalDB)MSSQLLocalDB SQL Server 2014 数据库版本为852无法打开,此服务器支持782
一图看懂ThreadLocal
Understand ThreadLocal in one picture
World Environment Day | Chow Tai Fook serves wholeheartedly to promote carbon reduction and environmental protection
Transformer中position encoding实践
Solution du système de gestion de la chaîne d'approvisionnement du parc logistique intelligent
智慧物流園區供應鏈管理系統解决方案:數智化供應鏈賦能物流運輸行業供應鏈新模式
Application of clock wheel in RPC
随机推荐
Research Report of exoskeleton robot industry - market status analysis and development prospect prediction
FIREBIRD使用经验总结
Accounting regulations and professional ethics [8]
安信证券网上开户安全吗 开户收费吗
js中的数组筛选fliter
How to contribute to the source code of ongdb core project
Jump table instance
How can programmers improve the speed of code writing?
S2b2b solution for lighting industry: efficiently enable the industrial supply chain and improve the economic benefits of enterprises
基于wifi控制的51单片机温度报警器
C# 服务器日志模块
Position encoding practice in transformer
Learn more about the basic situation of 2022pmp examination
Software Engineer vs Hardware Engineer
China's plastic processing machinery market trend report, technological innovation and market forecast
Implement graph data construction task based on check point
中位数与次序统计量
Embedded software architecture design - function call
How to "use" Perl modules in directories that are not in @inc- How do I 'use' a Perl module in a directory not in @INC?
【云原生】服务网格是什么“格”?