说说MVVM

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了说说MVVM相关的知识,希望对你有一定的参考价值。


说说MVVM


前言

关于软件架构模式(确切的说是一种软件编码规范或者软件开发模式),这几年骂战不断。争论的焦点主要是在MVC、MVVM、MVP哪种架构最好,哪种架构才是最牛逼的、扩展性更强的、可维护性更高的。MVP讲道理现在都没怎么用过,用的最多的还是MVC设计模式,今天侧重一下MVVM吧


什么是MVVM

MVVM(Model–View–Viewmodel)是一种软件架构模式。

MVVM有助于将图形用户界面的开发与业务逻辑或后端逻辑(数据模型)的开发分离开来,这是通过置标语言或GUI代码实现的。MVVM的视图模型是一个值转换器, 这意味着视图模型负责从模型中暴露(转换)数据对象,以便轻松管理和呈现对象。在这方面,视图模型比视图做得更多,并且处理大部分视图的显示逻辑。 视图模型可以实现中介者模式,组织对视图所支持的用例集的后端逻辑的访问。详细介绍链接:​​https://zh.wikipedia.org/wiki/MVVM​

简单的讲就是:

MVVM是MVC的改进版。我们都知道MVC软件架构模式是苹果推荐的开发模式。

MVC中的M就是单纯的从网络获取回来的数据模型,V指的我们的视图界面,而C就是我们的ViewController。

说说MVVM_软件架构


当开发业务逻辑越来越复杂,Controller越来越庞大,这个时候一般就想着重构啊,重构不了怎么办?之前的代码不是我写的,这不累死去?TM这里面上万行代码呀,怎么改咯?就因为这样,所以出现了MVVM,它把View和Contrller都放在了View层(相当于把Controller一部分逻辑抽离了出来),Model层依然是服务端返回的数据模型。而ViewModel充当了一个UI适配器的角色,也就是说View中每个UI元素都应该在ViewModel找到与之对应的属性。除此之外,从Controller抽离出来的与UI有关的逻辑都放在了ViewModel中,这样就减轻了Controller的负担。

梳理一下:
  • 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的差异不是很大。

正是因为View、ViewModel以及Model间的清晰的持有关系,所以在三个模块间的数据流转有了很好的控制。

盗了个图:

说说MVVM_mvc_02


结合RAC

ReativeCocoa相信大家并不陌生,这个函数响应式框架在Github中已经有将近2w star 。RAC是个非常优秀的框架,它可以独立于MVVM而存在。** 如果只是把它理解成MVVM中View和ViewModel Binder角色的话,那就有点大材小用了。** 本文不会对RAC进行展开分析,感兴趣的可以自行实践一下。
RAC特点:

  • 语法怪异,杂交种。(函数式+响应式编程组合)
  • 万物皆可盘。(事件信号RACSignal贯穿整个框架)
  • 把离散的函数调用撺成一坨?。
总结总结:RAC是一种编程思维的改变,所以其缺点很明显,学习成本很大
代码,没有,后面再补吧


以上是关于说说MVVM的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯-作物杂交(C++)

第十一届蓝桥杯 ——作物杂交

第十一届蓝桥杯 ——作物杂交

能说说vue的响应式原理吗?

WPF 微信 MVVM 续发送部分QQ表情

silverlight wcf mvvm