文档章节

一个简单登陆示例的MVC和MVP实现

 北方人在上海
发布于 2016/05/19 17:28
字数 1735
阅读 93
收藏 2
点赞 2
评论 1

xbeB5.jpg

作者:长剑废水(博客) 登录示例:MVC 自上篇《iOS基于MVC的项目重构》总结之后,我又思考了下面这个问题:在UIKit自身的设计中UIViewController是被当做C还是V呢? 例如我们点击View上某个Button时,可能会使用调用self.navigationController的pushViewController:animated:方法来跳转到一个新的界面。 在这个场景中,点击事件通过View传递到UIViewController,然后跳转到一个新的MVC。事件的逻辑处理是在UIViewController中完成的,事件的处理者是self(一个UIViewController),可见在UIKit中UIViewController是被视为Controller的。 那么第二个问题来了,如果需要在一个UIViewController中实现很复杂的View结构或者subViews之间的动画逻辑,那么如何合理设计UIViewController和UIView两者之间的关系呢? 在上文中说过,我的想法是通过给每一个UIViewController设计一个对应的XXXContainerView,通过这样的方式来强行分离V和C,避免由于V太复杂时出现MassiveViewController。但这样同时也带来了一个坏处:无法像在UIViewController自带的view里添加控件一样,可以将控件的响应方法直接绑定到UIViewController的.m文件中,也无法享受类似viewDidDisappear:生命周期方法带来的便利了。 当然,对于有一定MVC经验的开发者,也可以通过类似下面的代码来简化XXXContainerView这一层: 1 2 3 [self.view addSubview:self.topView]; [self.view addSubview:self.midView]; [self.view addSubview:self.bottomView]; 虽然任何Demo都不可能模拟出实际项目中遇到的问题,但通过不同横向对比还是很容易看出不同架构的区别所在。接下来,我将以我目前对MVC的理解,给出一个简单的登录示例Demo(Demo地址)。 Demo十分简单,这里仅做简单说明: LoginContainerView:负责创建用户所能看到的界面,以及将向Controller中传递登录事件和登录参数。 LoginModel:提供接口完成具体的登录业务,Demo中省略了网络层以及存储层。 LoginController:负责创建LoginContainerView,以及当监听到登录事件时,调用LoginModel中的登录业务方法。 由于仅为了明确MVC的结构,所以Demo中对很多实际项目设计到的业务没有具体处理,比如网络请求(Demo中通过本地进行了模拟),数据持久化,以及登录成功后rootViewController的切换。 这里有一点值得谈论的时,对用户输入数据的校验应该放在哪一层来完成呢?为了简化调用,Demo中是直接放在View层来进行判断的。当然,好像放在任何一层都有道理。 上面也提到过,MVC的一个复杂点在于,当View结构复杂之后,如果一个UIViewcontroller来管理多个的复杂的View,势必会造成View层和Controller层的交互变得复杂,并随着业务增长逐渐膨胀,直至崩溃。 那么,为每个单独的View构造一个对应的Controller是否可行呢? 其实UIKit就是这么做的,比如UINavigationController栈中的每一项,都是一个新的MVC,更具体的关于多重MVC的介绍可以参见斯坦福大学公开课:iOS 8开发-多重 MVC。 但是实际开发中对于我们自定义的继承自UIView的类,好像我们都并没有对其创建一个Controller的习惯—除非你愿意加班来完成这些额外的代码。苹果也没有强制推荐这么做—否则,只要设置不能单独创建UIView,只有通过UIViewController才能创建UIView就可以了。 接下来,同样对这个登录示例,我会再给出一个MVP的例子。通过二者横向对比,两者的差异会很明显的体现出来。 登录示例:MVP 在上文MVC登录示例中提到了一点,在一个Controller管理多个复杂View的场景时,C和V之间的事件以及参数传递会变得很不顺畅,而实际开发中我们也没有为每个继承自View创建对应Controller的开发习惯。 为什么会出现这么别扭的情况呢?《iOS基于MVC的项目重构》总结中我简单提到过MVC和MVP的差异: 我的理解是,MVP是用户视角:所见即View。MVC则是程序员视角:I control everyone。 在群里讨论的时候有人问我这句话如何解释,在这里我详细说明一下。 MVC中的C可以比喻为一个大管家,家里的每个成员(View)需要就餐时,会将每个人的口味偏好告知给管家(Controller),管家将这些信息告知厨房(Model),厨房做好后上菜开饭。 MVP中的P则可以比喻为一个私人秘书,你要吃什么直接跟秘书(Presenter)说就好了,只要秘书(Presenter)拥有调用厨房(Model)的权限即可。 一句话总结,C是家族大管家,P是贴身小秘书。 可能这里解释的还是不太清楚,还是直接用代码来说明吧。 MVP登录示例Demo Demo的简单说明如下: View层:LoginViewController负责创建UI,响应交互。当有交互事件触发时,调用自己的preseter的对应方法处理。 Presenter层:LoginPresenter,是LoginViewController的贴身秘书,负责具体处理事件交互,并将处理结果报告给LoginViewController。 Model层:LoginModel,完成登录业务逻辑。 对比MVC,以前View的事件通知给Controller可能需要使用block,delegate,View结构层级复杂的话可能还需要使用通知等等。还会多个View共用一个Controller的情况:Controller拿到Model的返回后,需要将返回值交给View并逐级传递下去完成展示。 而在MVP中,每个View都会有一个贴身Presenter来处理交互,这样就将原本MVC中的多View共用Controller的场景进行了拆分,这样避免了出现跨层传值的情况。(示例涉及到一个界面,因为没有模拟这种情况) 架构设计并不是为了给开发者增加麻烦,而是在开发及维护的大层面上给开发者减少麻烦。 可能有的开发者会说,这么简单的一个登陆随便写写不就完了,所谓”专家”就会把简单问题复杂化。但是,如果每个人都随便写写的话, “There are a thousand Hamlets in a thousand people’s eyes.” 莎士比亚的这句话在程序开发中绝对是禁忌,没有人愿意维护一段代码的时候还要穿越时空去复现你开发时的思维。

© 著作权归作者所有

共有 人打赏支持
粉丝 22
博文 187
码字总数 265578
作品 0
浦东
加载中

评论(1)

天堂流浪者
天堂流浪者
您好你现在在使用什么模式 mvp 或者是mvvm
第一篇:Asp.net MVP模式介绍

作者:BirchLee 2011年8月20日 22时10分【学而不思则罔,思而不学则殆】 本文内容: 1.什么是MVP模式 2.Asp.net MVP模式简单示例 1.什么是MVP模式 任何事物的出现,必有起因。 先看起源:软件...

birchlee ⋅ 2011/08/21 ⋅ 1

提供一个 APP 的不同架构实现--DesignResCollection

DesignResCollection 提供同一个 App 的不同架构实现,对其进行对比分析,方便大家选取使用 项目启发来自谷歌的同类框架项目 https://github.com/googlesamples/android-architecture 为什么...

boredream ⋅ 2016/08/17 ⋅ 0

MVP那些事儿 (2) 初探MVC架构

为什么要先介绍MVC? 如果你要想更佳深刻的理解MVP,并在实际开发中灵活的应用,那么就要先了解它的低配版MVC,他俩只是一步之遥,先了解MVC再学习MVP,MVP的优势才能凸显出来,这样连贯性的...

叫我丹尼尔 ⋅ 2017/12/02 ⋅ 0

冉超群/ZTheme

ZTheme是一款小巧的Android换肤框架,实现原理是动态加载APK,对基于MVP或MVC分层设计的View层进行替换,实现切换主题皮肤的功能。 ZTheme 使用示例 创建ZTheme方法声明 ZTheme createTheme...

冉超群 ⋅ 2017/11/14 ⋅ 0

MVC 与 MVP 的抉择

古人有句话说“十年河东、十年河西”,前几年在 Android 开发上,MVC 的设计一直是众人谈论的重点。但是随着时间的更替,MVP 似乎开始热了起来,连 Google 自家的示例中都提供了 MVP 的设计样...

_WZ_ ⋅ 2017/03/31 ⋅ 0

Android开发MVP模式解析

在开发Android应用时,相信很多同学遇到和我一样的情况,虽然项目刚开始构架时自认为MVC层级分的特别明确,但最终往往是一个Activity有好几百行代码,而且逻辑和UI显示完全混杂在一起,导致后...

hejunbinlan ⋅ 2015/09/10 ⋅ 0

MVP?MVC?移动开发如何选择正确的框架?

  【IT168 评论】设计模式和架构对创建一个成功可靠的应用程序至关重要,可是具备哪些特征才算得上一个好的架构呢?MVP、MVC和MVVM似乎都不错,该如何选择呢?   为什么以及如何选择正确的...

it168网站 ⋅ 2017/06/26 ⋅ 0

老生常谈Android的MVP架构

原生框架问题 由于原生 Android 开发应该已经是一个基础的 MVC 框架,所以在初始开发的时候并没有遇到太多框架上的问题,可是一旦项目规模到了一定的程度,就需要对整个项目的代码结构做一个...

LaxusJ ⋅ 04/23 ⋅ 0

浅谈MVP与Model-View-ViewModel(MVVM)设计模式

微软的WPF带来了新的技术体验,如Sliverlight、音频、视频、3D、动画……,这导致了软件UI层更加细节化、可定制化。同时,在技术层面,WPF也带来了诸如Binding、Dependency Property、Route...

高阳 ⋅ 2009/03/09 ⋅ 0

iOS 架构模式

架构模式 原文链接 : 链接 一个整体的分层? 逻辑清晰? 还是清晰的分工? 对于架构模式来说并没有一个非常明确的定义, 比较抽象, 在于设计在于架构, 不管是小到类与类之间的交互, 还是不同的小...

吃粑粑的毕教授 ⋅ 2017/12/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Confluence 6 从其他备份中恢复数据

一般来说,Confluence 数据库可以从 Administration Console 或者 Confluence Setup Wizard 中进行恢复。 如果你在恢复压缩的 XML 备份的时候遇到了问题,你还是可以对整个站点进行恢复的,如...

honeymose ⋅ 5分钟前 ⋅ 0

myeclipse10 快速搭建spring boot开发环境(入门)

1.创建一个maven的web项目 注意上面标红的部分记得选上 2.创建的maven目录结构,有缺失的目录可以自己建立目录补充 补充后 这时候一个maven的web项目创建完成 3.配置pom.xml配置文件 <proje...

小海bug ⋅ 17分钟前 ⋅ 0

nginx.conf

=========================================================================== nginx.conf =========================================================================== user nobody; #......

A__17 ⋅ 20分钟前 ⋅ 0

645. Set Mismatch - LeetCode

Question 645. Set Mismatch Solution 思路: 遍历每个数字,然后将其应该出现的位置上的数字变为其相反数,这样如果我们再变为其相反数之前已经成负数了,说明该数字是重复数,将其将入结果r...

yysue ⋅ 33分钟前 ⋅ 0

Python这么强?红包杀手、消息撤回也可以无视,手机App辅助!

论述 标题也许有点不好理解,其实就是一款利用Python实现的可以监控微信APP内的红包与消息撤回的助手。不得不说,这确实是一款大家钟意的神器。 消息撤回是一件很让人恶心的事,毕竟人都是有...

Python燕大侠 ⋅ 49分钟前 ⋅ 0

压缩打包介绍、gzip压缩工具、bzip2压缩工具、xz压缩工具

压缩打包介绍 压缩的好处不仅能节省磁盘空间而且在传输的时候节省传输时间和网络带宽 windows系统下文件带有 .rar .zip .7z 后缀的就是压缩文件 linux系统下则是 .zip, .gz, .bz2, .xz, ...

黄昏残影 ⋅ 54分钟前 ⋅ 0

观察者模式

1.利用java原生类进行操作 package observer;import java.util.Observable;import java.util.Observer;/** * @author shadow * @Date 2016年8月12日下午7:29:31 * @Fun 观察目标 **/......

Cobbage ⋅ 57分钟前 ⋅ 0

Ubuntu打印服务器配置

参考:https://blog.csdn.net/gsls200808/article/details/50950586 https://blog.csdn.net/jiay2/article/details/80252369 https://wiki.gentoo.org/wiki/HPLIP 由于媳妇儿要大量打印资料,......

大熊猫 ⋅ 今天 ⋅ 0

面试的角度诠释Java工程师(二)

原文出处: locality 续言: 相信每一位简书的作者,都会有我这样的思考:怎么写好一篇文章?或者怎么写好一篇技术类的文章?我就先说说我的感悟吧,写文章其实和写程序是一样的。为什么我会...

颖伙虫 ⋅ 今天 ⋅ 0

github中SSH的Key

https://help.github.com/articles/connecting-to-github-with-ssh/ https://help.github.com/articles/testing-your-ssh-connection/ https://help.github.com/articles/adding-a-new-ssh-k......

whoisliang ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部