投身IT江湖,就像打王者光彩一样,好不容易练会了一个硬性,结果天美把它削弱了,你不得不再去练习一个。
MVC这门技能伴随着我的发展,感情和Java一样深厚,但是,最近两年却不得反面MVC说再见了。是的,不是Struts没了,也不是SpringMVC没了,而是MVC这种架构模式被淘汰了。当时代抛弃你时,连一声再见都不会说。以是,看到这篇文章的各位程序员兄弟们,紧跟技能发展趋势,再牛逼一点的,能够提前预见技能趋势,提前准备,最牛逼的,引领技能趋势,咳咳,想的有点多。
我们先回顾一下MVC吧,就像怀念一个老朋友。

MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和掌握器(Controller)。( 摘自 维基百科-MVC )
模型(Model) 用于封装与运用程序的业务逻辑干系的数据以及对数据的处理方法。“ Model ”有对数据直接访问的权力,“Model”不依赖“View”和“Controller”,Model 不关心它会被如何显示或是如何被操作。但是 Model 中数据的变革一样平常会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此 Model 的 View 必须事先在此 Model 上注册,从而,View 可以理解在数据 Model 上发生的改变。视图(View) 能够实现数据有目的的显示。在 View 中一样平常没有程序上的逻辑。为了实现 View 上的刷新功能,View 须要访问它监视的数据模型(Model),因此该当事先在被它监视的数据那里注册。掌握器(Controller) 起到不同层面间的组织浸染,用于掌握运用程序的流程。它处理事宜并作出相应。“事宜”包括用户的行为和数据 Model 上的改变。Struts和SpringMVC曾经是MVC双雄。
那是什么导致MVC模式被淘汰了呢?移动时期的到来,展示端愈来愈主要,以是前端技能发展越来越剧烈,前端工程师也不再是团队的小弟了,他们哀求和Java工程师平等对话。
前后端分离来了,Node.js来了,前端工程师把MVC的职责都给抢走了,后端工程师真正成为了后端,只须要供应API给前端就行,再也不用关心redirect\forward有什么差异,再也不用关心session、cookies有什么差异,怎么样。当前端工程师拿走MVC的职责之后,自然会把MVC模式改成更适宜前真个模式:MVVM。
MVVM(Model–View–Viewmodel)也是一种软件架构模式,它必将取代MVC,或者说的好听一些,它是MVC根本上蜕变而来。
MVC中的M便是纯挚的从网络获取回来的数据模型,V指的我们的视图界面,而C便是我们的ViewController。
在个中,ViewController卖力View和Model之间调度,View发生交互事宜会通过target-action或者delegate办法回调给ViewController,与此同时ViewController还要承担把Model通过KVO、Notification办法传来的数据传输给View用于展示的任务。随着业务越来越繁芜,视图交互越繁芜,导致Controller越来越臃肿,负重前行。脏活累活都它干了,到头来还一点不谄媚。福报修多了的结果便是,弗成了就重构你,重构不了就换掉你。
来一张斯坦福老头经典的MVC架构图。
所以为理解决这个问题,MVVM就闪亮登场了。他把View和Contrller都放在了View层(相称于把Controller一部分逻辑抽离了出来),Model层依然是做事端返回的数据模型。而ViewModel充当了一个UI适配器的角色,也便是说View中每个UI元素都该当在ViewModel找到与之对应的属性。除此之外,从Controller抽离出来的与UI有关的逻辑都放在了ViewModel中,这样就减轻了Controller的包袱。
这张图是从网上找的,MVVM还在学习阶段,后续补一张自己的
从以上的架构图中,我们可以很清晰的梳理出各自的分工。
View层:视图展示。包含UIView以及UIViewController,View层是可以持有ViewModel的。ViewModel层:视图适配器。暴露属性与View元素显示内容或者元素状态逐一对应。一样平常情形下ViewModel暴露的属性建议是readOnly的,至于为什么,我们在实战中会去阐明。还有一点,ViewModel层是可以持有Model的。Model层:数据模型与持久化抽象模型。数据模型很好理解,便是从做事器拉回来的JSON数据。而持久化抽象模型暂时放在Model层,是由于MVVM出身之初就没有对这块进行很细致的描述。按照履历,我们常日把数据库、文件操作封装成Model,并对外供应操作接口。(有些公司把数据存取操作单拎出来一层,称之为DataAdapter层,以是在业内会有很多MVVM的变种,但实在质上都是MVVM)。Binder:MVVM的灵魂。可惜在MVVM这几个英文单词中并没有它的一席之地,它的最紧张浸染是在View和ViewModel之间做了双向数据绑定。如果MVVM没有Binder,那么它与MVC的差异不是很大。总结来说,MVC模式本来是完美的,但是随着移动时期的到来,前端数据展示、交互、跳转变得繁芜了,Controller的只能真的不适宜在放到后端了,以是MVVM就涌现了。
后面的文章中会连续阐述MVVM、SPA等前真个架构模型,就像练一个天美的新英雄一样。