现代程序框架模式,MV-X

mv-x的含义

M:Model

V:View

X:View和Model的桥梁

MVC

C:Controller

大致定义:

View和Model一般没有交集,它们的交流通过Controller来进行,即:

Model和View由Controller来管理,一般除了View的响应由Controller来实现(由View传向Controller),Model的变化及View的设置都会在Controller来实现(Controller单向传给其余两个),View本身不会和Model有任何交集或很少交集(Model的变化直接反映在View上)

如果三者的负责不均匀就会有各种变种的MVC,最著名的是Massive View Controller(Controller负责绝大部分的事,Model和View的存在感太弱,这种其实已经很接近MVP了)

MVP

P:Presenter

MVP的出现主要是为了完全切断MVC中View和Model的联系,Presenter负责Model的变化,同时负责View(Controller)的变化,同时接受处理View的事件,从而减少维护的成本(需要修改时代码都放在一块了)

传统的iOS结构其实更接近MVP, viewController就相当于Presenter,什么都写在Presenter中

MVVM

VM:ViewModel

实际关系:

View(Controller) <-> View Model <-> Model

View 负责按照处理好的数据显示界面

View Model 负责更新数据和展示数据到View上,同时数据的测试只需要通过View Model就能实现,View Model的重点是为了把View和Model完全隔离开

Model 只负责原本Controller中的数据处理

在传统的 MVC 上简化 View 和 Controller的负担(实际上iOS架构基本是把这两个合并),顺便降低了耦合性,如果愿意的话,实际上ViewModel是可以复用的:把View,Model直接的映射抽象化,把常用的方法放进去,但这样还不如做成View的分类

VIPER

一种什么都通过协议联系的结构

优点

解藕程度几乎是所有MVC类型结构中最高的,而且与Core Data几乎是绝配

缺点:过于啰嗦,甚至在小模块中就需要有十几二十个类(典型的例子就是https://www.objccn.io/issue-13-5 这个例子,两个界面加上Core Data就20多个类,还得依照要求配套协议,如果按照传统的MVC来实现,不算Core Data,最少3个类就能实现了)

View视图

展示界面,接受用户事件

Entity实体

相当于MVC的Model,并且是纯数据类,所有数据的处理都由Interactor接管

剩下的三个基本是实现协议的NSObject,三者不会直接关联,而是通过协议联系,甚至Presenter和Controller之间也是通过协议联系:

Presenter展示器

相当于MVVM里ViewModel的主要工作,把View的事件传递给Interactor,并且处理Interactor的回调给其他Presenter

实际上Presenter也不与View交互,而是与Controller交互,但iOS里的View和Controller基本是合并的状态所以就直接说是View了

Router路由(有些地方也会称为WireFrame)

功能基本等价于iOS中的navgationController,Router负责管理各个Presenter,创建Controller,匹配Presenter和Controller,跳转Controller

Interactor交互器

负责业务分析,(联网)读取数据,接受Presenter传递过来View的事件,处理并更新Entity,回调Presenter工作

Interactor还会和data manager/network manager打交道,分离数据的读写

实际上Controller还是存在的,只是它的工作变成了准备View和调用Presenter,接受Presenter的回调

VIPER大致拆为两部分

View层:View-Presenter-Router 和 数据层:Interactor-Entity

这两部分通过Presenter和Interactor通信,尽可能解藕其他部分

实际上只要能把View,Entity完全分开(通过Interactor分开,只有Interactor能访问Entity),只要符合这点,viper可以以任意组合进行

在把View和Entity完全分开后,要怎么用Entity设置View呢?

这里可以为Entity做一层桥接器,Presenter通过桥接器把Entity转换成能识别的格式(View的专属ViewModel,这里的Model就真的是Model的意思了)

完整的viper大概长这样(不是绝对的,但View和Model分开是主要目的):

Pasted Graphic 2.jpg

由上图可以看出。虽然本质还是一个MVC,但解藕程度已经非常高了,不同的Entity通过不同的Converter可以用于不同的View,缺点是需要的类真的超多。

Interactor和NetworkManager/DataManager直接通信也存在一个中间模型的转换用作解藕

好处就是测试数据正确性的时候,由于View完全独立于数据层,直接对interactor进行测试就能跳过View那部分了,而且开发流程可以转变为,先编写测试代码,然后实现数据层的正确性后,再开始开发View层,还可以先编写Presenter的测试代码再实现界面,最后编写UITest

实际上这种多协议的结构,用RAC这类框架能够更好的简化调用

总结:适合复用程度高的项目,同时要求整个项目都按照一样的结构构件每个模块的时候,可以取得最大优势,由于过于依赖不同的Model和通过协议回调,viper更适合使用Swift的项目

ModelController

简单的解藕还可以通过ModelController把对Model数据的操作,计算,甚至是数据的更新都放到ModelController中,用的时候就初始化一个ModelController来用,其余时候都只需要用Model就行,虽然叫ModelController,但ModelController是跟View绑定的...操作的事务都是为了View来操作Model

ModelController为了解藕都不会暴露Model,而是通过提供同质的pubic属性把Model内的数据合成并传递出去(通过ModelController进行单向的数据流动),如:

class UserModelController {

    private var user: User
        init(user: User) {
        self.user = user
    }

    var displayName: String {
        return "(user.firstName) (user.lastName)"
    }
}

该例子来自:https://www.swiftbysundell.com/posts/model-controllers-in-swift ,更具体的ModelController可以查看该文章(纯英文)

通过block回调/代理/KVO等方式在Model变化/更新的时候通知出去更新View

其实ModelController和ViewModel很像

喵神在MV-X的基础上总结了另一套以单向数据流为基础的结构,相关的总结可以查看:
https://www.jianshu.com/p/59b3aa74d1df

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容