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.pswp.cn/news/375597.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375597.shtml
英文地址,請注明出處:http://en.pswp.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