MVC架构

简介: 在iOS系统上运行的应用程序遵守MVC的软件架构模式,将自己分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。<br> MVC,维基百科是这样定义的。<br> MVC模式最早由Trygve Reenskaug在1974年提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式。MVC模
在iOS系统上运行的应用程序遵守MVC的软件架构模式,将自己分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
MVC,维基百科是这样定义的。
MVC模式最早由Trygve Reenskaug在1974年提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式。MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。专业人员可以通过自身的专长分组:
(控制器Controller)- 负责转发请求,对请求进行处理。
(视图View) - 界面设计人员进行图形界面设计。
(模型Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。

在iOS的应用程序中,MVC架构模式将应用程序的屏幕对象的外观和行为区分开来。屏幕上的对象如按钮,本身没有任何内在含义,它能实现的所有操作都是通过视图控制器来实现的。视图控制器是桥梁,将用户操作和应用程序中的目标方法联系起来,目标方法又读取和保存数据到应用程序中的某个数据模型里。
这是一个极其简单的iOS应用程序的架构模式。在MVC中,视图控制器的角色看成控制器,但也能看成是视图,因为它是控制视图显示的重要组成部分。

一、视图(View)

在iOS应用程序创建时,所使用的视图组件是由UIView 类的子类及与其相关的UIViewController类提供,它们分别负责定义和放置屏幕元素。UIViewController类不是MVC 模式中的控制器角色,这点和命名略有出入,就理解成这是控制视图的一个类。它负责对屏幕的各项元素进行布局。
但是,每个UIViewController子类都实现了自己的loadView方法。该方法对视图控制器的所属视图进行布局,并建立所有的触发、回调和委托。从这个角度看,它又算一个控制器。
因此,咱们理解即可,灵活使用,不必纠缠于某些条条框框,否则反而限制了自己。


二、控制器(Controller)


在iOS应用程序中,控制器的行为通过这三个技术来实现,分别是委托、目标操作和通知。

1、目标操作(target action)

它是重定向用户交互的一种较低级的方式,基本上只有在实现UIControl类的子类时,我们会遇到它们。

例如,在应用的视图界面上有一个按钮,"touch up inside",就是将执行target配置的对象和action配置的方法。
视图控制器类的代码是这样的:
 UIBarButtonItem *barListBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemAdd target:self action:@selector(getTruckStopListAction)];  
 self.navigationItem.rightBarButtonItem = barListBtn;
 [barListBtn release];
代码中定义的action是@selector(getTruckStopListAction),定义的target是视图控制器类本身即self。
在视图控制器类中应该有一个已实现的getTruckStopListAction方法,按钮"touch up inside"时触发的就是这个方法。这个方法可以看着是MVC架构模式中的控制器角色,它的定义代码可以按照需求随时修改。

这就是target-action模式。

如果target不是self,而是其他的类,那么在其他的类要实现这个action所配置的方法。这个类就是一个纯种的MVC架构模式的控制器。不像现在和视图控制器类参杂在一起,搞得不知道视图控制器类算MVC架构模式的控制器还是MVC架构模式的视图。(注,这段纯粹是个人猜测,不一定正确。)

苹果文档对于target-action 模式的定义如下:

Target-action is a design pattern in which an object holds the information necessary to send a message to another object when an event occurs. The stored information consists of two items of data: an action selector, which identifies the method to be invoked, and a target, which is the object to receive the message. The message sent when the event occurs is called an action message. Although the target can be any object, even a framework object, it is typically a custom controller that handles the action message in an application-specific way.


2、委托(delegate)

"委托"是一种简单而强大的设计模式,它可以让程序中的一个对象和另一个对象交互。例如对象A是对象B的委托即B.delegate=A,那么对象B就通过它的属性delegate发送消息给对象A即[[B delegate] message],实质上就是对象B让对象A执行message,而message的定义是在A中实现,但对象A何时执行message是由对象B来控制的。

举一个例子,对象A通过segue展现对象B,对象B再通过delegate释放自己。

对象A中的代码如下:
/*使用prepareForSegue传递数据*/
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"objectBView"]) {
        objectBViewController * objectBController=[segue destinationViewController];
        objectBController.u01=self.usernameInput.text;
        objectBController.u02=self.passwdInput.text;
        
        /*设置 被展现视图控制器的委托 为 正展现的视图控制器,即自身*/
        objectBController.delegate=self;
    }
}

/*实现协议中的方法*/
-(void)objectBViewControllerDone:(objectBViewController *)controller username:(NSString *)username passwd:(NSString *)passwd
{    
    [self dismissViewControllerAnimated:YES completion:NULL];    
}
注意,因为是在objectBViewController中执行这个方法,所以self还是objectBViewController。

对象B中的代码如下:
- (IBAction)dismissobjectBView:(id)sender
{
    [[self delegate] objectBViewControllerDone:self username:self.username.text passwd:self.passwd.text];
}

再举一个例子,创建一个UITableViews子类,当用户触击某行时,该类没有响应该触击操作的内置方式,因为这种响应责任已经移交给委托,通过委托方法tableView:didSelectRowAtIndexPath: 来处理。这个委托就在UITableViewController类的子类中实现,因此UITableViewController子类必须遵守协议UITableViewDelegate和UITableViewDataSource,实现这两个协议中的必须实现的方法。UITableViewController子类就成了UITableViews子类的委托。


委托在iOS中应用非常广泛,对它理解得越透彻,越有利于提升我们的开发能力。

苹果文档对于delegate 模式的定义如下:
Delegation is a simple and powerful pattern in which one object in a program acts on behalf of, or in coordination with, another object. The delegating object keeps a reference to the other object—the delegate—and at the appropriate time sends a message to it. The message informs the delegate of an event that the delegating object is about to handle or has just handled. The delegate may respond to the message by updating the appearance or state of itself or other objects in the application, and in some cases it can return a value that affects how an impending event is handled. The main value of delegation is that it allows you to easily customize the behavior of several objects in one central object.
 
3、通知

它支持应用程序中的对象的交互,及与iOS系统上其他应用程序通信。对象在通知中心注册为一观察者,视为订阅。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(update) name:@"update" object:nil]

 
三、模型(Model)

模型方法通过数据源和数据含义等协议提供数据,需要实现由控制器触发的回调方法。你需要创建应用程序控制器触发的回调方法,并提供所需的任何委托协议的实现。iPhone SDK 中的数据源可以帮助实现。数据源指任何向另一个对象提供所需数据的对象,其类似于委托,必须在另一个对象中实现它们的方法。它与委托的不同之处在于创建或提供对象而不是针对用户交互作出反应。

苹果文档对于Data Source模式的定义如下:
A data source is almost identical to a delegate. The difference is in the relationship with the delegating object. Instead of being delegated control of the user interface, a data source is delegated control of data. The delegating object, typically a view object such as a table view, holds a reference to its data source and occasionally asks it for the data it should display. A data source, like a delegate, must adopt a protocol and implement at minimum the required methods of that protocol. Data sources are responsible for managing the memory of the model objects they give to the delegating view.
目录
相关文章
|
7月前
|
设计模式 存储 前端开发
MVVM、MVC、MVP三种常见软件架构设计模式的区别
MVC、MVP 和 MVVM 是三种常见的软件架构设计模式,主要通过分离关注点的方式来组织代码结构,优化开发效率。
151 12
|
2月前
|
存储 前端开发 调度
Flux 与传统的 MVC 架构模式区别
Flux是一种用于构建用户界面的架构模式,与传统的MVC架构不同,它采用单向数据流,通过Dispatcher统一管理数据的分发,Store负责存储数据和业务逻辑,View只负责展示数据,使得应用状态更加可预测和易于维护。
|
5月前
|
设计模式 前端开发 数据库
哇塞!Rails 的 MVC 架构也太牛了吧!快来看看这令人惊叹的编程魔法,开启新世界大门!
【8月更文挑战第31天】《Rails中的MVC架构解析》介绍了Ruby on Rails框架核心的MVC设计模式,通过模型(Model)、视图(View)和控制器(Controller)三部分分离应用逻辑,利用Active Record进行数据库操作,ERB模板渲染视图,以及控制器处理用户请求与业务逻辑,使代码更易维护和扩展,提升团队开发效率。
88 0
|
2月前
|
存储 前端开发 数据可视化
在实际项目中,如何选择使用 Flux 架构或传统的 MVC 架构
在实际项目中选择使用Flux架构或传统MVC架构时,需考虑项目复杂度、团队熟悉度和性能需求。Flux适合大型、高并发应用,MVC则适用于中小型、逻辑简单的项目。
|
4月前
|
设计模式 前端开发 数据库
理解mvc架构
mvc架构
42 4
|
5月前
|
设计模式 存储 前端开发
MVC革命:如何用一个设计模式重塑你的应用架构,让代码重构变得戏剧性地简单!
【8月更文挑战第22天】自定义MVC(Model-View-Controller)设计模式将应用分为模型、视图和控制器三个核心组件,实现关注点分离,提升代码可维护性和扩展性。模型管理数据和业务逻辑,视图负责数据显示与用户交互,控制器处理用户输入并协调模型与视图。通过示例代码展示了基本的MVC框架实现,可根据需求扩展定制。MVC模式灵活性强,支持单元测试与多人协作,但需注意避免控制器过度复杂化。
52 1
|
5月前
|
开发者 前端开发 Java
架构模式的诗与远方:如何在MVC的田野上,用Struts 2编织Web开发的新篇章
【8月更文挑战第31天】架构模式是软件开发的核心概念,MVC(Model-View-Controller)通过清晰的分层和职责分离,成为广泛采用的模式。随着业务需求的复杂化,Struts 2框架应运而生,继承MVC优点并引入更多功能。本文探讨从MVC到Struts 2的演进,强调架构模式的重要性。MVC将应用程序分为模型、视图和控制器三部分,提高模块化和可维护性。
52 0
|
5月前
|
存储 前端开发 数据库
神秘编程世界惊现强大架构!Web2py 的 MVC 究竟隐藏着怎样的神奇魔力?带你探索实际应用之谜!
【8月更文挑战第31天】在现代 Web 开发中,MVC(Model-View-Controller)架构被广泛应用,将应用程序分为模型、视图和控制器三个部分,有助于提高代码的可维护性、可扩展性和可测试性。Web2py 是一个采用 MVC 架构的 Python Web 框架,其中模型处理数据和业务逻辑,视图负责呈现数据给用户,控制器则协调模型和视图之间的交互。
47 0
|
6月前
|
存储 前端开发 算法
MVC(Model-View-Controller)架构
MVC架构帮助开发者构建清晰、可维护和可扩展的Web应用程序。
52 2
|
7月前
|
设计模式 前端开发 Java
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
122 1

热门文章

最新文章

下一篇
开通oss服务