MVC,MVP,MVVM是什么?


前言

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。

View层是界面,Model层是业务逻辑,Controller层用来调度View层和Model层,将用户界面和业务逻辑合理的组织在一起,起粘合剂的效果。所以Controller中的内容能少则少,这样才能提供最大的灵活性。

在这里插入图片描述

二、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之间的区别。我自己也写了下但是觉得写的并不好,所以就没有往上面放,大家有兴趣的可以去上面这个网站上去看下。

猜你喜欢

转载自blog.csdn.net/Dr_chaser/article/details/109426412
今日推荐