iOS设计模式——MVC(Model-View-Controller)
Modol View Controller(MVC)是一种最早的也是最成功的可重用的设计模式,70年代的时候首次在smaltalk编写的程序中成功使用。基于MVC设计 模式,Cocoa整体架构可以划分为三个子系统:Model, View, Controller,我们可以相应的理解为:数据模型,视图和控制器。
Modol View和Controller的角色
要想理解MVC设计模式中每个子系统的角色,我们就需要理解一个应用程序的功能和行为。我们知道一个应用程序通常需要存储数据信息,检索数据信息以及把这些数据信息呈现给用户,同时还要允许用户对数据进行编辑(增删查改等操作)。那么MVC的角色就分别为:
Model: 为应用程序提供独立的,不依赖于View和Controller子系统的数据模型。
View: 以一定的形式像用户呈现数据并允许用户对数据进行操作。理解View的关键是要理解同样的数据可以有不同的呈现方式,可以以列表的形式显示,可以以图片的形式显示,有时根据需求只需显示部分数据。
Controller: 在
Model和View之间加入一个Controller的主要目的就是“去耦”,即消除Model和View之间的耦合性。用户和View交互
时,View会通知Controller在View中有数据发生了更改,而Controller则会将这个数据的改变反应到Model中。
Controller在这个过程中扮演转义数据的角色(因为呈现在View中的数据可能是便于用户阅读的文字或是数字,而存储在Model中的数据可能是
比较高效但不便于直接阅读的二进制或是其他存储方式比如关系数据库,Controller可以承担转化这两种数据形式的职责)。
Controller的去耦作用如下图示(注:本文所用插图来源于书《Cocoa Design Pattern》, Erik M.Buck 和 Donald A.Yacktman著):

第一步,滑动按钮发生变化,发送一个消息给Controller;第二步,Controller发送消息告诉Model按钮位置发生了变化需要更新
数据Value;第三步,Model更新完数据通知Controller;第四步,Controller完成对View中其他需要更新的
View控件的更新,比如上面的文字输入框。
在上面的整个过程可能你会觉得Model和View明明可以直接交互,为什么要引入Controller呢?原因就是,View通常会经常根据用户
需求而发生改变(相信经常和客户打交道的朋友对此感触颇深),而且用户数据格式有时候也会发生改变(比如客户要求数据需要从mysql数据库迁移到
oracle),这样把View和Model分离出来就显得极其重要了。
Cocoa中的MVC
在Cocoa框架中,可以说MVC设计模式被用到了极致。不但整个框架是基于MVC设计的(见下图),而且在更小的范围内也广泛使用了MVC。

Core Data简化了很多应用程序的Model部分的设计;ApplicationKit包含了View, Controller通用的一些类。Foundation提供了对操作系统接口,NSObject基类,脚本支持以及其他特性的访问。
小结
MVC设计模式减少了程序中模块间的耦合性,但是有时候也增加了程序的复杂度。从长远来讲,MVC这样一个清晰的子系统分离设计可以减少系统的维护
开销并且可以很方便的实现系统功能的增强和扩展。另外一个考虑就是,子系统的分离对软件测试工作也带来了很大的方便,比如我们可以直接测试升级了的系统
Model,而不一定非得通过用户界面来测试,因为当通过用户界面测试失败时,我们不知道到底是界面导致的还是Model本身导致的或是两者同时引起的。
再有就是,通常一个系统的View和Model是由不同的团队开发的,这样每个子系统的清晰分离就显得尤为重要了。
iOS设计模式——MVC(Model-View-Controller)的更多相关文章
- What is the difference between Reactjs and Rxjs?--React is the V (View) in MVC (Model/View/Controller).
This is really different, React is view library; and Rxjs is reactive programming library for javasc ...
- 深入浅出Java MVC(Model View Controller) ---- (JSP + servlet + javabean实例)
在DRP中终于接触到了MVC,感触是确实这样的架构系统灵活性不少,现在感触最深的就是使用tomcat作为服务器发布比IIS好多了,起码发布很简单,使用起来方便. 首先来简单的学习一下MVC的基础知识, ...
- Model View Controller (MVC) Overview
By Rakesh Chavda on Jul 01, 2015 What is MVC?Model View Controller is a type of user interface archi ...
- MVC(Model View Controller)框架
MVC框架 同义词 MVC一般指MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一 ...
- MVC模式(Model View Controller)下实现数据库的连接,对数据的删,查操作
MVC模式(Model View Controller): Model:DAO模型 View:JSP 在页面上填写java代码实现显示 Controller:Servlet 重定向和请求的转发: 若 ...
- Model View Controller(MVC) in PHP
The model view controller pattern is the most used pattern for today’s world web applications. It ha ...
- 关于报错:'sharedApplication' is unavailable: not available on iOS (App Extension) - Use view controller based
最近在看Extension相关知识的时候,自己写了个小demo 发现[UIApplication sharedApplication]这个方法敲不出来了, 总是报错:'sharedApplicatio ...
- iOS 容器控制器 (Container View Controller)
iOS 容器控制器 (Container View Controller) 一个控制器包含其他一个或多个控制器,前者为容器控制器 (Container View Controller),后者为子控制器 ...
- iOS9中找不到XXX.dylib 与 is unavailable no availabel on ios (app extension) - use view controller 的解决办法
在 iOS9 中现在找不到 XXX.dylib 了,比如libz.tbd 如果要用到 libz.dylib,可以用下面的办法,来自 Stack Overflow. Go to Build Phase ...
随机推荐
- C++中的引用到底是什么
这也算是一个老生常谈的问题,写这个其实就是想趁着暑假把博客丰富一下. 咱随便在谷哥.度娘.病软引擎上搜搜都可以得到各种关于引用的解释,无非就是"引用不同于指针,引用是一个变量的别名" ...
- windbg命令学习3
3.进程与线程: 既可以显示进程和线程列表,又可以显示指定进程或线程的详细信息.调试命令可以提供比taskmgr更详尽的进程资料,在调试过程中不可或缺. 3.1. 进程命令 进程命令包括以下:显示进程 ...
- linux关闭防火墙方法
在关闭防火墙之前需要查看防火墙的状态,可以使用service iptables status命令来查看,确定防火墙是否开启再来进行关闭操作. 如果想临时开启防火墙使用命令service iptable ...
- 百度云是用SOUI开发的产品
http://www.cnblogs.com/setoutsoft/p/4155997.html
- android 读写sd卡的权限设置
原文:android 读写sd卡的权限设置 在Android中,要模拟SD卡,要首先使用adb的mksdcard命令来建立SD卡的镜像,如何建立,大家上网查一下吧,应该很容易找到,这里不说这个问题. ...
- Centos 升级MySQL版本或者Yum安装Mysql5.6
Centos 升级MySQL版本或者Yum安装Mysql5.6 1.从MySQL Yum仓库下载最新的rpm文件:http://dev.mysql.com/downloads/repo/yum/Cen ...
- Unix/Linux环境C编程入门教程(11) 开发环境搭建VMWare虚拟安装之虚拟化检测
常开启虚拟化技术.如果你的主板是最新的,它在冷启动后能够检测到配置变化.每当我改变我的主板上的VT设置,它都会自动推迟下次重新启动生效.如何确定VT已经开启或禁用? 如图表示成功开启了VT. F10 ...
- 继承ViewGroup研究(汇总) 一、二、三
转载过来:为一.二.三版本. 仅供参考: 继承ViewGroup研究(1) --简介和一个小Demo 又翻开一个新篇章了,哈哈,上一回学习的是继承View,关于继承View个人感觉不是那么完美,做技术 ...
- poj2350
#include <stdio.h> #include <stdlib.h> int main() { ],tim,i; scanf("%d",&n ...
- genymotion 模拟器 真是牛叉了 速度超快啊!!! 不解释了!建议大家速度去体验一把吧!
已经有人写了blog了 我就不再赘述了,详情去这里看去吧!! android genymotion模拟器怎么使用以及和google提供的模拟器性能对比 http://blog.csdn.net/ ...