做app的就绕不开这个,从开始的MFC,到后来的Mobile,Symbian s60,iphone,Android平台,开发文档中或多或少都会提及MVC模式,并声称自己的框架才是“真正的”遵循MVC模式。。。虽然一直在做app,但对于MVC的概念仍然不是很清晰----虽然定义都说的出来,实际编程的时候基本也是跟着感觉在走
最近由于项目需要,在复习iphone的app开发,里面介绍了iphone使用的MVC模式,有种豁然开朗的感觉,在这里小结一下,权当记录
开始还是简单解释一下MVC术语
M: model,模态,模型,除开程序的ui,比如标题,对话框,按钮什么的,程序的本质是什么,这个M就是什么。我的理解就是数据结构,还有算法,可能很简单,比如就一个int变量就是一个M,也可能很复杂。由于这个跟ui无关,实际跟平台也可以做到无关,平台的移植是很方便的
V: view,视图,就是程序的ui了,跟平台相关的,在iphone里面就是UIView,UIButton什么的了
C:controller,控制器。这个东西简单点就是连接M和V的东西,在设计模式中强调的解耦在这里被充分利用了
MVC简单点说就是通过C连接M和V的模式
以上这些介绍其实刚接触MVC就知道了,但具体怎么用呢?
下图是MVC的示意图
可以看到,M,V中间是双黄线,而两者跟C直接是虚线,表示M,V直接禁止互相访问,而这两者跟C在需要的时候可以访问
就像上图所示的这样,C可以直接访问M,V,而M,V禁止互相访问,上面的outlet是iphone中的概念,其他平台可以忽略掉
注意到,C到M,V都是单向的,能不能双向呢?我们先看C跟V,View是可以访问C的,但不是通过直接的方式
在iphone中有一种IBAction的机制,通常用在控件的消息响应上面,其他平台也有对应的机制,这里就是注意一下,相当于有了消息后发到C中,在C中做处理,好像记得s60里面可以在V中处理的,当时就纠结是在V还是在C中处理。。。
另外一个是delegate,相当于C/C++中的接口的概念,定义V的时候又定义一些接口,把实现留到运行时,这里就是在C中实现
最后一个data source,这个我持保留态度,是否应该是通过C在M中取呢?
总结上面的方式,那就是把C对V作为一个透明的存在,C知道V,而V不知道C,取消V对于C的依赖,就是说V不需要知道C就可以独立存在了,这样的话,替换V就容易,对于单个C对于多个V的情况从模型上面就得到了支持
下面是C和M
类似的,V也不应该直接与C通信,在iphone中使用Notification&KVO的机制,应该是类似广播的消息机制,其他平台也有对应的机制。个人觉得这里用接口来连接是不是也可以的
嗯,总结一下才发现自己的理解还是有限啊,以后还要多多研究