iOS设计模式——MVC(Model-View-Controller)

转载 2016年06月02日 10:03:30

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是由不同的团队开发的,这样每个子系统的清晰分离就显得尤为重要了。

OpenCV 2 学习笔记(13): 算法的基本设计模式<4> :使用Model-View-Controller模式创建一个应用程序

前面我们介绍了三个比较重要的设计模式:策略,控制器,单例。现在我们我们将这些模式用在一起形成一个程序架构,MVC架构模式,它将一个程序的应用逻辑和用户接口完全分离。下面我们在MFC下使用这个模式创建一...
  • u010525655
  • u010525655
  • 2013年08月29日 14:39
  • 1401

模型-视图-控制器(Model-View-Controller,MVC)

模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已广泛应用于用户交互应用程...
  • li_yangyang_li
  • li_yangyang_li
  • 2016年02月14日 09:55
  • 3367

CS架构和BS架构的区别

CS架构和BS架构是什么以及区别最近发现自己基础非常薄弱,问起CS/BS的概念和区别竟然只知道个皮毛。赶快找了个文章仔细学习。C/S结构 即Client/Server(客户机/服务器)结构,是大家熟...
  • jiaruochao
  • jiaruochao
  • 2017年01月05日 10:16
  • 6535

大型互联网技术架构1-架构概述

上图坐标指向硅谷,最近开始研究互联网分布式架构,风口浪尖,高大上;特与极客朋友们分享,共勉。 互联网架构 近些年来,互联网的高速发展,大数据时代,Booming Years,我们作为技术极客,需要跟得...
  • ErixHao
  • ErixHao
  • 2016年06月19日 08:48
  • 4202

Pascal GPU 架构详解

1. 前言Nvidia 在今年的 GTC( GPU Technology Conference ) 上高调宣布了 Pascal 架构——专门针对每瓦性能优化的新架构,采用 16nm 工艺。接着发布了该...
  • kkk584520
  • kkk584520
  • 2016年12月25日 17:44
  • 10785

BS架构 CS架构 SOA架构 分别是什么?

一、什么是C/S和B/S 第一、什么是C/S结构。C/S (Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分...
  • xo_zhang
  • xo_zhang
  • 2013年06月30日 11:05
  • 3136

技术架构组工作职责

技术架构组工作目标 落地本部门的技术规划,负责本部门IT整体规划技术部分,指导重要项目的设计实现 规范本部门的所有技术应用和开发内容,保障系统开发的有序、标准、一致性 发展基...
  • KimmKing
  • KimmKing
  • 2016年03月14日 00:01
  • 7320

淘宝,京东,苏宁易购技术架构(路线)分析和比较

最近因为参与项目的关系,对淘宝,京东,苏宁易购三家网站系统构架做了肤浅的研究,做了几张图,放在下面,给需要的同学,欢迎大家讨论指正,邮件可发至我的邮箱:fengqiang # gmail.com...
  • jhzyz
  • jhzyz
  • 2014年06月23日 17:44
  • 37154

为什么选择分布式垂直架构

otto.de是德国的一家网上购物网站,本篇前半部分主要介绍了几个系统架构以及它们的优缺点,后半部分主要讲解otto.de的微服务架构。   在我们开始开发otto.de网上商店时,我们选择了分...
  • manmanxiaohui
  • manmanxiaohui
  • 2016年06月20日 19:10
  • 4208

数据系统架构——Lambda architecture(Lambda架构)

传统系统的问题 “我们正在从IT时代走向DT时代(数据时代)。IT和DT之间,不仅仅是技术的变革,更是思想意识的变革,IT主要是为自我服务,用来更好地自我控制和管理,DT则是激活生产力,让别人活得比你...
  • lvsaixia
  • lvsaixia
  • 2016年06月28日 20:33
  • 18377
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS设计模式——MVC(Model-View-Controller)
举报原因:
原因补充:

(最多只允许输入30个字)