读书笔记-常用设计模式之MVC
1、MVC(Model-View-Controller,模型-视图-控制器)模式是相当古老的设计模式之一,它最早出现在SmallTalk语言中。MVC模式是一种复合设计模式,由“观察者”(Observer)模式、“策略”(Strategy)模式和“合成”(Composite)模式等组成。MVC模式由3个部分组成,如图

模型:保存应用数据的状态,回应视图对状态的查询,处理应用业务逻辑,完成应用的功能,将状态的变化通知视图。
视图:为用户展示信息并提供接口。用户通过视图向控制器发出动作请求,然后再向模型发出查询状态的申请,而模型状态的变化会通知给视图。
控制器:接收用户请求,根据请求更新模型。另外,控制器还会更新所选择的视图作为对用户请求的回应。控制器是视图和模型的媒介,可以降低视图和模型的耦合度,使视图和模型的权责更加清晰,从而提高开发效率。
对应哲学中的“内容”与“形式”,在MVC模型中,模式是“内容”,它存储了视图所需要的数据。视图是“型式”,是外部表现方式,而控制器是它们的媒介。
2、上面我们讨论的是通用的MVC模式,而Cocoa和Cocoa Touch框架中的MVC模式与传统的MVC模式略有不同,前者的模型与视图不能进行任何通信,所有的通信都是通过控制器完成的,如下图。




接下来我们通过一个案例来分析Cocoa Touch中MVC模式的运作过程,案例界面如上图(中)。
打开MVCSample工程,其中包括的文件有AppDelegate.h、AppDelegate.m、ViewController.h、ViewController.m和MainStoryboard.storyboard。
AppDelegate是应用程序委托对象,ViewController是视图控制器,但没有看到视图和模型。打开故事板文件,可以看到ViewController Scene(上图右),就能看到View,其中直接使用了UIKit框架中的UIView,因此在MVCSample组中没有视图,属于视图的还有Button和Text Field,他们是View的子视图。那么模型对象在哪呢?模型对象很特殊,起本质是视图的“数据”。Text Field输入的内容,Button上的便签,都可以说是模型,但是模型与视图一样,有时候我们未必需要自己创建一个模型类。因此我们做开发工作时,主要是编写视图控制器。下面我们看看视图控制器ViewController.h文件的代码:
@interface ViewController : UIViewController<UITextFieldDelegate> @property (weak, nonatomic) IBOutlet UIButton *myButton;
@property (weak, nonatomic) IBOutlet UITextField *myTextField;
- (IBAction)myAction:(id)sender; @end
可以看到,ViewController.h为两个空间myButton和myTextField定义了两个IBOutlet(输出口)类型的属性。因为要通过视图控制器更新这些视图(控件也属于视图),所以我们需要把这些视图定义成输出口类型的属性。
此外,ViewController.h还定义了 - (IBAction)myAction:(id)sender; 方法以相应myButton按钮的触摸事件。该方法的返回类型是IBAction(动作事件),这说明该方法可以相应控制事件的。
另外,ViewController还实现了UITextFieldDelegate协议,这样ViewController就变成了UITextField空间的委托对象,它们之间的运作关系如图:

①当用户触摸myButton的时候会触发ViewController中的 - (IBAction)myAction:(id)sender 方法。
②视图控制器会实现一些空间委托和数据源协议,这要看具体的控件。在此案例中,ViewController实现了UITextFiledDelegate协议,其中定义了一些相应UITextField事件的方法。
③视图控制器通过属性myButton和myTextField来改变控件的状态。
④模型对象可以通过通知和KVO机制来通知数据的变化。
⑤视图控制器可以保存一个模型成员变量或属性,并通过它们改变模型的状态。
资料:《iOS开发指南》
读书笔记-常用设计模式之MVC的更多相关文章
- iOS常用设计模式:MVC、单例、代理、观察者。
MVC 模型-视图-控制器(MVC)设计模式 MVC根据角色划分类,涉及到三个角色: Model:模型保存应用程序的数据. View:视图是模型的可视化表示以及用户交互的控件. Controller: ...
- 【读书笔记】Asp.Net MVC 上传图片到数据库(会的绕行)
之前上传图片的做法都是上传到服务器上的文件夹中,再将url保存到数据库.其实在MVC中将图片上传到数据库很便捷的事情,而且不用去存url了.而且这种方式支持ie6(ie6不支持jquery自动提交fo ...
- (读书笔记)Asp.net Mvc 与WebForm 混合开发
根据项目实际需求,有时候会想在项目中实现Asp.net Mvc与Webform 混合开发,比如前台框架用MVC,后台框架用WebForm.其实要是实现也很简单,如下: (1)在MVC 中使用Webfo ...
- Design Pattern Explained 读书笔记二——设计模式序言
设计模式的由来: 20 世纪 90 年代初,一些聪明的开发者偶然接触到 Alexander(Christopher Alexander 的建筑师) 有关模式的工作.他们非常想知道,在建筑学成立的理论, ...
- 读书笔记:js设计模式
面向过程编程,面向对象编程和函数式编程> 定义一个类方法1:function Anim(){ } Anim.prototype.start = function(){ .. };Anim.pro ...
- Pro Aspnet MVC 4读书笔记(1) - Your First MVC Application
Listing 2-1. The default contents of the HomeController class using System; using System.Collections ...
- 嵌入式Linux应用开发完全手册读书笔记——常用的命令
嵌入式开发中常用的命令 grep命令 用法:grep [option] PATTERN [FILE...] 例如: 在内核目录下查找包含"request_irq"字样的文件 gre ...
- [读书笔记] JavaScript设计模式: 单例模式
单例模式:保证一个类只有一个实例,并提供一个可以访问它的全局访问点. 一种简单.方便的写法就是用一个变量来标识当前类是否已经创建过对象,如果有,则返回已经创建好的对象,否则创建一个新对象,并将其返回. ...
- 读书笔记-Java设计模式
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Java的封装性很好,拿访问控制符来讲,没有权限的类或方法是不能访问的.如public,都可访问:p ...
随机推荐
- 树链剖分||dfs序 各种题
1.[bzoj4034][HAOI2015]T2 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把 ...
- 菜鸟从零学编程(八)——将MyEclipse项目导入到Eclipse
最近由于种种原因,需要将以前用MyEclipse写的项目迁移到Eclipse中.但是当我将之前的项目import到Eclipse中后,发现根本不能运行.经过一番寻觅,终于让我找到了一种解决的办法.一起 ...
- 我的git使用记录
git的教程现在琳琅满目,需要学习的东西也有很多,一下子接受不了那么多的东西,所以打算记录在实用的过程中常用的操作和遇到的问题. 基本操作 git init git add . git add -A ...
- 一步步学Mybatis-实现简单的分页效果逻辑 (5)
在前四章中我们已经基本完成了对单表的CRUD与多表联合查询方式的Mybatis操作与配置方式,今天这里要讲的是关于一个业务问题中我们常碰到的分页问题.在开发web项目的时候我们经常会使用到列表显示,一 ...
- mysql博客
http://blog.csdn.net/mchdba/article/details/9190771 本帖最后由 mchdba 于 2014-2-10 17:15 编辑 公司招聘MySQL DBA, ...
- BootStrap2学习日记22---点击展开
先看效果: Code: <div class="accordion" id="accordion2"> <div class="ac ...
- Json.Net学习(1) 实现简单的序列化和反序列化
Attributes 可以用来控制Json.Net如何序列化和反序列化.Net对象. >JsonObjectAttribute--标记在类上,用于控制该类如何被序列化为一个Json对象(JSON ...
- Sumdiv 等比数列求和
Sumdiv Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15364 Accepted: 3790 De ...
- [JavaEE] Hibernate OGM
Hibernate Object/Grid Mapper (OGM)这个项目能够为NoSQL数据库提供Java Persistence(JPA)支持.它复用了Hibernate Core引擎将实体持久 ...
- xml格式化成json
JsonConvert.SerializeObject(model) XmlDocument doc = new XmlDocument(); doc.Loa ...