漫画:聊一聊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)你变了,我再变,等人家调用没有依赖,写代码需要向依赖少的方向进行,写被动式的程序比较好,因为依赖少;
©著作权归作者所有:来自51CTO博客作者mb5fd8692eb1f28的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 写了10年JAVA代码,为何还是给人一种乱糟糟的感觉?
  2. 程序员翻车时的 30 种常见反应!
  3. 工信部官宣!代码托管平台Gitee要成为中国版GitHub了?
  4. 求求你们了,别再写满屏的 if/ else 了!
  5. Python学习之pycharm的快捷键大全
  6. 快来,看看spring有多烂-来自jfinaL的嘲笑
  7. 码住!Flink Contributor 速成指南
  8. 太赞了!机器学习基础核心算法:贝叶斯分类!(附西瓜书案例及代码实现)
  9. 浅谈踢人下线的设计思路!(附代码实现方案)

随机推荐

  1. [置顶] pt-table-checksum数据一
  2. [置顶] MYSQL高级命令
  3. Ubuntu编译安装nginx,php,mysql
  4. 使用 Xtrabackup 在线对MySQL做主从复制
  5. 阿里云服务器忘记mysql的登录密码时候如
  6. 如何从MySQL DBs的不同表中提取create语
  7. 装机建项目vs2017和mysql5.7下建项目用EF
  8. 是一个mysql临时表,每个用户访问创建它的
  9. MySQL 一对多查询
  10. 中文乱码问题