MVC、 MVP、 MVVM之間的區別

一、 簡介

三者的目的都是分離關注,使得UI更容易變換(從Winform變為Webform),使得UI更容易進行單元測試。

二、MVC/MVP

4418040-23d097570cd00e68

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、MVP

4418040-412961f9dc346e84

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的復雜邏輯。

三、 M-V-VM

4418040-71e568802be35f09

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。

歡迎關注我的公眾號(同步更新文章)DoNet技術分享平臺

閱讀原文

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272710.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272710.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272710.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java散列法的運用實例,Java HashMap compute() 使用方法及示例

Java HashMap compute() 使用方法及示例Java HashMap compute()方法計算一個新值,并將其與哈希映射中的指定鍵相關聯。compute()方法的語法為:hashmap.compute(K key, BiFunction remappingFunction)compute()參數compute()方法有兩個參數:ke…

team geek

1. 轉載自http://book.douban.com/review/6007037/,版權歸丸子(^.^)v所有。 New Google employees (we call “Nooglers”) often ask me what makes me effective at what I do. I tell them only half-jokingly that it’s very simple: I do the Right Thing for…

程序員經典語錄

1.A good programmer is someone who always looks both ways before crossing a one-way street. (Doug Linder)好的程序員即使在過單行道時也總是會環顧兩邊。2.Don’t worry if it doesn’t work right. If everything did, you’d be out of a job. (Mosher’s Law of Soft…

數字圖像處理應用matlab,數字圖像處理與應用(MATLAB版)

第 1章 緒論 1n1.1 圖像的概念 1n1.2 圖像的分類 2n1.3 圖像的表示 2n1.3.1 圖像信號的表示 2n1.3.2 數字圖像的表示 3n1.3.3 顏色模型 4n1.4 …

HDU 3948 不同回文子串個數

集訓隊論文中有求不同子串個數的做法,就是掃一遍height數組,過程中根據height數組進行去重。對于本題也是雷同的,只是每一次不是根據與排名在上一位的LCP去重,而是與上一次統計對答案有貢獻的后綴進行比較去重。 幾組數據 abacaba…

如何成為一名優秀的程序員?

1、理解技術債務技術債務就像信用卡一樣,會有很高的利息率,時間越長,修復所花的代價就越大,程序員對這個要有深刻的認識。同時團隊應該培養一種保證設計質量的文化,應當鼓勵重構、同時也應當鼓勵其它有關代碼質量的實踐…

php 發郵件附件pdf,php – 使用TCPDF發送電子郵件附件 | 碼農網

我有一個簡單的課程申請表,填寫完成后,會向申請人發送一封電子郵件,并附上他選擇作為pdf附件的課程的費用報價.我正在使用TCPDF并使用會話變量將數據從表單傳遞到庫.內容采用 html 格式.生成PDF并根據需要作為附件發送.問題是它是空白的..只有頁眉和頁腳在文檔中.在 linux 中尤…

數據庫同步傳輸軟件

Navicat轉載于:https://www.cnblogs.com/jizl/p/4995959.html

DoNet 高效開發必備開發工具

工欲善其事,必先利其器,沒有好的工具,怎么能高效的開發出高質量的代碼呢?本文為 ASP.NET 開發者介紹一些高效實用的工具,包括 SQL 管理,VS插件,內存管理,診斷工具等,涉及…

php eval 語法錯誤,PHP eval和捕獲錯誤(盡可能多)

我找到了一個很好的替代方案/答案 .首先,讓我首先說當我設置error_reporting(E_ALL)時,nikic的建議有效;通知顯示在PHP輸出中,并且由于OB,它們可以被捕獲 .接下來,我發現了這個非常有用的代碼:/*** Check t…

防止表單重復提交的解決方案整理

用戶在操作表單Post數據時往往會出現表單數據重復提交的問題,尤其在Web開發中此類問題比較常見。刷新頁面,后退操作以前的頁面,單機多次按鈕都會導致數據重復提交。此類問題是因為瀏覽器重復提交HTTP請求導致。下面列出了四種比較常用的解決方…

免費字典api ,查詢漢字完整信息

最大最全的新華漢語詞典,字典api根據接口列表返回的漢字id,查詢漢字完整信息。 接口名稱:字典api 接口平臺:第三方api 接口地址:http://v.juhe.cn/xhzd/queryid 支持格式:json/xml 請求方式:htt…

python正則去除換行符,關于python:用于刪除換行符的正則表達式

我是Python的新手,我遇到了正則表達式問題。 我正在嘗試刪除文本文件中每行末尾的換行符,但前提是它跟在小寫字母后面,即[a-z]。 如果該行的結尾以小寫字母結尾,我想用空格替換換行符/換行符。這是我到目前為止所得到的&#xff1…

收集一些程序員勵志經典名言

1、作為一個真正的程序員,首先應該尊重編程,熱愛你所寫下的程序,他是你的伙伴,而不是工具。2、程序員可以讓步,卻不可以退縮,可以羞澀,卻不可以軟弱,總之,程序員必須是勇…

Android develop 國際化

轉自別人的一片文章,出處以找不到了,覺得寫得不錯,記錄一下 一、概念 1.Internationalization(I18N) 國際化 使得App在不改的源碼、資源文件的情況下,能夠適應各國、各文化、各語言 是L10N的基礎 2.Localization(L10N) 本地化 為A…

php留言板記錄ip,如何用php程序記錄來訪IP

如何用php程序記錄來訪IP關注:226 答案:4 手機版解決時間 2021-02-16 00:05提問者失夜久伴你2021-02-15 01:22如何用php程序獲取來訪IP,然后保存在txt文件中,并且只保留最新的30個數據.最佳答案二級知識專家追尋☆①秒方向2021-02-15 02:19有一個全局的變量&#…

【基礎】jquery全選、反選、全不選代碼

1、JS代碼function ($) {//全選 反選 全不選$("#selAll").click(function () {$(".lists :checkbox").not(:disabled).prop("checked", true);});$("#unSelAll").click(function () {$(".lists :checkbox").not(:disabled).…

oracle 11g重新安裝配置,Oracle 11g數據庫安裝和卸載教程

Oracle11g的安裝教程同時解壓縮兩個zip文件,生成一個database文件夾,進入到database文件夾,點擊setup去掉安全更新的選項,直接下一步選擇創建和配置數據庫,點擊下一步選擇服務器類,點擊下一步選擇單例數據庫…

C語言中strdup函數使用方法

頭文件&#xff1a;#include <string.h> 定義函數&#xff1a;char * strdup(const char *s); 函數說明&#xff1a;strdup()會先用malloc()配置與參數s 字符串相同的空間大小&#xff0c;然后將參數s 字符串的內容復制到該內存地址&#xff0c;然后把該地址返回。該地址…

高級程序員和低級程序員的區別

低級程序員認為自己與高級程序員的區別, 主要是高級程序員任何功能都能編碼實現, 編碼速度快, 代碼無 bug. 正如一慣的那樣, 低級程序員之所以低級, 正是因為他們勉強能看到(或者根本看不到)事物的表象而看不到本質. 所以, 低級程序員總結出的一切東西, 你都可以大膽的忽略。所…