漫画:聊一聊MVC、MVP、MVVM?
无敌码农 无敌码农
过了几天...
MVC的前世今生
说起MVC大家并不会太陌生,只要进入Java开发领域MVC的概念就会响彻你的耳旁。不过如果有人问你什么是MVC你会怎么回答呢?
......
在开发过程中很多同学认为Mode层=DB层,这是一个非常大的误区,虽然Mode很容易让人理解为模型,但实际上Mode层并不等于DB,而是包含了所有的业务逻辑,这其中就包括Service层及Dao层的逻辑。
而Controller层则只用于控制流程,由于很多同学认为Service属于Controller层从而导致了Controller层的业务代码量巨大!
事实上的确有不少同学虽然正确理解了MVC,也认同Mode层包含All Logic,只不过在具体定义业务层逻辑时并没有合理地对业务逻辑代码进行良好的责任区分,从而导致逻辑代码非常长阅读和UT起来比较困难!
如何持续提升?这里有一个比较可行的方法分享给大家,就是建议大家养成持续编写UT的习惯,由于UT测试需要Mock不同的组件,因此一旦发现UT无法写下去的时候此时就需要考虑对代码逻辑进行合理的重构,如此反复才能持续提升代码编写水平!
实际上MVC的概念最早来源于Java SE版本,那时候Java Swing视窗系统刚刚兴起,人们发现复杂的UI+Java业务逻辑代码耦合在一起实在让人抓狂,于是有人提出了MVC模式!
进入这个阶段后,陆续出现了一些Java Web MVC开发框架,例如我们早期使用得非常广泛的Struts1/2框架,在Struts中Controller层由Servlet类型的对象Action Servlet承载,主要用于接收用户请求;Mode层为Action对象及ActionForm对象,Action用于封装处理业务逻辑模块,而ActionForm对象则用于封装客户端提交的数据并以一组JavaBean的形式存放数据;而View部分则主要以Jsp为主。
这个时候Java逐步退出View层,而成为一门以后端服务器开发为主的语言!此后前端技术的发展变化多端,陆续出现出现了很多的开发框架,目前主流的前端开发框架主要以JS、JQuery、Angular JS、React、Vue等为主。
MVP从而何来
MVP(Model-View-Presenter),在思想上MVP与MVC的理念是相同的,它侧重的场景是对MVC模式中V层的管理。Presenter的英文含义为“代言人”的意思,因此在MVP模式中View并不直接使用Model,而是通过Presenter与Model之间交互,类似于MVC中的Controller层。
MVVM是什么
MVVM即Model-View-ViewModel,在该模式下要求通过DOM事件监听实现Model层与View层数据双向绑定,示意图如下:
在实际的开发时间中Model与View是很难分开的,除非M/V在同一个本地环境才好实现,而在现在的前后端分离架构中,由于处处都需要网络交互,所以要实现互联网时代的MVVM模式是很难行得通的!Google在早期推出过一个跨网络的MVVM框架JSF,但被应用得并不广泛!
总结
- 在MVC模式中M=(S+DAO)而S的复杂性需要通过设计模式+软件结构设计加以解决;
- MVC是一种软件架构方式,而M层的良好设计则依赖于软件结构;
- 主动式&被动式(React)你变了,我再变,等人家调用没有依赖,写代码需要向依赖少的方向进行,写被动式的程序比较好,因为依赖少;