Stanford iOS 8 公开课笔记 <二> -- MVC模式

           

综述:

MVC模式 --即 Model、View、Controller,是20世纪80年代,Xerox PARC 为程序语言 Smalltalk 发明的一种软件设计模式。

Xerox Palo Alto Research Center,简称Xerox PARC,即施乐帕克研究中心,是施乐公司所成立的最重要的研究机构,帕克成立于1970年,位于加利福尼亚州的帕洛阿图市(Palo Alto),坐落在山坡上,而山下就是举世闻名的斯坦福大学。


图片来自公开课Slides


      这种设计模式,如上图,将一个应用程序的所有对象分为三层:Model、View、Controller, 每层之间的通信规则都有严格的规定。这使得每一层用有非常好的独立性,以此大幅度简化开发者后续对程序的修改和扩展工作,也使得对程序中某一部分代码重复利用更为容易,使我们的程序结构更加的直观,让开发者集中精力到解决问题上来,可以说这是一种非常面向对象的设计模式,这也是这种设计模式至今为什么如此被广泛的使用的原因。


详解:


Model (模型):

实现应用程序具体功能的主体,在这里,你可以进行 保存应用程序数据、建立需要的类、实现应用程序的算法、数据管理等操作。例如,写一个计算器应用,那么,具体的计算功能,如 加减乘除 ,就应该在Model中去实现。

View (视图):

应用程序的UI部分,由交互控件组成(实则每一个控件也都是一个View),由它与用户进行交互,获取用户

Controller (控制器):

这是一个媒介,负责监听View中的用户交互事件,简称为事件,(例如点击屏幕、滑动屏幕),Controller 会将事件根据开发者设定的规则处理为数据,然后调用Model中对应的具体的功能模块处理数据,再将处理后的数据根据开发者的设定更新View,这就完成了一个完整的用户交互。

例如,一个点击计算器中 “+” 按键的交互过程: Controller监听到View中用户点击了 “+” 这个Button,就去调用 Model 中对应的加法运算方法,然后更新View -- 将运算结果显示在View当中。

交互规则:


Controller -> View/Model



如上图

Controller 指向 View 的绿色箭头,这说明的是 Controller 可以控制 View,完成UI的更新操作,而 Outlet,是指在 Controller 中声明了一个属性,这个属性指向了 View 中的某一部分。

Controller也可以向Model通信,进行调用Model中的方法等操作...

那么Model可以和View 通信吗? 不可以! 在MVC模式中,要求 Model 与 UI 完全独立,它不能涉及到任何与 UI 相关的东西。



View -> Controller


View如何与Controller通信?MVC 模式 对这种通信有如下规定:View 对 Controller 的通信必须是盲目的 -- 它不能拥有自己要展示的数据,也不能知道事件的用途。

由此,分为事件通信和数据通信两种方式。

图片来自公开课Slides


如上图

事件通信: View 只可以告诉 Controller 一个事件 ,但 View 不可以知道这个事件的用途、作用。这种通信常见的有两种方式:

一、一种用来处理简单事件的方式,就是我们在iOS开发中经常用到的 Action。例如,在 View 中放置一个滑动条 — Slider。 当用户滑动了Slider ,View 只会告诉 Controller 这个 Slider 被滑动了, 但 View 不可以知道这个 Slider 的用途。(例如,是被用来调节音量的还是调节亮度的)

二、一种用来处理复杂事件的方式,就是将Controller 设定为 View 的代理, 即 Delegate。例如我们将常用到的 ScrollViewDelegate,常见的有 did、should、will 方法。View 通过Delegate告诉 Controller ,用户对 ScrollView 的一些操作,例如 将要滑动 ScrollView 、开始滑动 ScrollView、已经滑动了ScrollView, Controller 作为 Delegate 根据这些事件去完成相应的操作,例如在 ScrollView 边界上禁止用户继续滑动。


图片来自公开课Slides

如上图

数据通信:

View不能拥有数据,它只能展示数据,而数据来自哪里?Model!然而 View 禁止和 Model 进行通信,所以就需要 Controller 作为媒介进行数据交互,这种情况,即是一种特殊的代理 -- DataSource。  Controller 作为 DataSource,常见的有 count、data、at等方法,告诉 View 如何显示数据,有多少数据等。

例如利用 TableView 展示1000首歌曲信息,TableView 不能直接拥有1000 首歌曲的信息并加载1000行列表,(这样也极为浪费内存),而应该委托 Controller 作为 DataSource ,由 DataSource 告诉 TableView 屏幕上所能一次显示的歌曲信息、每一行采用怎样的格式显示歌曲信息。当用户滑动列表,则成为一个事件交互,由 TableViewDelegate 判断是否让 DataSource 给 TableView 更多的数据信息。



Model -> Controller


图片来自公开课Slides

最后,当 Model 中的数据改变时,它如何通知给 Controller 呢? 这是一个类似于广播的方式,Model 会将自己的数据改变了这一信息广播出去,Controller 和 View 都可以接受到这一信息,但根据 MVC 模式规则, 只能让 Controller 来对这一信息作出反应。 这种方式被称为  Notification 或者 KVO 。(具体的到我学习了这一部分后会详细讲解)。


以上

                                                                                                                   2016.5.10

你可能感兴趣的:(Stanford iOS 8 公开课笔记 <二> -- MVC模式)