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)的更多相关文章

  1. 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 ...

  2. 深入浅出Java MVC(Model View Controller) ---- (JSP + servlet + javabean实例)

    在DRP中终于接触到了MVC,感触是确实这样的架构系统灵活性不少,现在感触最深的就是使用tomcat作为服务器发布比IIS好多了,起码发布很简单,使用起来方便. 首先来简单的学习一下MVC的基础知识, ...

  3. 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 ...

  4. MVC(Model View Controller)框架

    MVC框架 同义词 MVC一般指MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一 ...

  5. MVC模式(Model View Controller)下实现数据库的连接,对数据的删,查操作

    MVC模式(Model View Controller): Model:DAO模型 View:JSP  在页面上填写java代码实现显示 Controller:Servlet 重定向和请求的转发: 若 ...

  6. Model View Controller(MVC) in PHP

    The model view controller pattern is the most used pattern for today’s world web applications. It ha ...

  7. 关于报错:'sharedApplication' is unavailable: not available on iOS (App Extension) - Use view controller based

    最近在看Extension相关知识的时候,自己写了个小demo 发现[UIApplication sharedApplication]这个方法敲不出来了, 总是报错:'sharedApplicatio ...

  8. iOS 容器控制器 (Container View Controller)

    iOS 容器控制器 (Container View Controller) 一个控制器包含其他一个或多个控制器,前者为容器控制器 (Container View Controller),后者为子控制器 ...

  9. 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 ...

随机推荐

  1. [原创]抢先DriverStudio夺取机器控制权(下篇)

    原文链接:抢先DriverStudio夺取机器控制权(下篇) 上篇仅仅说到如何抢先DriverStudio,并在结尾留给大家一个遐想.现在我进一步拓展这个遐想,从而给大家更多的遐想.: ) 那么现在我 ...

  2. 复习-C语言内嵌汇编-初级(1)

    打印hello world并改变变量i的值 # include <stdio.h> int main() { ; __asm__( "mov %0, #4\n" :&q ...

  3. client|server 最简单的聊天

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/socket ...

  4. 組裝工廠設置IQC的目的

    在電子組裝工廠的組織裡,一般都會有 IQC (Incoming Quality Control) 這個單位,台灣稱之為「入(進)料管控」,大陸稱之為「來料管控」,其最主要目的在攔檢所有買進材料是否符合 ...

  5. Coursera机器学习课程(2016 )错题集

    Unit 4 Neural Networks (×) 分析:估计D项错误,因为神经网络在处理逻辑运算的时候是range(0,1),但是处理别的运算的时候就不是这个范围了 (√) (对) week 6 ...

  6. [Leetcode][Python]33: Search in Rotated Sorted Array

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 33: Search in Rotated Sorted Arrayhttps ...

  7. C语言 大小端 字节对齐

    参考:http://www.cnblogs.com/graphics/archive/2011/04/22/2010662.html 1. 大端序:数据的高位字节存放在地址的低端,低位字节存放在地址的 ...

  8. xcode UILabel创建和隐藏

    // 创建label UILabel *label = [[UILabel alloc] init]; // 设置显示的文字 label.text = @"Hello world!Hello ...

  9. CentOS 6.2图形界面自定义开启终端快捷键

    菜单: System->Preferences->Keyboard Shortcuts 在Desktop分类下找到"Run a terminal" 点击Run a te ...

  10. UISearchBar--改变内部输入框的背景颜色

    思路是获取UISearchBar的子视图,判断他是否是输入框(注意不要先入为主地认为是UITextField),最后修改背景色.至于UISearchBar的子视图结构,在不同的iOS版本可能会不一样, ...