mvc
其实之前个人对于MVC的设计模式只是一个很懵懂的认识,自从看了iOS官方文档的解释和standford公开课的课件,就发现原来在iOS中是这么回事
Model
encapsulate data and basic behaviors,What your application is (but not how it is displayed )
功能:封装App要用到的数据并定义相关的逻辑操作,Model和其他model存在相关relation(一对一,一对多,多对多等),数据要进行持久化(存在文件或者数据库中来进行重用),model只关心数据,只定义相关数据和操作,不去关心用户界面。
communication: 用户操作通过controller来更改Model,Model的相关数据的更改来通知Controoler去更新View
View
present information to the user (your controller’s minions)
功能:在应用程序中展示用户可以看见的界面以及相应相关用户操作,View视图的更新是通过Controller操作的,当然了视图是可以缓存数据来提升程序性能,视图应该是可复用和可配置化的,因此UIKit中提供了大量的View object,诸如TableView,ScrollView
Controller
tie the model to the view(How your model is presented to the user UI logic)
功能:是视图和模型的中间者,视图的更新都是控制器从model中取出数据进行更新
- mediating controller 中介控制器
- coordinating controller 协调控制器
SmallTaclk中的MVC
- Composite: View object有多个视图嵌套组成
- Strategy: controller object给一个或者多个view object实现策略,view object委托controller来处理相关的接口行为
- Observer:
Cocoa中得MVC
Cocode跟传统的MVC设计方式最大的不同在于把View和Model中得通信删去了,view不能观察model的数据状态的改变来更新自己的view,原因主要在于View和model设计成高度复用的Object,去掉view和object的联系就是内聚解耦的过程
其中官网是这么解释的:
- 如果在程序中使用绑定机制,如果视图能直接观察到模型中的属性,那么NSController及其子类的优势(selection and placeholder)不会体现出来
- 如果不使用绑定机制,对于一个已经存在的视图必须子类化来观察model的改变
最后来看一下stanford这张图
这张图把iOS中model,view,controller的关系阐述的真心简洁明了,鞭辟入里啊!!
Controller and View
- controller通过outlet来控制view上面的object
- view通过target-action来controller来响应响应的事件
- controller来设置自己作为view的委托,实现view中控件对应的事件protocol
- controller总是view的data source,用Model信息来更新view或者根据view来收集model信息
Controller and model
Model主要是通过广播机制(KVO)来通知controller自身信息的更改
view and model
两者不应该有任何关系,The model should be UI independent.(理由前面已经叙述了)
MVC优点
- 代码重用(多个视图可以共享一个模型,主要因为我们已经把数据和业务logic从表示层分开了)
- 更好地定义接口
- 良好的扩展性
MVC缺点
完全理解MVC模式不是特别容易(特别对于我等工程经验不足的人,有时候还是只能从表面意义上体会他的好处)