天天看点

谈谈我对MVC MVP MVVM的理解MVCMVPMVVM

一开始我接触MVC和MVVM的时候很困惑,不明白他是属于一种模式还是一种框架,通过查阅网上的一些文章依旧没有说清楚,有的说模式,有的说框架,还有说框架模式的,也有说架构的,这就让我更加蒙蔽了,于是我请教了我的软件工程老师,老师说“在咱们软件工程里说的是一种模式,当然MVC本身也是一种框架结构”,后来我和他说明了网上的几个叫法,他说怎么说都可以,好吧,不过我更倾向于说他是一种框架模式。

MVC

MVC框架模式常用于开发web应用软件使用的。按功能分为三个层次:

M:Model(模型层):

所有和数据相关的东西,可以类比于数据结构,为什么这说像而不是就是呢?因为其中和数据相关的东西可以包括一些方法。

V:View(视图层)

主要用于将数据进行显示,和UI的关系很大。view这里可以是多个样式的,我们知道操作系统中c++是可以跨平台的,但是UI就不可以了,如果想让他性能好的,就一个平台一个实现,所以我们的想法是最好把他封装起来,然后提供一个接口,一旦换一个平台操作,只要把这一块进行替换就可以了,这也体现了模块化设计。

那什么是模块化呢?我的理解

将一个复杂的程序依旧一定的规则(规范)封装成几个块(文件)并进行组合。

模块的内部数据的实现时私有的,只是向外部暴露一些接口(方法)与外部其他模块进行通信。这就是模块化。

优点:降低代码耦合度,减少重复代码,提高代码的重用性,并且在项目结构上更加清晰,便于维护。

C:Controller(控制层)

用于控制数据的变化,这一层算法比较多,用来控制数据结构。

谈谈我对MVC MVP MVVM的理解MVCMVPMVVM

该图片是在网上找到的,但是虚线一直都存在争议,网上的说法也比较模糊,这里对虚线部分不做过多探讨,也没有必要。只是知道他最基本的就是单循环成环状的即可。

说下三者之间的关系:看谁依赖于谁

view需要依赖于model,就是必须把model包括进view里面,需要完全了解model是啥,但是view有很多种,可以切换的,但是如果反过来,view就很难切换,相当于把view绑定到一起了,编译的时候,换个view就需要重新编译,显然应该是单向的,这里面体现了开闭原则,对扩展开放,对修改关闭。

这样view认识model ,但是model不认识view,这样讲两者分离了。

若是model的数据更改了,Controller发现会通知view

Model有变化了,这时候,view会取model里重新获得数据,接着显示。

因为controller需要控制数据,所以需要认识model,也就是完全依赖model,所以controller就是一套逻辑,如何操作数据的变化。

整个流程:controller控制model,model改了,view不知道,需要controller告诉更改了,然后view获取model更改的数据。这里产生一个疑问:为什么不能让控制器直接改了数据呢?这样就把控制器和view绑定了,view就没有存在的意义了,而且不符合单一职责原则,所以需要用一个通知view的过程。

后期出现了controller和view可以双向通信了,出现了按钮,也就是用户的输入,可能是文字的一些东西,事件源来自按钮,本身是控制器,而且他还存在着界面的显示,所以既是控制器,也是view,所以就存在了双向的关系了。

MVP

全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方 Presenter负责逻辑的处理,Model提供数据,View负责显示。

MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。

特点:

  1. 各部分之间的通信,都是双向的。
  2. View 与 Model 不发生联系,都通过 Presenter 传递。
  3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。
谈谈我对MVC MVP MVVM的理解MVCMVPMVVM

优点

1、模型与视图完全分离,我们可以修改视图而不影响模型

2、可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部

3、我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。

4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)

MVP和MVC的区别:

MVC中view和model是可以直接进行访问的,但是MVP中,不可以直接进行,需要Presenter来作为桥梁,所有的交互在presenter中进行,这样能够使view和model完全独立,修改试图也不会影响model。

MVVM

MVVM是在MVP基础上进一步演化过来的,只要将Presenter替换为ViewModel 即可。

MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。这种架构模式适合开发大型的软件。

model和modelView是双向包含

这个模式里面没有了控制器,所以对model层的一些控制就放在model层里了。

如何把数据的操作体现在view上,就需要VewModel了,其实ViewModel 是model的一个代言人,就是ViewModel怎么修改能够体现在view上,此处是双向连接。

总结来说view和model都认识ViewModel 但是View和Model是不认识的。

软件当中要做的一件事就是如何把视图和逻辑进行解耦。

这种模型的好处就是:

他还支持最小知识原则,也就是迪米特法则,

谈谈我对MVC MVP MVVM的理解MVCMVPMVVM

这里我们可以给他进行划分,model部分是程序员需要做的部分,view部分是UI设计是需要做的,其中的ViewModel就相当于接口,谁都认识,之后我们对其用到的语言进行分类。

Model部分用到的是纯c++部分,viewmodel是C++/Cx

View部分用的是Xaml的语言。

我们注意到MVVM与MVP除了中间的被替换之外,还有就是多了一个binding 也就是绑定器,比如说model进行了修改,不会需要再让ViewModel去通知view,而是viewModel自动让view进行了更改,因为viewModel和View进行了绑定。

所以平时写程序,就考虑一下界面怎么更改,把ViewModel做好就行,等程序员写好逻辑和相关的ViewModel关联就行,想更改view,就在ViewModel查找属性,然后更改,不用考虑太多。这样让业务更加专注了,只负责自己的职责就可以了。

这是我对这几个框架模式的理解,欢迎大家多多讨论~

继续阅读