mvvm 模式

MVC = Massive View Controller ?

有笑话称MVC为重量级的试图控制器。仔细一想,确实存在这个问题。以UITableViewController和UITableView举个例子。 
一般情况下,我们没有必要创建一个自定义的tableview继承自UITableView。这意味着View的模块几乎为空白。(在相当多的时候,view也仅是一个xib文件或者一堆代码用来描述控件外观和控件的位置而已)。至于Model,十分类似于JavaBean,一个类,若干属性和constructor足矣。而大量的业务逻辑的处理被放在View Controller中。

MVC的目的与不足

最初我们希望,能够把视图、模型分离开来,并用一个视图控制器去管理两者。然而,理想很丰满,现实很骨感。实际编程时,遇到种种奇奇怪怪的情况。 
例如:

  1. 涉及到网络请求放在哪里?
  2. 数据逻辑的转换放在哪里?比如把一个NSArray类型的数组转换成NSString对象并且展示出来。

要知道,视图控制器,是用来管理视图的。让它处理这些乱七八糟的逻辑,是不是显得太臃肿了,管了太多自己不应该负责的事情。 
更何况,几乎所有的视图和视图控制器都是一一对应关系。既然视图离不开控制器,控制器也必须维护一个自己管理的视图,为什么不干脆把他们结合在一起?

新的设计结构——MVVM

简单来说。MVVM就是一个经过优化的MVC,这意味着它可以兼容,也本质上还是一个MVC结构。 
所谓的MVVM架构,就是把那些Controller不应该负责的内容分离出来。单独作为一块。用MVVM的术语来说,就是把“将 Model 数据转换为 View 可以呈现的东西”这一可能极为复杂的过程剥离出来,放到ViewModel对象中。至于ViewController,嗯,你就负责管好你的视图吧。别的东西你也别负责了。(因此,网络请求也应该被剥离开来,放入ViewModel中,实际上一次网络请求,只不过是将一些不在本机存放的模型,从Json转换为可供View直接展示的数据)。 
不管是从字面(ViewModel)还是从它的具体功能以及实现来理解,视图模型(ViewModel)依然是一个模型(Model),它为View提供了可以拿来使用的数据,也从模型(Model)提取数据并加以转化处理。

以一个简单的链状结构表示MVVM架构就是 
View/ViewController ————> ViewModel ————> Model 
这里ViewController对象直接持有一个ViewModel对象。ViewModel对象又直接持有Model对象。箭头不能被反向(这是MVVM架构的基本要求)。 
这样导致了一个问题,ViewModel发生变化的时候怎么通知ViewController并且相应的改变View呢?这就是ReactiveCocoa框架要干的事情了。Model的变化怎么通知ViewModel呢?额。。。。。Model需要变么?额。。。一定非得要变的话,继续用ReactiveCocoa不就行了么。

ReactiveCocoa是何方神圣?

以C语言代码举个例子

    int a = 1;
    int b = 2;
    int c = a + b;
    printf("c = %d",c);

显然输出结果是“c = 3”。 
如果改变一下代码,增加一行。

    int a = 1;
    int b = 2;
    int c = a + b;
    a++;
    printf("c = %d",c);

显然输出结果依然是“c = 3”。 
如果我们希望c永远等于a和b的和,注意是永远等于。那么目前看来唯一的方法是每次a和b发生变化的时候重新执行c = a + b。这样的操作麻烦透了,幸运的是,iOS开发中,OC提供了KVO机制,而ReactiveCocoa框架利用了这个机制,并且进行了各种各样的拓展。

ReactiveCocoa框架有多强?

简单来说,试想一下:一个电路中有电源、开关,还有若干个小灯泡串联在一起。断开开关,所有的灯泡直接熄灭,多么简单的一件事!因为所有灯泡的亮暗直接依赖于开关的状态。而十个人居住在十个房间里,某个人起床时必须挨个通知其他九人:“我起床了”。What the huck?

举一个实际开发的例子。假设有一个注册界面,只有当输入的用户名密码满足某种逻辑的时候,注册按钮才会变为可用状态。通常我们需要实现文本框的代理函数,对于每一次文字变动,执行判断函数再去修改按钮的状态。

在ReactiveCocoa这种动态的、响应式框架下,我们要做的,就是把button的enabled属性和username.isValid && password.isValid绑定起来就可以了。

这样的逻辑实在是太棒了,在下一章中,我们一起探索ReactiveCocoa框架的实际使用。

时间: 2024-10-12 23:38:56

mvvm 模式的相关文章

企业级架构 MVVM 模式指南 (WPF 和 Silverlight 实现) 译(2)

本书包含的章节内容 第一章:表现模式,以一个例子呈献给读者表现模式的发展历程,我们会用包括MVC和MVP在内的各种方式实现一个收费项目的例子.沿此方向,我们会发现每一种模式的问题所在,这也是触发设计模式发展的原因.本章还会说明如果应用不当,MVC和MVP这些依赖.Net事件的表现模式是怎么导致内存泄漏的.本章会谈论各种表现模式的优缺点,并且留给读者自我思考的问题,如为什么用MVVM设计模式来代替MVP或是MVC.第二章:介绍MVVM,包括使MVVM魅力四射的WPF和Silverlight的各种特

企业级架构 MVVM 模式指南 (WPF 和 Silverlight 实现) 译(3)

第一章 表现模式关注分离(soc)是企业及软件开发中非常有用的核心原则,也是许多表现模式背后的驱动力量.在WPF和Silverlight开发中,MVVM成为了实现关注分离最为有效的设计模式.然而,这种模式与其他表现模式(MVC,MVP)相比实现起来相对困难.本章会以贯穿全书的账票项目的例子作为开始.在回顾表现模式的过程中,用每一种模式来实现账票项目使你更加明确它们的优劣所在,这会帮助你明白为什么要使用MVVM模式.账票项目应用例子我们从账票项目的基本功能入手,账票项目应用的UI如下所示: 当pr

转:[Silverlight入门系列]使用MVVM模式(9): 想在ViewModel中控制TreeView节点展开?

很多童鞋看了我的博客以后也去实践MVVM,但却发现Silverlight实践中的MVVM很难实现,比纯粹的CodeBehind难度大很多.首先是原来在xaml.cs的CodeBehind部分很容易控制界面逻辑,现在这部分逻辑移到ViewModel里面去了以后,就很难调用CodeBind的部分;其次是很多View和ViewModel.或者一个ViewModel多个View,他们之间如何通 很多童鞋看了我的博客以后也去实践MVVM,但却发现Silverlight实践中的MVVM很难实现,比纯粹的Co

在MVVM模式中,按钮Click事件的绑定方法

原文:在MVVM模式中,按钮Click事件的绑定方法 在MVVM模式中,我们将Button的方法写到ViewModel中,然后绑定到前端界面.通常的做法是写一个类,继承ICommand接口,然而如果按钮比较多的话,就需要写很多的类,对于后期维护造成很大的不变,微软提供了一个DelegateCommand类,可以简化开发. 使用方法如下: 首先生命ViewModel属性,GetMsg函数, public DelegateCommand GetMsg { get { return new Deleg

浅析WPF中MVVM模式下命令与委托的关系

??各位朋友大家好,我是Payne,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com.最近因为项目上的原因开始接触WPF,或许这样一个在现在来讲显得过时的东西,我猜大家不会有兴趣去了解,可是你不会明白对某些保守的项目来讲,安全性比先进性更为重要,所以当你发现银行这类机构还在使用各种"复古"的软件系统的时候,你应该相信这类东西的确有它们存在的意义.与此同时,你会更加深刻地明白一个道理:技术是否先进性和其流行程度本身并无直接联系.由此我们可以推论出:一项不流行

Ios 项目从头开发 MVVM模式(一)

1.之前的项目一直用mvc开发ios,发现ios有一个弊端,mvc里,viewcontroller里边有大量的业务逻辑,当不断的修改,会发现只是一个痛苦的过程. 2.之前做wpf,使用过mvvm模式,可以把业务逻辑放到vm模式,vm可以来处理业务逻辑.做过几个ios项目,也想过mvvm模式,但是一直没找到.偶尔看到网上有一个mvvm模式的ios项目,我来尝试从头开始做这个项目,做完之后源码会公开. 3.ok,这个mvvm开源的项目是C-41,有兴趣的可以去网上搜搜. 4.这个项目要关联到一些类

Note7:MVVM模式之数据绑定

一.资源说明 (1)本文参考自: 一步步走进WPF的MVVM模式(二):数据绑定 WPF之数据绑定总结 二.正文 数据绑定 (Data Binding)是WPF最重要的特性之一,也是实现 MVVM(WPF) 模式的一大支柱. 简而言之,数据绑定就是将两个属性绑定在一起,源属性(source)改变带动目标属性(target)一起改变.这样也减少了事件(Events)的使用. 绑定源可以是任意对象的属性,而目标必须是依赖对象的依赖属性. 绑定源主要分为以下几种场景(后面主要介绍前两种): (1)依赖

企业级架构 MVVM 模式指南 (WPF 和 Silverlight 实现) 译(1)

前言对于WPF和Silverlight来讲,MVVM是微软设计师和业内专家高度推荐的非常棒的一种设计模式.本书会探讨MVVM设计模式的一些自身缺陷以及为什么MVVM还不能成为行业内的标准设计模式.这会帮助WPF和Silverlight开发者更加理解MVVM模式. 本书会通过介绍工具,编程技术来帮助你找到最适合你项目的MVVM设计方式.实现MVVM设计模式是一个不小的挑战,本书还会帮你在企业级应用项目中解决很多常见问题. 本书会使你提高WPF和Silverlight水平,处理在编程中遇到的许多具有

Windows Phone 十一、MVVM模式

MVVM 模式介绍 模型-视图-视图模型 (MVVM) 是一种用来分离 UI 和非 UI 代码的应用设计模式 MVVM – 模型(Model) MVVM 中的 Model 与 MVC 中的一致,用于封装业务逻辑以及数据处理. Model 不依赖 View 和 ViewModel,可以独立存在,也就是说模型不关心自身被谁操作和展示. Model 中不允许有任何跟界面相关的逻辑,比如操作界面上的控件. 通常在实际开发过程中 Model 可以再被划分成 Model 和 Service,区分业务和数据.

Ios 项目从头开发 MVVM模式(三)

1.话说,本来想做个聚合查询功能,但是我的重点想研究xmpp聊天功能.所以使用mvvm模式做了完全模式51job主界面的页面. 2.首先给大家看我运行起来的界面. 3.界面很简单,做这个界面主要是为了比较mvvm模式和mvc模式之间的区别. 4.这个界面的结构是下边这张图片 与mvc相比,我多了一个viewmodel文件. mvc之前是把业务逻辑和数据放在viewcontroller里边,逻辑复杂的话,别人维护起来很麻烦. 我就不贴viewcontroller的图片了,我把这个代码上传给大家,大