IOS MVC、MVP、MVVM、VIPER架构详解

何为架构?

  • 软件开发中的设计方案。
  • 类与类之间的关系、模块与模块之间额关系、客户端与服务端的关系。

经常听到的架构名词?

  • MVC、MVP、MVVM、VIPER、CDD。
  • 三层架构、四层架构。

MVC

Model-View-Controller

  • Model:
    模型对象封装了应用程序的数据,并定义操控和处理该数据的逻辑和运算。例如,模型对象可能是表示商品数据 list。用户在视图层中所进行的创建或修改数据的操作,通过控制器对象传达出去,最终会创建或更新模型对象。模型对象更改时(例如通过网络连接接收到新数据),它通知控制器对象,控制器对象更新相应的视图对象。
  • View:
    视图对象是应用程序中用户可以看见的对象。视图对象知道如何将自己绘制出来,可能对用户的操作作出响应。视图对象的主要目的就是显示来自应用程序模型对象的数据,并使该数据可被编辑。尽管如此,在 MVC 应用程序中,视图对象通常与模型对象分离。
    在iOS应用程序开发中,所有的控件、窗口等都继承自 UIView,对应 MVC 中的 V。UIView 及其子类主要负责 UI 的实现,而 UIView 所产生的事件都可以采用委托的方式,交给 UIViewController 实现。
  • Controller:
    在应用程序的一个或多个视图对象和一个或多个模型对象之间,控制器对象充当媒介。控制器对象因此是同步管道程序,通过它,视图对象了解模型对象的更改,反之亦然。控制器对象还可以为应用程序执行设置和协调任务,并管理其他对象的生命周期。
    控制器对象解释在视图对象中进行的用户操作,并将新的或更改过的数据传达给模型对象。模型对象更改时,一个控制器对象会将新的模型数据传达给视图对象,以便视图对象可以显示它。
MVC
  • 优点:View、Model可以重复利用。
  • 缺点:Controller的代码过于臃肿。

MVP

Model View Presenter(模型 视图 协调器)

  • Model:
    数据对象,包含网络请求,以及数据 SQLite 的 CRUD(增加(Create)、读取(Retrieve)、更新(Update)和删除(Delete)) 操作(比如 iOS 平台,一般以 FMDB 框架直接操作 sql,或者用 CoreData) 。一般可以将数据对象是否需要缓存设计成一个字段 isCache,或者针对整个项目设计一个开存储关,决定整个项目是否需要数据缓存。我们常见的新闻类 App,在离线的时候看到的数据,都是做了缓存处理的。比如一些金融类的 App,实时性比较高,是不做缓存的。
  • View:
    就是 View 的一些封装、重用。在一款精心设计过的 App 里面,应该有很多 View 是可以封装重用的。比如一些自己的 TableViewCell,自己设计的 Button,一些 View(包含一些子 View,UI 精心设计过,在项目里多处出现的)等等。
  • Presenter:
    只是 Model 层和 View/ViewController层的一个桥梁。Presenter 层就不至于太臃肿,容易看懂。一些大的 App,或因为上线时间比较久了,经历过众多程序员的修补,或因前期并未做好架构,以至于打开一个类,几千行的代码,看着自己都晕。


    MVP
  • 优点:
    模型与视图完全分离,我们可以修改视图而不影响模型
    可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部
    我们可以将一个Presener用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
    如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)
  • 缺点:
    由于对视图的渲染放在了Presenter中,所以视图和Persenter的交互会过于频繁。
    还有一点你需要明白,如果Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么 Presenter也需要变更了。比如说,原本用来呈现Html的Presenter现在也需要用于呈现Pdf了,那么视图很有可能也需要变更。

MVVM

View、View Model、Model这三部分之间的相互解耦。

  • Model:
    与业务和验证逻辑有关的域模型,都可以认为是MVVM中的Model。比如:业务对象,数据传输对象(DTOs),实体,代理对象等等都可以认为是Model。
    这里的Model与MVC中的Model一样。
  • View:
    View负责定义页面结构,布局用户在屏幕上看到的界面。在iOS开发中,View一般是程序中的一个页面。一个View也可以是父View的一部分。
    每个View都有自己的View Model,或者它从父View中继承了View Model。View通常是通过通过View Model的绑定,或者调用View Model中的方法来获取数据。在运行的时候,UI控件要响应View Model抛出通知事件,来更新UI。
    为了响应UI上的交互,需要在View Model中实现相应的代码。比如一个按钮被点击。需要将这个按钮点击事件绑定到View Model中去。然后在View Model中写代码处理用户的交互。
    在iOS开发中View和ViewController都是属于View这部分。
  • View Model:
    View Model扮演着View和Model的中介角色,它负责处理视图逻辑和数据转化。一般来说View Model通过调用Model的方法来和Model进行交互。View Model随后将从Model中获取的数据以一种view容易使用的格式提供给View。View Model负责UI交互的响应代码实现。例如:当用户点击了一个按钮在UI中,这个动作会使得View Model中相应代码被执行。View Model也负责控制视图的显示逻辑,比如修改UI指示操作正在进行。
MVVM
  • 优点:
    方便测试 便于代码的移植。
    兼容MVC。
  • 缺点:
    类会增多,ViewModel会越来越庞大,调用复杂度增加。

VIPER

  • View(视图)
    提供完整的视图,负责视图的组合、布局、更新
    向Presenter提供更新视图的接口
    将View相关的事件发送给Presenter
  • Presenter(展示器)
    接收并处理来自View的事件
    向Interactor请求调用业务逻辑
    向Interactor提供View中的数据
    接收并处理来自Interactor的数据回调事件
    通知View进行更新操作
    通过Router跳转到其他View
  • Router(路由)
    提供View之间的跳转功能,减少了模块间的耦合
    初始化VIPER的各个模块
  • Interactor(交互器)
    维护主要的业务逻辑功能,向Presenter提供现有的业务用例
    维护、获取、更新Entity
    当有业务相关的事件发生时,处理事件,并通知Presenter
  • Entity(实体)
    和Model一样的数据模型
VIPER
  • 优点:
    可测试性好。UI测试和业务逻辑测试可以各自单独进行。
    易于迭代。各部分遵循单一职责,可以很明确地知道新的代码应该放在哪里。
    隔离程度高,耦合程度低。一个模块的代码不容易影响到另一个模块。
    易于团队合作。各部分分工明确,团队合作时易于统一代码风格,可以快速接手别人的代码。
  • 缺点:
    一个模块内的类数量增大,代码量增大,在层与层之间需要花更多时间设计接口。
    模块的初始化较为复杂,打开一个新的界面需要生成View、Presenter、Interactor,并且设置互相之间的依赖关系。而iOS中缺少这种设置复杂初始化的原生方式。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容

  • 想讨论下EOS和BTM比原,因为这里有个有趣的对比刚好符合这个议题。而我“刚好”也持有些这两种token,有兴趣写...
    李白起不来阅读 790评论 0 2
  • 据科学研究证明:现代人如果长期单一地食用精米白面可能会导致人体维生素B1的缺乏,继而严重危害人体健康。这就要求我们...
    惠顾星辰阅读 758评论 4 27
  • 同生在水池,也有凌云志。 金鳞化龙去,风云际会时。 鸿鹄高飞过,曾想生双翅。 鼓气与牛比,身小应自知。 温水煮其身...
    且行且进且珍惜阅读 344评论 3 6
  • 在一个完全陌生的地方 付出半生心血 咬牙买几间卧房 不为城市的高大上 只为避开那些无端的纠缠 在闹市之中结束流浪 ...
    瑜伽散人阅读 139评论 4 7