本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
MVC(model- view -controller)
从MVC设计模式命名上可以直观的感受到,model指数据模型,view指用户界面,controller则是控制器。使用MVC将model和view实现代码分离,从而使同一个程序可以使用不同的表现形式。controller的存在目的是确保model和view的同步,一旦model数据发生改变,view则同步更新。
模型对象(model)
model封装了应用程序的数据,并定义处理数据的逻辑和运算。 用户在view中进行对数据的一系列操作,这些操作通过controller传达给model,最终在model中创建或更新数据对象。在MVC的三个部件中,model具有最多的数据处理任务。被模型返回的数据是独立的,与数据格式无关。于是这样一个model可以为多个视图提供数据,只需要一个模型就可以被多个视图崇勇,减少了代码的重复性。
试图对象(view)
视图是应用程序中用户可以看得见的直接操作的页面。view将自己绘制出来,并对用户的操作做出响应。view的主要功能就是现实来自应用程序模型对象(model)的数据,并使数据可被用户操作。 在MVC应用程序中,view通常与model分离。IOS应用程序中,控件、窗口等都继承字UIView(UIkit框架),主要负责UI的实现,而UIView所产生的事件(event)采用委托的方式交给UIViewController实现。
控制器对象
控制器对象(controller)在应用的view和model中充当媒介。通过controller,视图和模型对象可以相互接受到对方的更新。控制器还可以为应用程序执行设置和协调任务,管理生命周期等。
为什么要使用MVC,MVC有什么优点
1、model共享,多个视图可以共享一个model,可以更大化的重用代码
2、模型、视图和控制器分离,使对视图构造上或者数据结构的修改变得更加轻松,低耦合
MVC的缺点:
1、MVC对其三种结构并没有明确的定义,所以从应用程序开始编写的时候需要花费一些时间去规划M、V、C如何运用到其中。
2、同时,因为视图和模型需要严格的分离开,应用调试也存在麻烦。
3、需要管理更多的文件
iOS MVC设计模式
1、model和view需要严格分离,只能通过controller传递
model与view间的两条黄线表示model和view需要严格分离,controller通往model和view的白色虚线意味着可以自由的穿越它,model和view通向controller的白色实现代表可以穿越它,但是需要进行一些类似“买票”的操作。
2、Controller可以直接与Model对话(读写调用Model),model通过Notification和KVO机制与Controller间通信。
controller和 model间的绿色箭头,方向代表着“发起对话”的方向,也就是说,发起对话的是 controller,做出回答的是 model。 controller可以从 model获取各种信息。而 model只是提供信息给 controller,而不主动的向 controller通信。 controller可以导入 model的头文件,通过model的API向model要求数据。
3、Controller可以直接与View对话,通过outlet直接操作view,outlet直接对应到view中的控件,view通过action向controller报告事件的发生。controller是view直接的数据源。(controller从model中取得并加工)controller是view的代理(delegate)。
controller与view间的绿色箭头和C与M间的相同,代表C可以直接到向V进行交流。因为C要把V放置到屏幕上,并对V的属性进行设置,告诉views们什么该出现什么时候消失,所以C可以毫无限制的向V对话。
绿色箭头上outlet可以看作从C指向V的指针,在C中被定义。outlet给我们提供了极大的方便,使我们在C的内部就可以轻松准确地向V施令。C可以拥有多个outlet,这使它可以更高效的和V进行交流。
view 对 controller交流的三种不同方式
target- action
controller会在自己内部悬挂一个目标(target,如图中红白相间的靶子),对应的,它还会分发一个操作(action,图中黄色小箭头)给将要和它交流的视图(可能是一个button),当按钮被按是,action就会被发送给对应的target,这样V就可以和C交流了。但在种情况下,view只知道发送action给对应target,并不知道C中的类也不知道它自身发送了什么。
delegate
有时候view需要和controller进行同步,图中标delegate的黄色箭头分出了四个小箭头:should,will,did三种形式。should代表视图对象将询问C中的某个对象“我应该这么做吗?”,will是“我将要做这件事”,did是“我已经做了这件事”。C将自己设置为V的委托,让V知道:如果V想获得更多关于“处于某种状态下”将如何显示信息,就像C发送delegate信息。通过接受V发来的delegate信息,C就会做出相应的协调和处理。注意:每个V智能有一个delegate。
datasource
view不能拥有它所要显示的数据!V希望别人帮助他管理将要现实的数据,当V需要数据时,会请求别人的帮助,把需要的数据给它。如图中标注data source的黄色箭头,V会发送cout和data at信息给C来请求数据。 对于不同的UIView,有相应的UIView Controller,对应MVC中的C。