MVC、MVVM
一.MVC

所谓的 MVC 是指:
- Model: 数据的拥有者,实现具体的业务逻辑。
- View: 具体的用户界面,如按钮、列表、图片。
- Controller: 负责将 View 中用户的动作传达给 Model,将 Model 的数据通过 View 展现出来。
1.View 与 Controller
View 与 Controller 的关系是十分紧密的,他们之间可以双向通信。
Controller 可以直接操作 View。在使用 Storyboard 进行界面设计时,我们可以直接拖拽现有的控件(View),再通过 Controller—Drag 就可以为各种 控件生成一种类似于句柄的 outlet来作为 ViewController 的属性,ViewController 通过 outlet 来对 View 进行操作,设置其外观、状态或者行为等等。如果是通过纯代码来编写界面,ViewController 类中就包含了控件的实例,直接通过这些实例的指针进行操作即可。
View 可以通过特殊的方式来发消息给 Controller。因为系统自定义的 View 并不知道当用户进行操作之后,Controller 需要做些什么,为了减少耦合性,采用了一些特殊的方式来与 Controller 进行通信。通信的方式有:
- IBAction。通过 Controller—Drag,XCode 会自动生成事件的响应方法。也可以使用
(void)addTarget:(id)target action:(SEL)action方法来注册事件的响应方法。 - DataSource。当系统的某些 View 在呈现时需要我们提供相应的数据。我们必须为 View 指定 DataSource,并实现相应的 DataSourceProtocol(所谓的 Protocol 是指预先定义好的一组回调函数,其中的部分是必须实现的,部分是可选的。)最典型的是 UITableView,我们必须告诉系统这个 TableView 有多少行,每行的 Cell 内容是什么。
- Delegate。它也是一组 Protocol,系统会在特定事件(如网页的跳转、网页加载)发生的前后来调用这些方法。View 可以在不知道某个类的细节的情况下,把该类设置成自己的 Delegate,只要目标类实现了 Protocol 中的必须实现的方法。这些 Protocol 中的方法的命名是有规律的,通常会包含三种关键字:
- will: 表示这个方法会在某种事件发生前调用。
- did: 表示这个方法会在某种事件发生后调用。
- should: 通常用来确定该不该让某件事发生。如
webView:shouldStartLoadWithRequest:navigationType:,它的返回值是布尔型,当返回 NO 时,WebView 将不会加载内容。
2.Model 与 Controller
Controller 直接向 Model 请求数据。一般将 Model 的类作为 Controller 的属性,直接调用相应的实例方法或者类方法即可。
Model 通过 Notification 和 KVO 将数据的变化通知给 Controller。KVO 是指 Key-value observing,是一种观察者模式的实现,可以使得 Controller 在 Model 的数据变化时能够得到通知。Notification 是另外一种系统提供的通知机制,与 KVO 的直接通知到观察者对象不同,系统提供了一个 NotificationCenter 来广播通知。两者都可以实现一对一或一对多的关系。
3.Model 与 View
他们不能相互发送信息。
二.MVVM

既然 View 和 Controller 是一对好基友,在 MVVM 里面,干脆把它们当做 View。
现在将原来 Controller 的部分职责拆分出来由 View Model 承担,主要包括:
- 校验用户输入。
- 网络请求。
- 展示层的逻辑,比如格式化字符串。
- 其他不能放入 Model,与 View 无关的逻辑。
MVVM 的优点
- MVVM 兼容 MVC,可以先创建一个简单的 View Model,再慢慢迁移。
- 低耦合。View可以独立于Model变化和修改,一个ViewModel可以绑定到不同的View上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
- 可重用性。可以把一些视图的逻辑放在ViewModel里面,让很多View重用这段视图逻辑。
- 独立开发。开发人员可以专注与业务逻辑和数据的开发(ViewModel)。设计人员可以专注于界面(View)的设计。
- 可测试性。可以针对ViewModel来对界面(View)进行测试
MVVM 最好配合 binding 机制,Model 的变化需要同步到 View Model,View Model 的变化也需要同步到 View。ReactiveCocoa 就可以用来实现 binding,当然它能做的远远不止 binding。
MVC、MVVM的更多相关文章
- 关于Xamarin、Qml、数据绑定、MVC、MVVM 相关的散讲
关于Xamarin.Qml.数据绑定.MVC.MVVM 相关的散讲 SURFSKY 2017.02 最近又在学习Xamarin了?为什么是“又”?有几个利好消息,让我重新拾起它: ()微软去年收购了X ...
- 浅谈MVC、MVVM的区别
一.概述 MVC,MVP,MVVM是三种常见的前端架构模式(Architectural Pattern),它通过分离关注点来改进代码组织方式.不同于设计模式(Design Pattern),只是为了解 ...
- MVC、MVVM、MVP小结
MVC MVC(Mode View Controller)是一种设计模式,它将应用划分为三个部分: 数据(模型).展现层(视图).用户交互(控制器). 一个事件发生的过程: ① 用户和应用产生交互 ② ...
- 前端MVC、MVVM的简单实现
MVC MVC是一种设计模式,它将应用划分为3个部分:数据(模型).展示层(视图)和用户交互层.结合一下下图,更能理解三者之间的关系.换句话说,一个事件的发生是这样的过程 用户和应用交互 控制器的事件 ...
- MVC、MVVM模式
MVC 上个世纪70年代,美国施乐帕克研究中心,就是那个发明图形用户界面(GUI)的公司,开发了Smalltalk编程语言,并开始用它编写图形界面的应用程序. 到了Smalltalk-80这个版本的时 ...
- 浅析设计模式之mvc、mvp、mvvm
mvc.mvvm.mvp是常见的设计模式,也是常见的设计思想,现对它们进行简要的归纳总结 三种模式的介绍 1.MVC:经典设计模式 View 传送指令到 Controller(控制器) Control ...
- 架构模式:MVC与MVVM
本文探讨如下几个问题: 什么是MVC 什么是MVVM MVC与MVVM对架构属性的影响 MVC实例SpringMVC MVVM实例Vue MVC.MVVM与Layer中的Model,Controlle ...
- 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM
刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code Behind到MVC.MVP.MVVM>,是前一天晚上才定的,中午花了半小时准备了下 ...
- MVC、MVP、MVVM、Angular.js、Knockout.js、Backbone.js、React.js、Ember.js、Avalon.js、Vue.js 概念摘录
注:文章内容都是摘录性文字,自己阅读的一些笔记,方便日后查看. MVC MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是 ...
随机推荐
- Motrix 全平台多功能下载工具[Windows、macOS、Linux]
Motrix的界面很朴素,使用起来其实也很方便.点击左侧的「+」图标就可以添加下载任务,跟其他的下载工具没什么区别.暂停.恢复.查看.复制,这些功能都不缺.界面也挺好看的,下载速度还会提示在图标的角标 ...
- python中模块与包的概念
在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多 ...
- mongodb安装(比较全一点)
Linux下MongoDB安装和配置详解 转:https://www.cnblogs.com/pfnie/articles/6759105.html 一.创建MongoDB的安装路径 在/usr/l ...
- Google Performance工具,你还不会用?Git走起。
2018俄罗斯世界杯如火如荼的进行中,第一轮各种冷门,让大家的确大跌眼界,尤其是那些买球的同志们,慌得一笔,还敢继续买吗?话说来,看球归看球,学习还是不能落下,我们来学习Chrome Devtool ...
- 身份认证系统(一)单WEB应用的身份认证
身份认证技术,也就是所谓的登录功能,是现代WEB系统最常见的功能之一.本系列文章就试图为大家详细的介绍身份认证技术. Basic认证模式 Basic认证模式是较早被广泛应用的一种HTTP标准提供的认证 ...
- HDU1398 Square Coins(生成函数)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- JavaBen 中 如何将字段设置为 "text" 文本类型
@Lob @Column(name="FEEDBACK_MESSAGE",columnDefinition="TEXT", nullable=true) pub ...
- mysql使用数据库
哈哈 只能怪自己太菜哈 刚接触这个MySQL没多久 今天用终端登陆MySQL的时候mysql -u root -p 然后就想看看自己的数据库 我用的MySQL的客户端是navicat for mysq ...
- linux ping命令实践
ping 解析 Linux系统的ping命令是常用的网络命令,它通常用来检测与目标主机的连通性,经常说"ping以下机器,看是否开着,不能打开网页时候,可以ping ...
- jQuery.qrcode 生成二维码,并使用 jszip、FileSaver 下载 zip 压缩包至本地。
生成二维码 引用 jquery.qrcode.js :连接:https://files.cnblogs.com/files/kitty-blog/jquery.qrcode.js .https:// ...