MVC、MVP、MVVM概念梳理

一、框架模式

MVC、MVP、MVVM是框架模式,而非设计模式。
在软件开发领域有3种级别的重用:
内部重用,即在同一应用中能公共使用的抽象块;
代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域都能使用;
应用框架重用,为专业领域提供通用的或现成的基础结构,以获得最高级别的重用性。
框架模式是大智慧,用来对软件设计进行分工;
设计模式是小技巧,对具体问题提出解决方案,以提高代码复用率,降低耦合度。

二、MVC

MVC模式.png

Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
  通常模型对象负责在数据库中存取数据。
View(视图)是应用程序中处理数据显示的部分。
  通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分。
  通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

三、MVP

MVP是MVC的一种演化版本,MVP模式可以让分离显示层和逻辑层,它们之间通过接口进行通信,降低耦合。
我们的应用至少可以分为3层,这样我们可以对这3个层次进行独立的单元测试。
理想化的MVP模式可以实现同一份逻辑代码搭配不同的显示界面,因为它们之间并不依赖于具体,而是依赖于抽象。

MVP模式.png

Presenter 交互中间人
  Presenter主要作为沟通View和Model的桥梁,它从Model层检索数据后,返回给View层,使得View和Model之间没有耦合,也将业务逻辑从View角色上抽离出来。
View 用户界面
  View通常是指Activity、Fragment或者某个View控件,它含有一个Presenter成员变量。通常View需要实现一个逻辑接口,将View上的操作通过接口转交给Presenter实现,最后,Presenter调用View逻辑接口将操作Model的结果返回给View元素。
Model 数据的存取
  对于一个结构化的App来说,Model角色主要是提供数据的存取功能。Presenter需要通过Model层存储、获取数据,Model就像一个数据仓库。通常来说Model是封装了数据库DAO或者网络获取数据的角色,或两种数据获取方式的集合。

四、MVVM

MVVM模式.png

Model:MVVM的Model层与MVC、MVP没有太大区别,也主要是封装数据存储或操作的一些逻辑,与两者不同的是Model会提供一系列的实体类用作与UI进行绑定,ViewModel则会在修改这些数据后将数据变化告诉View层并使UI刷新。
View:View层与MVC、MVP一样,都是用于处理界面的逻辑且不参与业务逻辑相关的操作,只负责显示由ViewModel提供的数据。
ViewModel:本质是视图模型与视图状态的合称,其主要职责就是为View层提供一个可供其显示的数据模型并同时搜集、处理这些数据。

五、MVC、MVP与MVVM的异同

MVC MVP MVVM
Model 典型MVC中的Model与View存在耦合,一般情况下Model会以事件监听的方式将数据的改变告诉VIew层 MVP下的Model与View没有任何直接的耦合,其更像一个数据仓库对外提供相应数据 MVVM中的Model与MVP类似,只负责数据的封装,不同的是还会配合Binder绑定数据变化的监听
View 典型MVC中的View层比较简单,主要就是界面相关的逻辑,为了方便查询数据和监听数据变化,View还会与Model有一定的耦合 MVP下的View与MVC不同的是,View不再与Model有直接联系,同时在一些情况下View还会依赖于接口进一步解耦 MVVM中的View层除了处理UI相关的逻辑外还会配合Binder绑定UI变化的监听
Controller Presenter ViewModel
典型MVC中Controller主要处理用户交互逻辑,其接收View层的交互事件并根据事件的不同调用不同的Model层逻辑进行相关的数据操作或者直接进行View层的切换,对Controller而言,并不关心View层如何被展示,Controller只会修改对应的Model层,View层的刷新则由Model层通过观察者模式通知 Presenter的作用类似于MVC中的Controller,但是其会反作用于View层,Model层的数据更新会被首先反馈到Presenter,由Presenter优先处理并决定是否刷新以及刷新哪个View,也就是说说Presenter完全将View层与Model层隔离开,充当一个名副其实的中间人角色 相对于Controller和Presenter,ViewModel的职责更少,它将原本Controller和Presenter与View和Model交互的业务逻辑抽取交由Binder负责,大部分情况下Binder都会有对应框架层面的实现,比如android中的Databinding,对开发者而言自己实现ViewModel的部分加相对变少了

参考资料:
Android源码设计模式解析与实战

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

推荐阅读更多精彩内容