1 简介
三者的目的都是分离关注,使得UI更容易变换(从Winform变为Webform),使得UI更容易进行单元测试。
2 MVC/MVP
2.1 MVC
1、View接受用户的交互请求
2、View将请求转交给Controller
3、Controller操作Model进行数据更新
4、数据更新之后,Model通知View数据变化
5、View显示更新之后的数据
View和Controller使用Strategy模式实现,View使用Composite模式,View和Model通过Observer模式同步信息。Controller不知道任何View的细节,一个Controller能被多个View使用。MVC的一个缺点是很难对Controller进行单元测试,Controller操作数据,但是如何从View上断言这些数据的变化呢?例如,点击一个View的按钮,提交一个事件给Controller,Controller修改Model的值。这个值反映到View上是字体和颜色的变化。测试这个Case还是有点困难的。
2.2 MVP
1、View接受用户的交互请求
2、View将请求转交给Presenter
3、Presenter操作Model进行数据库更新
4、数据更新之后,Model通知Presenter数据发生变化
5、Presenter更新View的数据
Presenter将Model的变化返回给View。和MVC不同的是,Presenter会反作用于View,不像Controller只会被动的接受View的指挥。正常情况下,发现可以抽象View,暴露属性和事件,然后Presenter引用View的抽象。这样可以很容易的构造View的Mock对象,提高可单元测试性。在这里,Presenter的责任变大了,不仅要操作数据,而且要更新View。
在现实中,MVP的实现会根据View的充、贫血而有一些不同,一部分倾向于在View中放置简单的逻辑,在Presenter放置复杂的逻辑;另一部分倾向于在presenter中放置全部的逻辑。这两种分别被称为:Passive View和Superivising Controller。
在Passive View中,为了减少UI组件的行为,使用Controller不仅控制用户事件的响应,而且将结果更新到View上。可以集中测试Controller,减小View出问题的风险。
在Superivising Controller中的Controller既处理用户输入的响应,又操作View处理View的复杂逻辑。
3 M-V-VM
MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。
MVVM是在原有领域Model的基础上添加一个ViewModel,这个ViewModel除了正常的属性意外,还包括一些供View显示用的属性。例如在经典的MVP中,View有一个属性IsCheck,需要在Presenter中设置View的IsCheck值。但是在MVVM中的Presenter也会有一个IsCheck属性来同步View的IsCheck属性,可能会用到Observer模式同步IsCheck的值。在MVVM中,Presenter被改名为ViewModel,就演变成了你看到的MVVM。在支持双向绑定的平台,MVVM更受欢迎。例如:微软的WPF和Silverlight。
复杂的软件必须有清晰合理的架构,否则无法开发和维护。
MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用。它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了。
昨天晚上,我读了《Scaling Isomorphic Javascript Code》,突然意识到,它们的区别非常简单。我用几段话,就可以说清。
一、MVC
MVC模式的意思是,软件可以分成三个部分。
视图(View):用户界面。
控制器(Controller):业务逻辑
模型(Model):数据保存
1接受用户指令时,MVC 可以分成两种方式。一种是通过 View 接受指令,传递给 Controller。
2.另一种是直接通过controller接受指令。
View 传送指令到 Controller
Controller 完成业务逻辑后,要求 Model 改变状态
Model 将新的数据发送到 View,用户得到反馈
基本的MVC所有通信都是单向的。
3.有些实际项目有了变形的MVC是前两种混合并且M与V是双向
实际项目往往采用更灵活的方式,以 Backbone.js 为例。
1. 用户可以向 View 发送指令(DOM 事件),再由 View 直接要求 Model 改变状态。
2. 用户也可以直接向 Controller 发送指令(改变 URL 触发 hashChange 事件),再由 Controller 发送给 View。
3. Controller 非常薄,只起到路由的作用,而 View 非常厚,业务逻辑都部署在 View。所以,Backbone 索性取消了 Controller,只保留一个 Router(路由器) 。
四、MVP
MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。
1. 各部分之间的通信,都是双向的。
2. View 与 Model 不发生联系,都通过 Presenter 传递。
3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。
五、MVVM
MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。
唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Angular 和 Ember 都采用这种模式。
相关推荐
iOS架构模式MVC、MVP、MVVM(内附demo)-附件资源
很多架构模式包括MVC,MVP,MVVP,里面有各种框架模版可参考使用
Databinding Demo,不是MVVP,MMVP是一种思想,Databinding是一种工具,要分清!!!!!!!!!!!!!
MVPvsMVVM-Android 一个Android项目,旨在了解MVP架构和MVVP架构之间的区别。
简单实现mvp和mvvp模式
MVVP MVVP架构示例 模型---负责域数据或操纵数据的,请考虑“ Person”或“ PersonDataProvider”类。 视图---负责表示层(GUI),对于iOS环境,请考虑以“ UI”前缀开头的所有内容。 ViewState-视图的状态,由...
传统的Android开发架构一般是MVC模式, Model:业务逻辑和实体模型 View:对应于布局文件 Controllor:对应于Activity 单独从逻辑看起来非常好,与我们做Web开发时,开发模式类似,但在实际开发中,View对应于...
It doesn't use dagger // mvp // mvvp or any other stuff that requires an more in depth knowledge of android. How to use it: Step 1: Fork/Clone this repo. Add a local.properties with your sdk ...
MVVMSample MVVP架构模式开源项目 Jetpack
使用Windows Forms App和MVVP模式创建的“#StopWatch”秒表。 Head First C#书中的应用。
Flutter架构蓝图 Flutter架构蓝图是一个项目,介绍了MVVM架构和项目结构方法来开发Flutter应用程序。 文献资料 要求 环境 的iOS iOS 13以上 安卓 Android 5.1以上minSdkVersion 22 targetSdkVersion 30 ...
它不使用匕首// mvp // mvvp或任何其他需要更深入了解android的东西。 如何使用它: 步骤1: 分叉/克隆此仓库。 在您的sdk位置添加一个local.properties(它应该由android studio自动完成) 或手动模式:下载该...
App莫名其妙的就选择了MVC的组合模式,最近才了解到Presenter和ViewModel:grinning_face_with_sweat:, 之后随着页面需要的数据量与数据类型的增加会更改为MVVP的组合模式的。最近谷歌又推出感觉好多代码可以省了,...
耗时一年在大学抽时间做的一款3D战旗游戏 没利用任何插件 Tween动画也是自己参考网上的去封装做的 整个架构用的MVVP模式 游戏逻辑用的状态机 具有高度可配性和扩展性
我总是学习android并尝试提高自己轮廓技能专长 安卓Kotlin(主要) Java建筑构件XML布局导航组件活动生命周期SQL Firebase实时数据库面向对象翻新会议室数据库(SQLite) 击剑匕首MVVP 滑行真相意式咖啡莫基托 :...
silverlight WPF 之MVVM框架增删改查实例
knockout快速入门无BUG,对象与控件在绑定。
Android-Test-Coverage:该项目包括举例说明单元测试和UI测试的实施,以确保新功能的质量和可维护性
WPF 使用MVVM设计模式对进行增删改操作 具体内容可以看我的博客:https://blog.csdn.net/Dear200892/article/details/101533249
MVVMArchitecture:使用Retrofit,Room,LiveData,RxJava2,Paging,Koin和带有数据绑定的MVVM模式的Android应用示例