模型(Model) 视图(View) 控制器(Controller) (MVC) 是 Cocoa 中的一种行为模块,并且也是所有 Cocoa 设计模式中使用最多的。在程序中按照它们的角色来分类这些对象并且鼓励你的基础代码也按照这个来划分。

这三种角色是:

  • 模型:这是一种暂时保存你程序数据和定义如何操作它的对象。一个例子,在你的程序中 Album 类就是一个模型。

  • 视图:这种对象是控制模型里的数据如何显示出来的,用户也可操作这些对象;事实上,包含所有的 UIView 和他们的子类。在你的程序中视图是 AlbumView 类。

  • 控制器:控制器是一个中介者协调所有的工作。他使数据从模型传出来然后显示在视图上,监听事件,在必要的时候操作数据。你能猜到哪个类你的控制器吗?对了,它就是 ViewController。

在你的程序中一个好的设计模式的实现意味者所有的对象都在这些群组中。

下图很好的描述了视图和模型之间的通信过程:

当有数据发生改变的时候模型通知控制器,然后控制器更新视图数据。 反过来,当用户在视图执行一些操作后,视图会通知控制器,如果有需要或是要取回请求数据,控制器也会更新模型或者。

你可能想我为什么不能丢掉控制器,在同一个类里实现视图和模型,这样看起来更简单。

归根结底,这是为是分离代码和提高代码的可重用性。理想状态下视图应该完全从模型中分离出来。如果视图不依赖一个特殊的模型来实现,那么另外一个模型就可以重复利用这个视图显示一些其它不同的数据。

举一个例子,在将来某一天你想在你的音乐库中加入一些电影或者一些书,你可以继续使用原来的 AlbumView 视图来显示这个电影或者图书对象。此外,如果你想创建一个新项目,这个项目中的一些东西跟音乐专辑有关,你可以很简单的拿来重用 Album 类,因为它不依赖于其它任何视图。这就是 MVC 的精髓所在。

如何使用 MVC 模式

首先,你要保证在你的项目中任何一个类都有一个控制器,一个模型,一个视图,一个类中的函数不能有两种作用。到目前为至,你已经完成了一项很棒的工作,创建了一个 Album 类和一个 AlbumView 类。

第二步,根据这些方法的作用你应该创建三个文件夹,来存放不同类别的代码,每种类型一个文件夹。

在菜单上选择 File\New\Group (或者按 Command+Option+N) ,创建名称为 Model,重复上面的动作,创建 View 和 Controller 文件夹。

现在拖动 Album.h 和 Album.m 文件到 Model 文件夹。拖动 AlbumView.h 和 AlbumView.m 文件到 View 文件夹,最后拖动 ViewController.h 和 ViewController.m 文件到 Controller 文件夹中。

现在,项目文件的结构目录应该是这个样子的:

如果没有其它的文件漂在外面,你的项目看起来已经非常棒了。显然你还可能有其它的文件夹和类,但是你程序的核心内容应该包含在这三个分类中。

现在你的文件已经组织好了,你需要从其它地方获取专辑数据了。你需要创建一个 API 类用来管理你的代码的数据来源 — 现在是机会开始讨论下一个设计模式了 — 单例模式(The Singleton Pattern)。

设计模式之二:MVC的更多相关文章

  1. 中介者模式 调停者 Mediator 行为型 设计模式(二十一)

      中介者模式(Mediator)   调度.调停   意图 用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散 而且可以独立地改变它们之间的交互. ...

  2. 小菜学习设计模式(二)—单例(Singleton)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

  3. C#基础系列——委托和设计模式(二)

    前言:前篇 C#基础系列——委托实现简单设计模式 简单介绍了下委托的定义及简单用法.这篇打算从设计模式的角度去解析下委托的使用.我们知道使用委托可以实现对象行为(方法)的动态绑定,从而提高设计的灵活性 ...

  4. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  5. IOS设计模式之三:MVC模式

    IOS设计模式之三:MVC模式   模型-视图-控制器 这个模式其实应该叫做MCV,用控制器把model与view隔开才对,也就是model与view互相不知道对方的存在,没有任何瓜葛,他们就像一个团 ...

  6. 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...

  7. 设计模式(二)-- 外观模式(Facade)

    设计模式(二) 外观模式(Facade) 为了解决子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互的问题. 为子系统中的一组接口 ...

  8. Java设计模式总汇二(小白也要飞)

    PS:上一篇我介绍了适配器设计模式.单例设计模式.静态代理设计模式.简单工厂设计模式,如果没有看过第一篇的小火鸡可以点这个看看http://www.cnblogs.com/cmusketeer/p/8 ...

  9. 访问者模式 Visitor 行为型 设计模式(二十七)

    访问者模式 Visitor    <侠客行>是当代作家金庸创作的长篇武侠小说,新版电视剧<侠客行>中,开篇有一段独白:  “茫茫海外,传说有座侠客岛,岛上赏善罚恶二使,每隔十年 ...

  10. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图   相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...

随机推荐

  1. ASCII编码表

    最初的编码:ASCII 补充: ASCII表是适用于美国的,共128位:ISO-8859-1是适用于欧洲的,共256位 :GB2312是适用于中文系统的:UTF-8是万国码,适用于绝大部分语言:ANS ...

  2. SQL SERVER数据库的表中修改字段属性被阻止“Prevent saving changes that require table re-creation”

    1.启动SQL SERVER,选择工具—>选项,去掉“ 阻止保存要求重新创建表的更改”前面的勾. 2.选择设计器 3.去掉“阻止保存要求重新创建表的更改”前面的对号,点击OK. 重新启动SQL ...

  3. Android 内存泄漏总结

    内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收 ...

  4. JS去掉数组的重复项

    自己知道思路怎么去,但是就是自己不会写,在网上找了一些来看,有些还是没有怎么看明白.学习到了这么一种方法 var a=['ss','dd','ss','cc','dd',1,2,1] var b={} ...

  5. elasticsearch之python备份

    一:elasticsearch原理 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功 ...

  6. Tomcat内存设置

    MyEclipse Tomcat的JDK菜单:“Optional Java VM arguments:”框中输入“有前置空格”   -Xms512m -Xmx512m -XX:PermSize=512 ...

  7. macaca运行报错之chrome-driver问题处理,关闭 Chrome 的自动更新

    由于chrome浏览器自动更新,导致 macaca运行报错,重新安装和更新chrome-driver 之后,还需要把chrome浏览器降级到50版本: 但是chrome会自动更新,所以需要禁止.找到这 ...

  8. iOS - Frame 项目架构

    前言 iOS 常见的几种架构: 标签式 Tab Menu 列表式 List Menu 抽屉式 Drawer 瀑布式 Waterfall 跳板式 Springborad 陈列馆式 Gallery 旋转木 ...

  9. iOS Build Setting证书设置

    发布的用distribution debug的用development, debug是调试模式, 除非需要日志, 内部测试的时候, 才要debug模式的. release的用distribution

  10. bootstrap selectpicker

    mark 一下使用 bootstrap selectpicker 遇到的一个小issue,作为下次查错使用 $('.selectpicker').selectpicker('val', 'Mustar ...