前言
MVC,MVP,MVVP它们本质上是就是三种逐渐迭代的分离界面和业务逻辑的设计模式。其迭代过程由MVC->MVP->MVVM提示:以下是本篇文章正文内容,下面案例可供参考
一、MVC是什么?
MVC是Model-View-Controller简称,它首次把系统分成Model,View和Controller这三部分,明确的把用户界面和业务逻辑分离开来。M(Model):这里的Model就是业务逻辑的抽象,比如一个温控对象,它不仅包含当前的温度信息(数据),还包括设置温度,获取温度等方法。
V(View):View就是我们的界面上的控件,如button,label控件等。
C(Controller):控制器其实就是M和V的中间层,它主要作用就是从M获取数据,显示到V中,或者对V进行操作的时候通过调用View的事件函数,去对M进行操作。
在GUI中就是控件的事件处理函数,比如一个显示当前温度,并可以通过按键设置温度的例子,这里我是使用的lua,GUI引擎使用的AWTK。
二、MVP是什么?
在MVP里,Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。而且,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时候可以保持Presenter的不变,即重用。M(Model):模型还是MVC中的模型,这里不再赘述。
V(View):视图还是MVC中的视图,但它不需要向模型注册改变的事件通知了,这个由呈现逻辑去做了。
Presenter:Controller变成了Presenter只是表面现象,最重要的是MVP对视图进行了抽象,呈现逻辑不再像控制器那样直接访问具体的视图了,而是通过视图的接口去访问视图,视图的接口是抽象的,可以有不同的实现,所以可以方便的Mock出一个视图,让编写呈现逻辑的单元测试程序成为可能。注意,这里视图的接口并不是通用的,每个视图都有一个独立的接口,有一个真正的实现和一个用于测试Mock的实现。
为了方便说明,我们以一个编辑图书信息例子,看看要写哪些无聊的代码。这个例子非常简单,却要写不少无聊的代码:
-
1.初始化的时候,要为控件注册事件处理函数,比如为『保存』按钮注册事件处理函数。
-
2.初始化的时候,要把图书信息,如书名、作者和出版社等信息从模型中取出来,一个一个的设置到视图的控件中去,在这个过程中,可能需要对数据格式进行转换,比如出版日期,在模型中是一个整数,在视图上表现为一个字符串,这就需要转换。
-
3.在编辑结束时,要从视图中把图书信息,如书名、作者和出版社等信息一个一个的取出来,再保存到模型中去。在这个过程中,可能需要对数据格式进行转换,比如前面的出版日期,要把视图中的字符串转换回模型中的整数。
-
4.View都有一个接口定义,有一个真正的实现和一个Mock的实现。
这些代码很简单却很无聊,在每个有界面的模块中,都遵循同样的规律,却又完全不同,不得不重新编写。
三、MVVM是什么?
把MVP模式这些规律找出来进行抽象,通过一些规则在视图和模型建立联系,也就是数据绑定和命令绑定,就形成了MVVM模式。MVVM是Model-View-ViewModel简称。在MVVM中:
模型(Model)。模型还是MVC中的模型,这里不再赘述。
视图(View)。视图还是MVC中的视图,但它不需要向模型注册改变的事件通知了,这个由数据绑定去做了。
视图模型(ViewModel)。 ViewModel不是Controller也不是Presenter,视图模型是视图还是模型?按MVVM的发明者John Gossman的话说,视图模型是视图眼中的模型。放大镜下的虫子还是虫子,所以视图眼中的模型还是模型。视图模型与视图没有直接关系,是可以为之编写单元测试的。
呈现逻辑Presenter去哪里了?呈现逻辑从一行行代码变成了一条条数据绑定和命令绑定的规则,对规则的处理和解释成了MVVM框架或公用库,可以在多个项目中共享。
四、总结
- MVC/MVP/MVVM它们的M都是model的意思,这部分是不变的。
- MVC和MVP相比,MVC中的V是实际的ui控件对象,MVP中的V是ui控件对象的抽象(这样可以将view的变化限制在view层,类似于设计模式中的策略模式)。
- MVVM是将MVP的Presenter中用于ui抽象和数据绑定的逻辑代码抽出来,形成一个框架,以方便用户能够快速新增一个Presenter。而这个Presenter在MVVM中就是View-Model。
参考:
这一块主要借鉴了
AWTK-MVVM它详细描述了MVC,MVP,MVVM
https://github.com/zlgopen/awtk-mvvm/blob/master/docs/8.intro.md
大家有兴趣的可以去看下。
另外MVP以及MVC之间的区别
https://www.runoob.com/w3cnote/android-develop-mvp.html
这里有一个例子去说明MVP以及MVC之间的区别。我自己也写了下但是觉得写的并不好,所以就没有往上面放,大家有兴趣的可以去上面这个网站上去看下。