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相关推荐

  1. java mvc mvp mvvm_一篇文章了解架构模式:MVC/MVP/MVVM

    架构模式的文章很多,好理解的没有几个.大部分文章出现的主要问题有: 没有设定好作用域:前端MVC是改造过的MVC,和后台MVC有明显的区别,不能一概而论 没有实际的例子:实际的例子对应日常的工作,没有 ...

  2. 【Java基础】一篇文章读懂多线程

    1.多线程 1.1并发和并行 并发:两个或多个事件在同一时间段发生 并行:两个或多个事件在同一时刻发生 1.2线程和进程 进程是程序的一次执行过程,进程是系统运行应用程序的基本单位,一个应用程序可以同 ...

  3. java黄油刀_一篇文章玩转ButterKnife,让代码更简洁

    前言 话说,Android开发的兄弟们都知道,每次初始化控件,设置相应的事件,写的那点过程多而且恶心.我们先一块回顾下不堪的曾经~那些年,我们是这样初始化控件: // 每次的习惯上来写一个initVi ...

  4. Java 开发中 一篇文章讲清楚VO,BO,PO,DO,DTO的区别

    ⼀.概念定义 1.PO:Persistant Object(持久对象),基本上,PO对象中的属性就是对应着数据库中表的字段,加上⼀些get和set⽅法的组成.例:个⼈信息表中分别有:id,name,a ...

  5. Java实现统计一篇文章中英文单词出现的次数

    1. 准备工作 准备一篇英文文档放于D:\info.txt 输出 信息为Excel 表格.输出路径 D:\ 2. 创建一个Java maven 工程 引入依赖 <dependencies> ...

  6. 【Java多线程】一篇文章彻底解锁八锁现象(狂神说Java)

    文章目录 前言 一.标准情况下,两个线程谁先打印? 二.sendSms延迟4s,谁先打印? 三.添加一个普通方法,谁先打印? 四.两个对象两种方法,谁先打印? 五.增加两个静态的同步方法,只有一个对象 ...

  7. java jwe/jws_一篇文章带你分清楚JWT,JWS与JWE

    随着移动互联网的兴起,传统基于session/cookie的web网站认证方式转变为了基于OAuth2等开放授权协议的单点登录模式(SSO),相应的基于服务器session+浏览器cookie的Aut ...

  8. 【JAVA SE】一篇文章带你弄懂抽象类与接口

    大家好呀,我是制药

  9. Java 学习一篇文章就够了 (珍藏版)

    文章目录 一.Java 基础学习 二.Java 进阶学习 三.Java 扩展学习 一.Java 基础学习 Java 基础程序设计 第一章 认识Java 第二章 简单的Java 程序 第三章 Java基 ...

最新文章

  1. python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...
  2. python常用内置函数总结-Python 常用内置函数
  3. gcc 使用 stdio.h
  4. python退出循环快捷_python退出循环的方法
  5. 好看的简图动态背景图床源码 多接口聚合图床
  6. Java实现Oracle数据库备份
  7. GemBox Spreadsheet Professional 2.9
  8. 1057. 数零壹(20)-PAT乙级真题
  9. Kubernetes 小白学习笔记(21)--kubernetes的运维-管理Lable
  10. 常见密码归纳(入门级)
  11. 解决ios微信端video全屏
  12. 前端,通过面试去学习,开放问题(个人对前端发展的理解、项目难点、项目亮点、最复杂的逻辑、团队协作冲突问题、HR面试问题)
  13. Linux 启动时间优化实战,2.41 秒启动应用!
  14. ssm框架基于javaEE的企业办公OA管理系统
  15. 解决Webstorm通过Chrome无法调用JB插件调试的问题
  16. 基因对疾病的影响规律--读论文
  17. 有关血型的限制级秘密 (A型)
  18. Problem E: 穷游中国在统题 优先队列 + 模拟
  19. 大黄蜂好看吗?用python分析电影观看数据
  20. 诞生272年后,这个看似简单的数学问题终求得闭式解

热门文章

  1. [Silverlight]奇技银巧系列-5 捕获路由事件
  2. .NET 和 JAVA
  3. MFC+opencv 显示mat图像
  4. socket与文件描述符
  5. 开发基础之使用git把项目提交到github托管
  6. 剑指offer(12)旋转数组的最小数字
  7. java byte 拓展_Java项目中如何扩展第三方jar包中的类?
  8. python视频编辑过场动画_视频剪辑什么鬼?Python 带你高效创作短视频
  9. 西门子cpu指示灯含义_西门子S7200仿真软件如何使用?
  10. 小猿圈Java学习之通过命令行设置属性值