1.小白面试:傻傻分不清的视视图mvc mvp mvvc架构
2.什么是MVC模式?
3.ååºMVCçå·¥ä½åç
4.深入理解MVC
小白面试:傻傻分不清的mvc mvp mvvc架构
mvc mvvc mvp这三种架构模式在面试过程中的问题率还是挺高的。小白上次就遇到了,图源面试官问用过mvvc架构模式吗?这给小白问住了,视视图他只记得mvc,图源mvc组成是视视图视图、控制器、图源delphi源码笔记模型,视视图怎么还出来过mvvc模式,图源多出来的视视图v是啥呢?是面试官问错了吗?本文将讲讲这三种设计模式,让大家彻底熟悉这三种设计模式,图源以免在面试中受挫。视视图
一、图源MVC
1、视视图简介
MVC是图源最常用服务端web开发架构模式,也是视视图这三个模式中最早使用的,其它两个框架是由它的基础发展而来的。MVC的目的就是将M(模型)和V(视图)的代码分离,且MVC是单向通信,必须通过Controller来链接M和V。跟传统的WebFrom比MVC层次更加清晰、可维护性高、重用性高等特征。具体功能如下:
Model:模型层,数据模型及其业务逻辑,是针对业务模型建立的数据结构,Model与View无关,而与业务有关。
View:视图层,用于与用户实现交互的页面,通常实现数据的java 桌面项目源码输入和输出功能。
Controller:控制器,用于连接Model层和View层,完成Model层和View层的交互。还可以处理页面业务逻辑,它接收并处理来自用户的请求,并将Model返回给用户。
2、架构图
上图可以看出他们之间的通信是单向的,呈三角的形状,用户通过Controller请求,完成Model层和View层的交互。
3、MVC的优缺点
1)、优点
耦合性低:视图层和业务层分离,这样就可以更改视图层代码,而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
重用性高:由于视图层和业务层分离,多个视图可以共访问一个模型而不用单独开发,比如手机端视图和网页版视图可以访问同一个模型。
可维护性高:分离视图层和业务逻辑层也使得WEB应用更易于维护和修改,比如前端页面有问题,可以在不影响后端的情况下进行修改和发布。
在团队开发模式下表现更出众。
2)缺点
什么事物都是有两面性的,mvc也有它的ubuntu源码安装opencv缺点,比如不适合小型,中等规模的应用程序、增加系统结构和实现的复杂性、视图对模型数据的低效率访问等。
尤其是框架把业务逻辑大多集中在Controller层,这样加大了Controller的压力,Controller层与View层之间是一一对应的,也让View层的复用的可能性减小。在这种背景下就出现了mvp模式。
二、MVP
1、简介
MVP是模型-视图-表示器,它是MVC框架的晚辈,大概晚出现年,是从MVC模式演变而来的。它们各个层级的职责有相同之处:Model层提供数据,View层负责视图显示,而Presenter(Controller)层负责逻辑的处理。主要不同的是Presenter通信方向变了。具体功能如下:
Model:模型层用于数据查询以及业务逻辑,跟MVC大同小异。
View:视图层用于展示与用户实现交互的页面,通常实现数据的输入和输出功能,跟MVC大同小异。
Presenter:表示器负责连接M层和V层,从而完成Model层与View层的交互,还可以进行一些业务逻辑的处理。
2、架构图
由图可以看出Presenter起到了承上启下的网页狼人杀源码作用,View和Molde层互不干扰,完全可以把View抽出来做成组件,从复用上来说比MVC强。
3、MVP的优缺点
1)、优点
层次清晰:模块职责划分明显,接口功能清晰,Model层和View层分离,修改View而不影响Model。
重用性高:功能复用度高,方便.一个Presenter可以复用于多个View,而不用更改Presenter的逻辑。
开发职责互不影响:如果后台接口还未写好,但已知返回数据类型的情况下,完全可以写出此接口完整的功能。
2)、缺点
当然它的缺点也是明显的,由于View层和Model层都需要经过Presenter层,导致Presenter层比较复杂,维护起来比较麻烦,数据都要经过Presenter层处理,有可能出现View层和Model层数据不一致的问题,为了解决这个问题,后来又有了MVVC模式了。
三、MVVC
1、简介
mvvc模式也是在mvc模式下进行改造,也是对MVP的升级,它实现的重在数据驱动视图的一种设计模式。MVVC在View Controller与Model之间多了层View Model。View用户行为导致Model更新,View Controller会让自己持有的View Model去更新Model。
Model:模型层用于数据查询以及业务逻辑,跟MVC大同小异。obs源码分析 github
View:视图层用于展示与用户实现交互的页面,通常实现数据的输入和输出功能,跟MVC大同小异。
ViewModel层:定义数组,用来接收控制中的数据。处理回调(比如:刷新回调、点击cell回调、加载更多回调、动态视图高度回调等等),也是链接Controller和ViewModel的中间层级。它与View之间采用双向绑定,View的变动,自动反映在 ViewModel,反之亦然。
Controller:控制器,用于连接Model层和ViewModel层,完成Model层和ViewModel层的交互。还可以处理页面业务逻辑,它接收并处理来自用户的请求,并将Model返回给用户。
2、架构图
可以看出,用户输入信息,到Controller,然后反馈到ViewModel,它与View之间采用双向绑定。
3、MVVC的优缺点
1)、优点
低耦合,视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的”View”上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
可重用性,可以把一些视图逻辑放在一个ViewModel里面,可以使view重用这段视图逻辑。
独立开发,开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计.
2)、缺点
项目过于复杂,开发入门难度大点。
注意:还有MVVM模式,这种模式在VUE中得到了很好的应用,另外MVVM模式和MVVC这两者的差别比较模糊,小编查了各种资料,也未找到它们的具体不同之处,大家感兴趣可以研究一下这两者之间的差别。MVVM和MVVC模式全栈工程师面试过程中问的比较多,大家注意,特别是其中的双向绑定。
结语
本文讲述了mvc,mvp和mvvc的相关知识点。在面试过程中,后端工程师考的比较多的是MVC;mvp安卓手机软件比较常见,如果是全栈工程师mvvc问的比较多。涉及架构的深度和广度,水平有限,欢迎大家斧正。希望本文给大家带来收获,对于这三者的关系,欢迎大家留言讨论和吐槽。
什么是MVC模式?
在软件开发领域,MVC模式是一种设计原则,即模型(Model)、视图(View)和控制(Control)的分离。模型负责执行特定任务,如数据处理和业务逻辑。模型并不关心如何将这些任务以何种形式展示给用户。视图则负责显示数据和用户界面,向用户展示数据。控制层负责处理用户输入,并在模型和视图之间进行协调,使得数据能够正确更新显示。通过MVC模式,可以提高代码的可维护性和可扩展性,同时降低组件间的耦合度,使得各个部分可以独立开发和测试。这种方式使得软件开发过程更加模块化,易于管理和维护。
MVC模式的核心思想是将应用程序的逻辑和表示层分离,使得不同的团队成员可以同时工作在不同的部分,而不需要担心彼此的代码。模型层处理数据和业务逻辑,视图层展示数据和用户界面,控制层负责接收用户输入并调用模型和视图操作。这样,每个组件都专注于自己的职责,使得代码更易于理解和维护。
在MVC架构中,模型层负责数据存储、数据处理和业务逻辑。它与视图和控制层完全隔离,只提供数据访问接口,不涉及具体的表示或交互。视图层负责将模型中的数据呈现给用户,如网页、表格或图形界面。它不包含任何业务逻辑,仅负责数据的可视化。控制层处理用户输入,根据输入调用模型和视图操作,协调整个应用程序的流程。它负责接收用户输入、调用模型处理数据、更新视图展示结果,以及管理应用程序的状态。
通过MVC模式的实现,可以将应用程序分为逻辑层、表示层和控制层,使得各个组件能够独立开发、测试和维护。逻辑层负责处理数据和业务逻辑,表示层负责展示数据和用户界面,控制层负责协调用户输入和组件操作。这种方式有助于提高代码的可读性、可维护性和可扩展性,使得团队成员可以同时在不同部分工作,提高开发效率。
MVC模式强调将应用程序的逻辑、表示和控制分离,使得代码结构更加清晰、模块化。模型层处理数据和业务逻辑,视图层展示数据和用户界面,控制层协调用户输入和组件操作。这种分离设计使得代码易于理解和维护,有助于提高开发效率和软件质量。通过将应用程序分解为逻辑、表示和控制三个独立部分,MVC模式提供了一种有效的方法来组织和管理复杂应用程序的开发。
ååºMVCçå·¥ä½åç
1.å½ç¨æ·å¨æµè§å¨ä¸ç¹å»ä¸ä¸ªé¾æ¥æè æ交ä¸ä¸ªè¡¨åæ¶ï¼é£ä¹å°±ä¼äº§çä¸ä¸ªè¯·æ±ï¼requestï¼ãå½è¯·æ±ç¦»å¼æµè§å¨æ¶ï¼å®ä¼æºå¸¦ç¨æ·è¯·æ±çä¿¡æ¯ã2.请æ±ç第ä¸ç«å°è¾¾çæ¯SpringçDispatcherServletï¼å®æ¯ä¸ä¸ªå端æ§å¶å¨ï¼å·¥ä½æ¯å°ç¨æ·ç请æ±å§æç»å ¶ä»çç»ä»¶ï¼è¿éæ¯äº¤ç»Spring MVCçæ§å¶å¨ï¼å»å¤çã
è¿éDispatcherServletè¦å³å®å°è¯·æ±ä¼ ç»åªä¸ä¸ªæ§å¶å¨ï¼Controllerï¼å»å¤çï¼é£ä¹è¿æ¶å°±éè¦å¤çå¨æ å°ï¼Handler Mappingï¼äºã
å¤çå¨æ å°ä¼ç请æ±çURLä¿¡æ¯ï¼ç¶åå³å®å°è¯·æ±äº¤ç»åªä¸ä¸ªæ§å¶å¨å»å¤çãæ¯å¦è¯´æ两个æ§å¶å¨ControllerAåControllerBï¼åå«å¤çåç¼å为.htmlå.jspéæ¥ç请æ±ï¼é£ä¹å½è¯·æ±è çåç¼å为.htmlæ¶ï¼é£ä¹DispatcherServletå°±å°è¯·æ±äº¤ç»ControllerAè¿è¡å¤çã
C代表Controllerï¼è´è´£ç¨æ·çé¢åä¸å¡é»è¾å±çéä¿¡æ§å¶ï¼ä¸æ¹é¢è§£éæ¥èªç¨æ·çé¢çè¾å ¥ï¼è¯å«ç¨æ·å¨ä½ï¼å¦ç¹å»æé®çï¼ï¼è°ç¨ç¸åºModelä¸çæ¹æ³ï¼å¦ä¸æ¹é¢å¤çæ¥èªModelçäºä»¶åè¿åçæ§è¡ç»æï¼è°ç¨éå½çViewæ¾ç¤ºç»ç¨æ·ï¼Controller主è¦ç±Servletå®æã
M代表Modelï¼è´è´£æ´ä¸ªè§£å³æ¹æ¡çä¸å¡é»è¾å®ç°ï¼åºå±çæ°æ®åºä¹ç±Model访é®åæä½ï¼
V代表Viewï¼è´è´£ç³»ç»åç¨æ·çå±ç¤ºï¼ä¸»è¦ç±HTMLåJSPçå®æï¼
æå±èµæï¼MVCç»ä»¶è¯´æï¼
以ä¸ç»ä»¶é常使ç¨æ¡æ¶æä¾å®ç°ï¼
DispatcherServletï¼ä½ä¸ºå端æ§å¶å¨ï¼æ´ä¸ªæµç¨æ§å¶çä¸å¿ï¼æ§å¶å ¶å®ç»ä»¶æ§è¡ï¼ç»ä¸è°åº¦ï¼éä½ç»ä»¶ä¹é´çè¦åæ§ï¼æé«æ¯ä¸ªç»ä»¶çæ©å±æ§ã
HandlerMappingï¼éè¿æ©å±å¤çå¨æ å°å¨å®ç°ä¸åçæ å°æ¹å¼ï¼ä¾å¦ï¼é ç½®æ件æ¹å¼ï¼å®ç°æ¥å£æ¹å¼ï¼æ³¨è§£æ¹å¼çã
HandlAdapterï¼éè¿æ©å±å¤çå¨éé å¨ï¼æ¯ææ´å¤ç±»åçå¤çå¨ã
ViewResolverï¼éè¿æ©å±è§å¾è§£æå¨ï¼æ¯ææ´å¤ç±»åçè§å¾è§£æï¼ä¾å¦ï¼jspãfreemarkerãpdfãexcelçã
ç»ä»¶ï¼
1ãå端æ§å¶å¨DispatcherServletï¼ä¸éè¦å·¥ç¨å¸å¼åï¼,ç±æ¡æ¶æä¾
ä½ç¨ï¼æ¥æ¶è¯·æ±ï¼ååºç»æï¼ç¸å½äºè½¬åå¨ï¼ä¸å¤®å¤çå¨ãæäºdispatcherServletåå°äºå ¶å®ç»ä»¶ä¹é´çè¦å度ã
ç¨æ·è¯·æ±å°è¾¾å端æ§å¶å¨ï¼å®å°±ç¸å½äºmvc模å¼ä¸çcï¼dispatcherServletæ¯æ´ä¸ªæµç¨æ§å¶çä¸å¿ï¼ç±å®è°ç¨å ¶å®ç»ä»¶å¤çç¨æ·ç请æ±ï¼dispatcherServletçåå¨éä½äºç»ä»¶ä¹é´çè¦åæ§ã
2ãå¤çå¨æ å°å¨HandlerMapping(ä¸éè¦å·¥ç¨å¸å¼å),ç±æ¡æ¶æä¾
ä½ç¨ï¼æ ¹æ®è¯·æ±çurlæ¥æ¾Handler
HandlerMappingè´è´£æ ¹æ®ç¨æ·è¯·æ±æ¾å°Handlerå³å¤çå¨ï¼springmvcæä¾äºä¸åçæ å°å¨å®ç°ä¸åçæ å°æ¹å¼ï¼ä¾å¦ï¼é ç½®æ件æ¹å¼ï¼å®ç°æ¥å£æ¹å¼ï¼æ³¨è§£æ¹å¼çã
3ãå¤çå¨éé å¨HandlerAdapter
ä½ç¨ï¼æç §ç¹å®è§åï¼HandlerAdapterè¦æ±çè§åï¼å»æ§è¡Handler
éè¿HandlerAdapter对å¤çå¨è¿è¡æ§è¡ï¼è¿æ¯éé å¨æ¨¡å¼çåºç¨ï¼éè¿æ©å±éé å¨å¯ä»¥å¯¹æ´å¤ç±»åçå¤çå¨è¿è¡æ§è¡ã
4ãå¤çå¨Handler(éè¦å·¥ç¨å¸å¼å)
注æï¼ç¼åHandleræ¶æç §HandlerAdapterçè¦æ±å»åï¼è¿æ ·éé å¨æå¯ä»¥å»æ£ç¡®æ§è¡Handler
Handler æ¯ç»§DispatcherServletå端æ§å¶å¨çå端æ§å¶å¨ï¼å¨DispatcherServletçæ§å¶ä¸Handlerå¯¹å ·ä½çç¨æ·è¯·æ±è¿è¡å¤çã
ç±äºHandleræ¶åå°å ·ä½çç¨æ·ä¸å¡è¯·æ±ï¼æ以ä¸è¬æ åµéè¦å·¥ç¨å¸æ ¹æ®ä¸å¡éæ±å¼åHandlerã
5ãè§å¾è§£æå¨View resolver(ä¸éè¦å·¥ç¨å¸å¼å),ç±æ¡æ¶æä¾
ä½ç¨ï¼è¿è¡è§å¾è§£æï¼æ ¹æ®é»è¾è§å¾å解ææçæ£çè§å¾ï¼viewï¼
View Resolverè´è´£å°å¤çç»æçæViewè§å¾ï¼View Resolveré¦å æ ¹æ®é»è¾è§å¾å解ææç©çè§å¾åå³å ·ä½ç页é¢å°åï¼åçæViewè§å¾å¯¹è±¡ï¼æå对Viewè¿è¡æ¸²æå°å¤çç»æéè¿é¡µé¢å±ç¤ºç»ç¨æ·ã
springmvcæ¡æ¶æä¾äºå¾å¤çViewè§å¾ç±»åï¼å æ¬ï¼jstlViewãfreemarkerViewãpdfViewçã
ä¸è¬æ åµä¸éè¦éè¿é¡µé¢æ ç¾æ页é¢æ¨¡çææ¯å°æ¨¡åæ°æ®éè¿é¡µé¢å±ç¤ºç»ç¨æ·ï¼éè¦ç±å·¥ç¨å¸æ ¹æ®ä¸å¡éæ±å¼åå ·ä½ç页é¢ã
6ãè§å¾View(éè¦å·¥ç¨å¸å¼åjsp...)
Viewæ¯ä¸ä¸ªæ¥å£ï¼å®ç°ç±»æ¯æä¸åçViewç±»åï¼jspãfreemarkerãpdf...ï¼
åèèµæï¼ç¾åº¦ç¾ç§-MVC深入理解MVC
MVC(模型-视图-控制器)架构是软件开发中广泛使用的一种设计模式。然而,许多程序员对MVC概念的理解存在误区,错误地应用MVC,这可能导致代码组织方式不科学,影响软件的可维护性、可移植性和代码重用性。MVC包含三个主要组件:模型、视图和控制器。模型负责业务逻辑和数据管理,视图负责界面展示,控制器则协调视图和模型,处理用户输入和事件。正确的MVC应用应该将业务逻辑放在模型层,视图层负责界面展示,控制器层用于调度,确保代码的灵活性和可扩展性。错误地将业务逻辑放在控制器层,违反了面向接口编程和各层解耦的原则,导致代码难以维护和复用。因此,应遵循设计模式,将业务逻辑放入模型层,而控制器层用于协调模型与视图之间的交互,实现代码的灵活复用和高效管理。理解MVC架构背后的设计模式,如组合模式、策略模式和观察者模式,对于正确应用MVC至关重要。组合模式在视图层实现,策略模式在控制器和视图层之间实现,而观察者模式则在模型和视图层之间建立联系。遵循设计原则,合理分布代码于MVC三层之间,将极大提高软件开发的效率和质量。