一、框架模式
MVC、MVP、MVVM是框架模式,而非设计模式。
在软件开发领域有3种级别的重用:
内部重用,即在同一应用中能公共使用的抽象块;
代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域都能使用;
应用框架重用,为专业领域提供通用的或现成的基础结构,以获得最高级别的重用性。
框架模式是大智慧,用来对软件设计进行分工;
设计模式是小技巧,对具体问题提出解决方案,以提高代码复用率,降低耦合度。
二、MVC
MVC模式.pngModel(模型)是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。
View(视图)是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
三、MVP
MVP是MVC的一种演化版本,MVP模式可以让分离显示层和逻辑层,它们之间通过接口进行通信,降低耦合。
我们的应用至少可以分为3层,这样我们可以对这3个层次进行独立的单元测试。
理想化的MVP模式可以实现同一份逻辑代码搭配不同的显示界面,因为它们之间并不依赖于具体,而是依赖于抽象。
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模式.pngModel: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源码设计模式解析与实战
网友评论