MVC是一种在iOS开发中常见的设计模式,今天主要分析下MVC的原理和它的交流方式。
之前看到一篇关于MVC的文章总结的非常不错,今天直接转载过来
一、MVC的概念
MVC是Model-View-Controller,就是模型-视图-控制器,这些都是什么东西呢?
MVC把软件系统分为三个部分:Model,View,Controller。在cocoa中,你的程序中的每一个object(对象)都将明显地仅属于这三部分中的一个,而完全不属于另外两个。
关于Model
Model = 你的程序是什么(而不是你的程序是如何显示的) 让我们举个例子,我们上中学的时候,我们的步步高电子词典中有个游戏叫“雷霆战机”,也就是“打飞机”的游戏,Model就是:你的小飞机的攻击力是多少?你的小飞机上装的是什么武器,炮弹,导弹,还是激光炮?你的小飞机还有多少血?等等。再概括点说,就是你的程序将要实现的功能,或者是它所能干的事情。
关于Controller
Controller = 如何使你的模型呈现给用户(程序逻辑) Controller是程序内部的逻辑,大多情况下你将看不到它,它将Model和View捆绑在一起,它将处理用户的输入,例如,你按开炮的键子,Controller就会通过内部的逻辑来处理你的要求,并在屏幕上做出相应的显示,你将看到屏幕上的小飞机发出炮弹击中敌机。这也是Controller控制 View的显示的例子。所以你可以把Controller看成是连接M和V的桥梁。
关于View
View = 在屏幕上你所看到的(是你的Controller的“奴才”) 接着前面的小飞机,View就是:你的小飞机是什么样子的,有一个还是两个翅膀,有几挺枪炮;还有,你的飞机在屏幕上的位置等等。总之,你在屏幕上看到的组件都可以归类为View。 MVC可以帮助确保帮助实现程序最大程度的可重用性。各MVC元素彼此独立运作,通过分开这些元素,可以构建可维护,可独立更新的程序组建。
二、M V C之间的交流模式
好了,现在我们来讨论MVC中各个元素之间的交流方式。
我们把程序分成三个部分,但并不希望他们完全独立,因为那样的话,我们的程序将毫无意义和功能而言。它们之间必然存在某种联系,使它们能有机的成为一个整体来实现各种强大的功能。而这种联系就是我们提到的交流方式。我们来看看下面的图,此图出自斯坦福大学CS193课程的课件。
MVC的交流
图中有几条线把这三部分划分开,有黄线,虚线,和白色的实线。我们把它们想象成路标。你可以看到,在M和V之间有两条黄线,这表示什么呢?它意味着你不能穿越这黄线,任何一个方向都不行。在图的上部,你可以看到白色的虚线,它意味着你可以自由的穿越它,只要是安全的。那白色的实线呢?它代表你可以穿越,但你必须要买票,或者交点过路费。
C和M之间
好了,如果你觉得前面的比喻没有使你明白的话,让我们来讲点实在的东西。首先, 我们来看C和M之间的绿色箭头,这箭头的方向就代表着“发起对话”的方向,也就是说,发起对话的是C,而做出回答的是M。C可以问M各种各样的问题,但M只是回答C的问题或要求,它不可以主动的向C要求什么。还记得虚线是畅通无阻的意思吧,所以,C知道M的所有的事情,如果用代码来说明这件事情,就是说,C可以导入M的头文件或是M的接口(API)。因为C可以通过M的API,所以它就可以肆无忌惮的向M要求这要求那了。
C和V之间
我们再来看看另外的一个绿色箭头,它是在C和V之间,和前一个绿色箭头的意义一样,它代表C可以直接地向V进行交流。你可以想想,C要把V放到屏幕上,并设置V的属性,告诉它们什么时候从屏幕上消失,把它们分成组等等。如果C不能自由的向V发号施令的话,程序的显示将会多么的困难,所以,C可以毫无限制地向V说话。 可能你已经注意到了,这个箭头上还有outlet(输出口),outlet可以看作是从C指向V的指针,它在C中被定义。outlet给我们提供了很大的方便,它使我们在C的内部就可以轻松准确地向V施令。C可以拥有很多的outlet,可以不止一个,这也使它可以更高效的和V进行交流。
M和V之间
那M和V之间可以交流么?还记得黄线的意思么?完全不可以通过,所以我们是不允许M和V进行交流的。这是因为我们不希望这三部分之间有过多的交流,你想想,假如V在显示时出现了问题,比如有一个图形没有显示出来,我们就要去查找错误,因为C可以和V交流,M也可以和V交流的话,我们就要去检查两个部分。相反的,只有C可以和V交流的话,在出错时,我们就只需要去C那里查找原因,这样查找错误不就很是简单了么?所以,我们不允许M和V之间有直接的联系,这也是在它们两之间有两根黄线的原因。
小结
好的应用程序要具备与用户交互的能力。如果没有良好的交互性,程序的功能将会受到很大的限制。在MVC中,V是和用户直接接触的,用户看不到M和C,所以,程序与用户的交互必须通过V来实现,但V只是视图而已,它并不能完全处理用户的要求,所以,这就要求V必须有某种手段来向C发送信息,移交用户的交互要求。这手段就是前面白色实线代表的过路费,你知道V不能知道C的一切,但它可以通过某种“手段”来和C进行交流,移交用户交互责任。
我们接下来讨论V是如何向C发送信息的。V对C的交流有三种不同的方式。
目标操作
第一种我们称为目标操作(target-action)。它是这样工作的,C会在自己的内部“悬挂”一个目标(target),如图中的红白相间的靶子,对应的,它还会分发一个操作(action,如图中的黄色箭头)给将要和它交流的视图对象(可能是屏幕上的一个按钮),当按钮被按时,action就会被发送给与之对应的target,这样V就可以和C交流了。但是在这种情况下,V只是知道发送action给对应的target,它并不知道C中的类,也不知道它到底发送了什么。target-action是我们经常使用的方法。
代理/委托
第二种方式我们叫做委托(delegate)。有时候,V需要和C进行同步,你知道,用户交互不仅仅是什么按按钮,划滑块,还有很多种形式。好了,让我们来看看图中的delegate黄色箭头,你发现箭头上又分出了四个小箭头:should,did,will,还有一个没标注的。绝大部分的delegate信息都是should,will,did这三种形式。和英文意思相对应,should代表视图对象将询问C中的某个对象“我应该这么做么?”,举个例子,有一个web视图,有人点击了一个链接,web视图就要问“我应该打开这个链接么?这样做安全么?”。这就是should信息。那will和did呢?will就是“我将要做这件事了”,did就是“我已经做了这件事”。C把自己设置为V的委托(delegate),它让V知道:如果V想知道更多的关于将如何显示的信息的话,就向C发送delegate信息。通过接受V发过来的delegate信息,C就会做出相应的协调和处理。还有一点,每个V只能有一个delegate。
数据源
第三种方式就是数据源(datasource),你知道,V不能拥有它所要显示的数据,记住这点非常重要。V希望别人帮助它管理将要显示的数据,当它需要数据时,它就会请求别人的帮助,把需要的数据给它。再者,iphone的屏幕很小,它不能显示包含大量信息的视图。看图中的datasource箭头,和delegate类似,V会发送cout,data at信息给C来请求数据。好了,这就是V给C发送信息的三种形式。
小结
最后一个问题。你看到M和C之间的白线,这意味着M不可以直接地,没有限制的对C进行交流。但有时,这个方向的交流是必要的。当M中的一些东西发生变化时,C需要了解这些变化,那我们怎么才能让C知道M的变化呢?通知(Notification)和KVO是解决问题的好方法。它们是这样工作的,当M中的某些东西发生变化时,他们会向C发出通知“嘿,老兄,注意了啊,我这发生变化了”,或者他们会发出指向变化的指针给C,或其他什么的。总之,他们的工作模式是这样的。
下面是我们的一个总结,cocoa忠实于MVC,所以理解cocoa的MVC是我们关键的开始,希望这些能使你明白一些。
C对M:API
C对V:Outlet
V对C:Target-action, Delegate,Datasource
M对C:Notification,KVO
相关推荐
总之,MVC设计模式在iOS开发中扮演着至关重要的角色,它使得开发者能够更好地管理复杂的应用程序,提高代码的可读性和可维护性。通过学习和实践"iOSDesignPatternDemosVC"中的示例,开发者可以进一步理解如何在实际...
在iOS开发中,MVC(Model-View-Controller)是一种常用的设计模式,它将应用程序的逻辑分为三个主要组件,使得代码结构清晰、可维护性增强。MVC模式是Apple的Cocoa和Cocoa Touch框架的基础,是Objective-C和Swift...
* 移动应用:MVC设计模式也可以应用于移动应用程序中,例如 Android 和 iOS 应用程序。 MVC设计模式是一种常用的软件设计模式,广泛应用于Java开发中。它的主要思想是将业务逻辑、数据和显示相分离,以便更好地组织...
在iOSMVC代码中,我们通常会看到以下关键概念和技术: 1. **模型(Model)**: 模型是应用的核心部分,它负责存储和管理数据。在iOS中,模型对象通常是遵循`NSCoding`协议的,以便能够进行序列化和反序列化,从而...
在本项目"ios-swift中的MVC设计模式.zip"中,我们将会探讨如何使用Swift来实现一个基于MVC模式的表格视图应用,解决单元格重用问题。 首先,理解MVC模式的核心概念: 1. Model(模型):负责存储和管理数据。在...
在iOS应用开发中,设计模式是提升代码可读性、可维护性和可扩展性的重要工具。以下是关于三种主要设计模式——MVC(Model-View-Controller)、MVP(Model-View-Presenter)和MVVM(Model-View-ViewModel)的详细讲解...
在iOS开发中,设计模式是开发者们为了解决常见问题而形成的一种最佳实践。它们是经过时间验证、可重用的解决方案模板,可以帮助我们构建高效、可维护和扩展的代码。本资源“iOS 设计模式及源码实现”深入探讨了iOS...
**MVC设计模式详解** **一、MVC模式概述** MVC(Model-View-Controller)设计模式是一种软件设计架构模式,广泛应用于Web应用开发,主要用于分离应用程序的业务逻辑、用户界面和数据管理。该模式将应用程序分为三...
**iOS MVVM设计模式** MVVM(Model-View-ViewModel)设计模式在iOS开发中逐渐流行,尤其是在Objective-C和Swift的环境中。它是一种基于MVC(Model-View-Controller)的改进模式,旨在提高代码的可测试性、可维护性...
书中还讨论了如何将设计模式应用于MVC(Model-View-Controller)架构,以及如何在MVVM(Model-View-ViewModel)和VIPER(View-Interactor-Presenter-Entity-Router)等现代架构中运用设计模式。此外,书中还涵盖了...
在iOS开发中,良好的架构设计和使用合适的设计模式至关重要,它们可以帮助我们构建可维护、可扩展、易测试的代码。本实例Demo旨在演示如何在iOS应用中应用多种设计模式,以提升软件架构的质量。以下是对标题和描述中...
本书讲述如何在代码中应用创建型模式、结构型模式和行为模式等,如何设计模式以巩固应用程序,并通过设计模式实例介绍MVC在Cocoa Touch中的工作方式。 本书适用于那些已经具备Objective-C基础、想进行高级iOS开发,...
本实例“ios设计模式学习实例”聚焦于Cocoa框架中的设计模式应用,下面将详细阐述其中涉及到的主要设计模式。 1. 创建型设计模式: - 单例(单态):单例模式确保一个类只有一个实例,并提供全局访问点。在iOS中,...
在iOS开发中,MVC(Model-View-Controller)模式是一种常见的设计模式,用于组织应用程序的结构和逻辑。本文将深入探讨如何通过MVC模式来简化iOS应用中的控制器(Controller)代码,以应对描述中提到的tableview代理...
总结来说,"ios-Swift 4 MVC模式仿iOS11 系统自带计算器"项目是一个以Swift 4实现的计算器应用,其核心在于使用MVC设计模式将业务逻辑、用户界面和数据处理分离,以提高代码的可读性和可维护性。通过这个项目,...
MVC设计模式使得代码组织更加清晰,易于维护和扩展。它允许开发者分别关注数据管理、用户界面以及两者之间的交互,从而提高了代码的可读性和可重用性。 #### 二、Delegation(代理) **代理模式**是一种用于实现...
MVC设计模式为iOS应用开发提供了一个强大的架构框架。通过将应用程序划分为Model、View和Controller三个部分,不仅可以提高代码的可维护性和可扩展性,还能简化团队协作过程中的沟通和分工。对于初学者来说,掌握MVC...
本文将深入探讨几种在iOS开发中常用的设计模式:代理模式、观察者模式、MVC模式、单例模式、策略模式以及工厂模式。 1. **代理模式**: 代理模式在iOS开发中广泛应用,主要用于对象间通信。例如,UITableView的...
### iOS中的设计模式(Swift版本) #### 设计模式概述 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。对于iOS开发人员来说,了解并掌握常用的设计模式是非常重要的,因为它们可以...
这个名为“iOS tableview_demo_mvc”的项目,显然是一份使用Model-View-Controller(MVC)设计模式编写的TableView示例代码,旨在帮助新手理解并实践iOS中的 MVC 模式。下面将详细介绍 MVC 模式以及在 iOS 开发中...