浅析iOS程序设计模式(基于MVC)
接触iOS手机开发有一段时间了。总体来说,苹果公司设计的开发环境还是非常人性化的。很容易上手,也方便深入。
在组织大型项目的代码文件时,我们常用MVC的思想。MVC的概念讲起来非常简单,就和对象(object)一样。但是理解和应用起来却非常困难。今天我们就试着探讨一下MVC设计理念。
M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。
比如一批统计数据可以分别用柱状图、饼图来表示。
C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
再实际开发中,M虽然本意是业务模型,但通常被理解为数据库操作层。
V即界面层,这个没有异议。
C则被理解为业务层。
对应在ios中,V就是指.xib文件。C是指.m文件。但是,通常情况并不如我们想像的这么理想。因为客户的需求是千变万化的。很多时候,我们需要根据客户的需求对界面进行自定义。所以,很多时候界面代码和会混淆在.m文件中和控制层代码掺杂在一起。
在我个人的设想中,MVC这三层分别要完成哪些工作呢?
1、M层 模型(更多的是数据库模型)
(1)创建数据库、创建相应的表
(2)完成针对数据库各个表的增、删、改、查的操作类
(3)映射数据库各个表的实体类(这个实体类的作用就是沟通数据库层(M)和控制层(C)的桥梁,同时这个实体类也将担负其后台数据(xml、sbjson等)与本地数据的沟通和存储)
本层要实现的功能:
(1)
本层输入件:sql增加或插入数据库表对应的实体类的对象的语句
本层输出件:增加、或插入数据库
(2)
本层输入件:sql查询语句
本层输出件:返回存储实体类对象的数组
(3)
本层输入件:sql删除语句
本层输出件:删除数据库中的指定信息
2、V层 视图
不用多讲了,在ios中,这个层主要由.xib文件完成。如果客户由自定义需求,则在.m文件中实现。
本层实现的功能就是控件的布局。
3、C层 控制
这个层的意义就在于确保M和V的同步。我个人理解,这层不仅叫控制层,更应该叫业务层。
本层要实现的功能:
(1)
本层输入件:界面控件中数据和事件
本层输出件:
第一:调用M层的接口,更新M层(数据库)中的数据
第二:调用V层的接口,更新V层(界面)中的数据
在现实的开发过程中,代码真的就这么清晰地分成以上三种吗?
现实中,工程中还有以下几种类型的代码:
(1)接口文件[数据操作]
(2)解析通过接口获取的数据[数据操作]
(3)开源框架(实现各种界面效果、解析各种数据)[数据操作+V显示]
(4)工具类(比如为图片增加圆角、实现checkbox、实现各种页面效果、数据加密解密)[数据操作+V显示]
(5)本项目提炼的公用类(如验证、升级检测、数据更新等)[数据操作M]
业务层BusinessLayer:
可以调用:数据层
可以被调用:控制层
组织当前软件独特的业务体系,只处理数据,和数据层和控制层有关系,和界面层没有任何关系。
常见业务:
(1)数据同步(用到数据层数据操作和界面层的数据)
(2)软件升级
(3)登录验证
(4)账号有效性验证
控制层ControllerLayer:只负责数据层和界面层的数据同步(通过业务层来实现)
数据层DataLayer:只和数据打交道,和业务毫无关系
界面层ViewLevel:只和界面打交道,和控制层打交道,和其他层毫无关系
上面写的比较乱,来张图,看看能不能捋清楚,知道我们在实际编码过程中组织各种代码和文件:
用MVC思想重构一个项目的核心就是剥离出这个项目的业务逻辑。
什么是项目的业务逻辑?所谓业务逻辑关注点主要集中在业务规则的制定、业务流程的实现等与业务需求有关的系统设计。简而言之,所谓业务逻辑就是指业务规则。凡事有规则的东西,就是业务逻辑,没有规则的东西就不是业务逻辑。
利用MVC思想组织的文件结构一例:

参考:
用自己的话讲对mvc的理解,直观 http://hi.baidu.com/javvinnet/item/c231542073c3f851c38d5944
对mvc专业的解释: http://www.cnblogs.com/shanyou/archive/2010/04/03/1703501.html
三层开发 http://baike.baidu.com/link?url=9eOHD-1z9BUIxInOTlj4yna0KRILwQNXkPa-4LEPZhfjIoBzjyx6e6Au3SEvW-eqANLCTFVgqTtYMPbAhZRh2K
浅析iOS程序设计模式(基于MVC)的更多相关文章
- iOS开发--Swift 基于MVC设计模式的简单的tableViewDemo
如果说MVC是最好的设计模式, 可能很多人并不赞同, 但是如果说MVC是最主流, 应用面最广的设计模式, 我想这是毫无争议的. 不说废话, 直接演示在Swift中如何使用MVC新建工程(我并没有新建文 ...
- iOS常用设计模式:MVC、单例、代理、观察者。
MVC 模型-视图-控制器(MVC)设计模式 MVC根据角色划分类,涉及到三个角色: Model:模型保存应用程序的数据. View:视图是模型的可视化表示以及用户交互的控件. Controller: ...
- iOS 基于MVC设计模式的基类设计
iOS 基于MVC设计模式的基类设计 https://www.jianshu.com/p/3b580ffdae00
- iOS基于MVC的项目重构总结
关于MVC的争论 关于MVC的争论已经有很多,对此我的观点是:对于iOS开发中的绝大部分场景来说,MVC本身是没有问题的,你认为的MVC的问题,一定是你自己理解的问题(资深架构师请自动忽略本文). 行 ...
- 转:iOS基于MVC的项目重构总结
转:http://www.cocoachina.com/ios/20160519/16346.html 关于MVC的争论 关于MVC的争论已经有很多,对此我的观点是:对于iOS开发中的绝大部分场景来说 ...
- 基于MVC设计模式的Web应用框架:struts2的简单搭建(一)
Struts2的初步介绍 Struts2是apache项目下的一个web 框架,普遍应用于阿里巴巴.京东等互联网.政府.企业门户网站.虽然之前存在了很大的安全漏洞,在2013年让苹果.中国移动.中国联 ...
- iOS 基于 MVC 的项目重构总结
关于MVC的争论 关于MVC的争论已经有非常多,对此我的观点是:对于iOS开发中的绝大部分场景来说,MVC本身是没有问题的,你觉得的MVC的问题,一定是你自己理解的问题(资深架构师请自己主动忽略本文) ...
- Spring MVC -- MVC设计模式(演示4个基于MVC框架的案例)
对于简单的Java Web项目,我们的项目仅仅包含几个jsp页面,由于项目比较小,我们通常可以通过链接方式进行jsp页面间的跳转. 但是如果是一个中型或者大型的项目,上面那种方式就会带来许多维护困难, ...
- 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表
创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...
随机推荐
- 解决阿里云安骑士漏洞警告:wordpress WPImageEditorImagick 指令注入漏洞
解决:wordpress WPImageEditorImagick 指令注入漏洞 前些天在阿里云服务器上安装了wordpress,阿里云提示有wordpress WP_Image_Editor_Ima ...
- 源码安装svn 1.8.9
2014年5月25日 12:26:14 需要文件: svn apr apr-util sqlite3 serf svn : http://subversion.apache.org/download/ ...
- css-position属性实例1
一:position说明 position fixed 实现固定在某个位置 正常情况写两个div是在一层中,通过position属性,可以实现分两层和固定,就像在墙上贴了一层纸,就分了两层了. pos ...
- Java中关于HashMap源码的研究
1.基础知识 1.数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1):数组的特点是:寻址容易,插入和删除困难. 2.链表 链表存储区间离散,占用内存比 ...
- Git安装及密钥的生成
1.下载Git软件:http://msysgit.github.io/ 2.安装git软件(很简单).安装成功后,在[开始]->[程序]->[git],下就会看见Git Bash和Git ...
- prometheus的平台侧和应用侧结合,实现应用的metrics的抓取
这个细节,迷惑了我一段时间,前面也写过一篇blog,描述过这个问题. 今天看到一种更好的解决方法. 记录一下. prometheus在k8s集群里,抓取应用的metrics. 是需要平台侧和应用侧相互 ...
- 归并排序 递归and非递归
什么是归并排序 归并排序其实就做两件事: “分解”——将序列每次折半划分. “合并”——将划分后的序列段两两合并后排序. 首先我们来看一下分解是怎样实现的呢? // 递归退出条件,及left ...
- vue-awesome-swiper使用纪实
最近做一个项目,需要用到轮播和全屏滑动功能,所以用到了vue-awesome-swiper插件,以下为个人记录下此插件的用法. 效果说明: 上面部分是个轮播图,自动开始轮播,轮播间隔为3000ms 推 ...
- canvas入门级小游戏《开关灯》思路讲解
游戏很简单,10行10列布局,每行每列各10盏灯,游戏初始化时随机点亮其中一些灯,点击某盏灯,其上下左右的灯及本身状态反转,如果点击前是灭着的,点击后即点亮,将所有灯全部点亮才算过关.游戏试玩: 下面 ...
- InnoDB的锁机制浅析(四)—不同SQL的加锁状况
不同SQL的加锁状况 文章总共分为五个部分: InnoDB的锁机制浅析(一)-基本概念/兼容矩阵 InnoDB的锁机制浅析(二)-探索InnoDB中的锁(Record锁/Gap锁/Next-key锁/ ...