iOS开发与设计模式 - MVC
最近在学习GoF的设计模式这本书,粗略的浏览了一遍,真是好书。好书就应该好好读,因此很有必要从实际的言语、项目理解设计模式。
我是做iOS开发的,自然就从这方面入手。
MVC
iOS开发最基本的一个模式就是MVC, M指model,V指view,C指controller,有很多文章对它们是什么,它们的关系,它们如何交互进行了详细的说明,本文就不再展开说明了,仅放一张图供大家参考(来自斯坦福大学ios课程)
ViewController 是什么?
在iOS开发中,大量的使用ViewController,通常将其与具体的界面联系起来,并且把它当做 MVC 中controller的角色。
这常常造成ViewController的内容过多,稍微复杂一点的界面动则需要上千行的代码,难以管理。
其实这是没有理清楚ViewController的角色,因为最后一个单词是Controller而想当然地把它当做Controller了。
仔细分析一下:
首先,每个ViewController必定有一个View, 两者是绑定的,而且ViewController中有很多关于View生命周期的方法,比如didload,willappear,didappear等,
另外ViewController与界面对应,界面里有什么,viewcontroller就必须有什么,而且viewcontroller中常常有view层级的构建。
因此,在我看来可以将viewcontroller看作一个view,至少是一个特殊的view,这个view知道自己的生命周期,知道怎么转场(实际也是view的切换)。
这样一来, iOS中通常意义的 M-V-C 就变成了 M-VC, 那么真正的 C 呢 ?
再回过头来看,什么是MVC, 在设计模式这本书中,第一章引言中就对 MVC 进行了说明,以下是要点
1. MVC 分离了试图和模型,使之可以独立的变化
2. MVC 允许在不改变试图外观的情况下改变试图对用户输入的响应方式
第一点很好了解,第二点可以理解为 对用户输入的处理方式是可变的,实际上v的一部分角色就是对用户输入进行处理。
如果viewcontroller是v的话,由于viewcontroller和view是绑定的,很难去独立的变化viewcontroller(一个解决方法是viewcontroller中有大量的if,elseif 这样的语句), 这与MVC理念是相背离的:M V C这三部分应该都能独立的变化。(这也是不将viewcontroller看作controller的原因)
那么对于MVC这一模式,我们就缺少了 C , 可以独立变化的 C, 真正处理逻辑、控制的 C。如果业务发生变化,可以方便切换的C(这里又有Strategy模式的影子)。
这样,原本的iOS MVC 变成了 M-VC-C
它们的职责是:
1. M仍然是M;
2. VC 即 viewcontroller + view,负责界面的渲染,接受用户输入,并传递给 真正的 C 来处理,viewcontroller中不做任何业务逻辑的处理,主要管理view的显示和生命周期;
3. C 处理所有的业务逻辑
以上学习设计模式,关于MVC的一点心得。