java mvc mvp_一篇文章让你彻底了解 MVC、MVP 、MVVM
MVC
MVC全名是Model--View--Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。其中Model层处理数据,业务逻辑等;View层处理界面的显示结果;Controller层起到桥梁的作用,来控制View层和Model层通信以此来达到分离视图显示和业务逻辑层。
我们往往把Android中界面部分的实现也理解为采用了MVC框架,常常把Activity理解为MVC模式中的Controller。
看似没有什么特别的地方,但是由几个需要特别关注的关键点:View是把控制权交移给Controller,自己不执行业务逻辑。
Controller执行业务逻辑并且操作Model,但不会直接操作View,可以说它是对View无知的。
View和Model的同步消息是通过观察者模式进行,而同步操作是由View自己请求Model的数据然后对视图进行更新。
MVC的优缺点优点:
把业务逻辑全部分离到Controller中,模块化程度高。当业务逻辑变更的时候,不需要变更View和Model,只需要Controller 换成另外一个Controller就行了(Swappable Controller)。
观察者模式可以做到多视图同时更新。
缺点:
Controller测试困难。因为视图同步操作是由View自己执行,而View只能在有UI的环境下运行。在没有UI环境下对Controller进行单元测试的时候, Controller业务逻辑的正确性是无法验证的:Controller更新Model的时候,无法对View的更新操作进行断言。
View无法组件化。View是强依赖特定的Model的,如果需要把这个View抽出来作为一个另外一个应用程序可复用的组件就困难了。因为不同程序的的Domain Model是不一样的
MVP
MVP其实是MVC的一种演进版本,它更简单,将MVC中的Controller改为了Presenter,View通过接口与Presenter进行交互,降低耦合,方便进行单元测试。View:负责绘制UI元素、与用户进行交互(Activity、View、Fragment都可以做为View层);
Model:对数据的操作、对网络等的操作,和业务相关的逻辑处理;
Presenter:作为View与Model交互的中间纽带,处理与用户交互的逻辑。可以把Presenter理解为一个中间层的角色,它接受Model层的数据,并且处理之后传递给View层,还需要处理View层的用户交互等操作。
关键点:View不再负责同步的逻辑,而是由Presenter负责。Presenter中既有业务逻辑也有同步逻辑。
View需要提供操作界面的接口给Presenter进行调用。(关键)
对比在MVC中,Controller是不能操作View的,View也没有提供相应的接口;而在MVP当中,Presenter可以操作View,View需要提供一组对界面操作的接口给Presenter进行调用;Model仍然通过事件广播自己的变更,但由Presenter监听而不是View。
MVP(Passive View)的优缺点优点:
便于测试。Presenter对View是通过接口进行,在对Presenter进行不依赖UI环境的单元测试的时候。可以通过Mock一个View对象,这个对象只需要实现了View的接口即可。然后依赖注入到Presenter中,单元测试的时候就可以完整的测试Presenter业务逻辑的正确性。
View可以进行组件化。在MVP当中,View不依赖Model。这样就可以让View从特定的业务场景中脱离出来,可以说View可以做到对业务逻辑完全无知。它只需要提供一系列接口提供给上层操作。这样就可以做高度可复用的View组件。
缺点:
Presenter中除了业务逻辑以外,还有大量的View->Model,Model->View的手动同步逻辑,造成Presenter比较笨重,维护起来会比较困难。
MVVM
MVVM模式(Model--View--ViewModel模式),和MVP模式相比,MVVM 模式用ViewModel替换了Presenter ,其他层基本上与 MVP 模式一致,ViewModel可以理解成是View的数据模型和Presenter的合体。
MVVM采用双向绑定(data-binding):View的变动,自动反映在ViewModel,反之亦然,这种模式实际上是框架替应用开发者做了一些工作(相当于ViewModel类是由库帮我们生成的),开发者只需要较少的代码就能实现比较复杂的交互。
MVVM的调用关系
MVVM的调用关系和MVP一样。但是,在ViewModel当中会有一个叫Binder,或者是Data-binding engine的东西。以前全部由Presenter负责的View和Model之间数据同步操作交由给Binder处理。你只需要在View的模版语法当中,指令式地声明View上的显示的内容是和Model的哪一块数据绑定的。当ViewModel对进行Model更新的时候,Binder会自动把数据更新到View上去,当用户对View进行操作(例如表单输入),Binder也会自动把数据更新到Model上去。这种方式称为:Two-way data-binding,双向数据绑定。可以简单而不恰当地理解为一个模版引擎,但是会根据数据变更实时渲染。
关键点:
MVVM把View和Model的同步逻辑自动化了。以前Presenter负责的View和Model同步不再手动地进行操作,而是交由框架所提供的Binder进行负责。
只需要告诉Binder,View显示的数据对应的是Model哪一部分即可。
MVVM的优缺点优点:
提高可维护性。解决了MVP大量的手动View和Model同步的问题,提供双向绑定机制。提高了代码的可维护性。
简化测试。因为同步逻辑是交由Binder做的,View跟着Model同时变更,所以只需要保证Model的正确性,View就正确。大大减少了对View同步更新的测试。
缺点:
过于简单的图形界面不适用,或说牛刀杀鸡。
对于大型的图形应用程序,视图状态较多,ViewModel的构建和维护的成本都会比较高。
数据绑定的声明是指令式地写在View的模版当中的,这些内容是没办法去打断点debug的。
结语
可以看到,从MVC->MVP->MVVM,就像一个打怪升级的过程。后者解决了前者遗留的问题,把前者的缺点优化成了优点。同样的Demo功能,代码从最开始的一堆文件,优化成了最后只需要20几行代码就完成。MV*模式之间的区分还是蛮清晰的,希望可以给对这些模式理解比较模糊的同学带来一些参考和思路。
最后,我自己是一名从事了多年开发的Java老程序员,辞职目前在做自己的Java私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的Java学习干货,可以送给每一位喜欢Java的小伙伴,想要获取的可以关注我的头条号并在后台私信我:01,即可免费获取。
java mvc mvp_一篇文章让你彻底了解 MVC、MVP 、MVVM相关推荐
- java mvc mvp mvvm_一篇文章了解架构模式:MVC/MVP/MVVM
架构模式的文章很多,好理解的没有几个.大部分文章出现的主要问题有: 没有设定好作用域:前端MVC是改造过的MVC,和后台MVC有明显的区别,不能一概而论 没有实际的例子:实际的例子对应日常的工作,没有 ...
- 【Java基础】一篇文章读懂多线程
1.多线程 1.1并发和并行 并发:两个或多个事件在同一时间段发生 并行:两个或多个事件在同一时刻发生 1.2线程和进程 进程是程序的一次执行过程,进程是系统运行应用程序的基本单位,一个应用程序可以同 ...
- java黄油刀_一篇文章玩转ButterKnife,让代码更简洁
前言 话说,Android开发的兄弟们都知道,每次初始化控件,设置相应的事件,写的那点过程多而且恶心.我们先一块回顾下不堪的曾经~那些年,我们是这样初始化控件: // 每次的习惯上来写一个initVi ...
- Java 开发中 一篇文章讲清楚VO,BO,PO,DO,DTO的区别
⼀.概念定义 1.PO:Persistant Object(持久对象),基本上,PO对象中的属性就是对应着数据库中表的字段,加上⼀些get和set⽅法的组成.例:个⼈信息表中分别有:id,name,a ...
- Java实现统计一篇文章中英文单词出现的次数
1. 准备工作 准备一篇英文文档放于D:\info.txt 输出 信息为Excel 表格.输出路径 D:\ 2. 创建一个Java maven 工程 引入依赖 <dependencies> ...
- 【Java多线程】一篇文章彻底解锁八锁现象(狂神说Java)
文章目录 前言 一.标准情况下,两个线程谁先打印? 二.sendSms延迟4s,谁先打印? 三.添加一个普通方法,谁先打印? 四.两个对象两种方法,谁先打印? 五.增加两个静态的同步方法,只有一个对象 ...
- java jwe/jws_一篇文章带你分清楚JWT,JWS与JWE
随着移动互联网的兴起,传统基于session/cookie的web网站认证方式转变为了基于OAuth2等开放授权协议的单点登录模式(SSO),相应的基于服务器session+浏览器cookie的Aut ...
- 【JAVA SE】一篇文章带你弄懂抽象类与接口
大家好呀,我是制药
- Java 学习一篇文章就够了 (珍藏版)
文章目录 一.Java 基础学习 二.Java 进阶学习 三.Java 扩展学习 一.Java 基础学习 Java 基础程序设计 第一章 认识Java 第二章 简单的Java 程序 第三章 Java基 ...
最新文章
- python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...
- python常用内置函数总结-Python 常用内置函数
- gcc 使用 stdio.h
- python退出循环快捷_python退出循环的方法
- 好看的简图动态背景图床源码 多接口聚合图床
- Java实现Oracle数据库备份
- GemBox Spreadsheet Professional 2.9
- 1057. 数零壹(20)-PAT乙级真题
- Kubernetes 小白学习笔记(21)--kubernetes的运维-管理Lable
- 常见密码归纳(入门级)
- 解决ios微信端video全屏
- 前端,通过面试去学习,开放问题(个人对前端发展的理解、项目难点、项目亮点、最复杂的逻辑、团队协作冲突问题、HR面试问题)
- Linux 启动时间优化实战,2.41 秒启动应用!
- ssm框架基于javaEE的企业办公OA管理系统
- 解决Webstorm通过Chrome无法调用JB插件调试的问题
- 基因对疾病的影响规律--读论文
- 有关血型的限制级秘密 (A型)
- Problem E: 穷游中国在统题 优先队列 + 模拟
- 大黄蜂好看吗?用python分析电影观看数据
- 诞生272年后,这个看似简单的数学问题终求得闭式解