MVC,MVP 和 MVVM 的图示

复杂的软件必须有清晰合理的架构,否则无法开发和维护。

MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用。它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了。

昨天晚上,我读了《Scaling Isomorphic Javascript Code》,突然意识到,它们的区别非常简单。我用几段话,就可以说清。

(题图:摄于瓦伦西亚,西班牙,2014年8月)

一、MVC

MVC模式的意思是,软件可以分成三个部分。

  • 视图(View):用户界面。
  • 控制器(Controller):业务逻辑
  • 模型(Model):数据保存

各部分之间的通信方式如下。

  1. View 传送指令到 Controller
  2. Controller 完成业务逻辑后,要求 Model 改变状态
  3. Model 将新的数据发送到 View,用户得到反馈

所有通信都是单向的。

二、互动模式

接受用户指令时,MVC 可以分成两种方式。一种是通过 View 接受指令,传递给 Controller。

另一种是直接通过controller接受指令。

三、实例:Backbone

实际项目往往采用更灵活的方式,以 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 都采用这种模式。

(完)

转载于:https://www.cnblogs.com/qiaoxu/p/4762913.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java JDBC学习实战(二): 管理结果集

在我的上一篇博客《Java JDBC学习实战(一): JDBC的基本操作》中,简要介绍了jdbc开发的基本流程,并详细介绍了Statement和PreparedStatement的使用:利用这两个API可以执行SQL语句,完成基本的CURD…

error: storage size of ‘threads’ isn’t known

出错的代码行: pthread_t threads[NUM_THREADS];原因: NUM_THREADS 无值 原先: #define NUM_THREADS修改为 #define NUM_THREADS 5

android之相机开发

http://blog.csdn.net/jason0539/article/details/10125017 android之相机开发 分类: android 基础知识2013-08-20 22:32 9774人阅读 评论(2) 收藏 举报Android在android中应用相机功能,一般有两种:一种是直接调用系统相机,一种自…

文件和文件夹权限-Win7公共盘中出现大量临时文件

公司中有一个文件服务器,给不同部门和员工设置了不同的权限,最近有员工(没有修改权限,有读取及执行,读取,写入)反映在公共盘上修改文件的时候会产生大量的临时文件,添加上修改权限之后就可以了,…

Duilib编辑框Edit输入完自动跳到下一个编辑框

首先xml文件中设置edit的maxchar参数&#xff0c;默认255好像。 <edit maxchar"10" />然后在notify函数中加入以下代码 if (msg.sType _T("textchanged")) {if (static_cast<CEditUI*>(msg.pSender)->GetMaxChar() msg.pSender->GetT…

Mysql数据库安全管理配置

1.删除test库 原因&#xff1a; The default MySQL installation comes with a database named test that anyone can access. This database is intended only for tutorials, samples, testing, etc. Databases named "test" and also databases with names starti…

duilib清空richedit内容

推荐使用以下方法&#xff1a; m_pRichEdit->SetSelAll(); m_pRichEdit->Clear();不推荐使用以下方法&#xff1a; m_pRichEdit->SetText("");虽然效果是一样的&#xff0c;但是当编辑框中文本存在多种格式的时候&#xff0c;第二种方法会存在问题&#x…

新学了一个用python编写的简单的百度贴吧帖子的爬虫

# -*- coding: utf-8 -*- #--------------------------------------- # 作者&#xff1a;chendn # 语言&#xff1a;Python 2.7.10 #---------------------------------------import string,urllib2 def tieba(url,beginPage,endPage):for i in range(beginPage,endPage1):…

duilib自定义消息

/** NOTE: All Message Numbers below 0x0400 are RESERVED.** Private Window Messages Start Here:*/ #define WM_USER 0x0400从WM_USER往上加就行了

BZOJ 2190仪仗队【欧拉函数】

问题的唯一难点就是如何表示队长能看到的人数&#xff1f;如果建系&#xff0c;队长所在的点为&#xff08;0,0&#xff09;分析几组数据就一目了然了&#xff0c;如果队长能看到的点为(m,n),那么gcd&#xff08;m&#xff0c;n&#xff09;1即m n 互质或者是&#xff08;0,1&a…

Codeforces Round #318 (Div. 2) B Bear and Three Musketeers (暴力)

算一下复杂度。发现可以直接暴。对于u枚举a和b&#xff0c;判断一下是否连边&#xff0c;更新答案。 #include<bits/stdc.h> using namespace std;int n,m; const int maxn 4001; #define PB push_back vector<int> G[maxn]; bool g[maxn][maxn]; int deg[maxn]; …

form表单,submit,ajax提交

尼玛... 一个简单的表单提交&#xff0c;竟然给我整的直郁闷。 本来就是个保存功能&#xff0c;几个前人都用的ajax提交&#xff0c;我也就没改成submit。然后坑爹的就来了。 我在表单里写了个<form></form>&#xff08;实际用ajax提交&#xff0c;也没必要写这个标…

windows 文件对话框

https://docs.microsoft.com/zh-cn/previous-versions/windows/desktop/legacy/bb776913(vvs.85)

python开发技术详解(一)

python是一门简单灵动的语言。从今天开始我要每天都做笔记&#xff0c;每天都要写博客记录我所想&#xff0c;我所学到的。 笔记提纲&#xff1a; 1&#xff0c;python的简单介绍&#xff0c;python的编译用法&#xff0c;有什么要注意的。 2&#xff0c;命名规则 3&#xff0c…

(Android Studio)添加文本框

此文大部分摘自http://hukai.me/android-training-course-in-chinese/basics/firstapp/building-ui.html android : id 这是定义View的唯一标识符。可以在程序代码中通过该标识符对对象进行引用&#xff0c;例如对这个对象进行读和修改的操作(在下一课里将会用到)。 当想从XML里…

java final keyword

依据上下文环境&#xff0c;java的keywordfinal也存在着细微的差别&#xff0c;但通常指的是“这是无法改变的。”不想改变的理由由两种&#xff1a;一种是效率&#xff0c;还有一种是设计。因为两个原因相差非常远&#xff0c;所以关键子final可能被吴用。 接下来介绍一下使用…

听GPT 讲Rust源代码--src/tools(24)

File: rust/src/tools/clippy/clippy_lints/src/types/borrowed_box.rs 在Rust源代码中的rust/src/tools/clippy/clippy_lints/src/types/borrowed_box.rs文件是Clippy项目的一个规则&#xff0c;用于检查可能是误用或错误的Box引用情况。 Rust中的Box是一个堆分配的值的所有权…

递归乘法

递归乘法。 写一个递归函数&#xff0c;不使用 * 运算符&#xff0c; 实现两个正整数的相乘。可以使用加号、减号、位移&#xff0c;但要吝啬一些。 示例1: 输入&#xff1a;A 1, B 10输出&#xff1a;10示例2: 输入&#xff1a;A 3, B 4输出&#xff1a;12提示: 保证乘法…

Building a RESTful Web Service

http://spring.io/guides/gs/rest-service/ Should shutdown tomcat service first , and then java -jar *.jar转载于:https://www.cnblogs.com/churuosi/p/4774151.html