敢於MVC,MVVM,MVP的區別

来源:http://www.cnblogs.com/paul-3/archive/2016/10/24/5992578.html
-Advertisement-
Play Games

MVC, MVP和MVVM都是用來解決界面呈現和邏輯代碼分離而出現的模式。以前只是對它們有部分的瞭解,沒有深入的研究過,對於一些裡面的概念和區別也是一知半解。現在一邊查資料,並結合自己的理解,來談一下對於這三種模式思想的理解,以及它們的區別。歡迎各位高手拍磚。 閱讀目錄: 一. MVC, MVP, ...


    MVC, MVP和MVVM都是用來解決界面呈現和邏輯代碼分離而出現的模式。以前只是對它們有部分的瞭解,沒有深入的研究過,對於一些裡面的概念和區別也是一知半解。現在一邊查資料,並結合自己的理解,來談一下對於這三種模式思想的理解,以及它們的區別。歡迎各位高手拍磚。

閱讀目錄:

一. MVC, MVP, MVVM誕生的需求?

二. 一段典型的耦合代碼

三. MVC模式

     3.1 主動MVC

     3.2 被動MVC

     3.3 Web應用中的MVC框架

     3.4 MVC總結

一,MVC, MVP, MVVM誕生的需求?

軟體中最核心的,最基本的東西是什麼? 是的,是數據。我們寫的所有代碼,都是圍繞數據的。
圍繞著數據的產生、修改等變化,出現了業務邏輯。
圍繞著數據的顯示,出現了不同的界面技術。 

沒有很好設計的代碼,常常就會出現數據層(持久層)和業務邏輯層還有界面代碼耦合的情況。

ORM等框架,解耦合了業務邏輯和數據之間的耦合,業務邏輯不再關心底層數據如何存儲和讀取。所有數據呈現給業務邏輯層的就是一個個的對象。
而MVC, MVP, MMVM用來解決業務邏輯和視圖之間的耦合。

二,一段典型的耦合代碼

複製代碼
{

SqlDataAdapter adapter = new SqlDataAdapter("select * from Table1","server=.;database=db;uid=sa;pwd=password");

DataSet ds = new DataSet("ds1");

adapter.Fill(ds);

this.GridView1.DataSource = ds;

this.GridView1.DataBind();

}
複製代碼

上面的這段代碼中,既包含了數據訪問,還包含的頁面展示。當項目複雜程度更高,這種代碼就會變得非常難以維護,層次也不清晰。

三,MVC模式

MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫。MVC開始是存在於桌面程式中的,M是指業務模型,V是指用戶界面,C則是控制器,使用MVC的目的是將M和V的實現代碼分離,從而使同一個程式可以使用不同的表現形式

3.1 主動MVC

MVC的理論思想對應的是主動MVC, 這裡的主動的意思是, Model會主動通知View更新。而我們使用MVC框架, Struts, asp.NET mvc等都不是主動MVC(視圖的更新都是通過Controller完成的)

Model

用於封裝與應用程式的業務邏輯相關的數據以及對數據的處理方法。
模型中數據的變化一般會通過一種刷新機制被公佈。為了實現這種機制,那些用於監視此模型的視圖必須事先在此模型上註冊,從而,視圖可以瞭解在數據模型上發生的改變。

View

視圖層負責數據的展示。
在視圖中一般沒有程式上的邏輯。為了實現視圖上的刷新功能,視圖需要訪問它監視的數據模型(Model),因此應該事先在被它監視的數據那裡訂閱Model的事件。

Controller

控制器是M和V之間的連接器,用於控制應用程式的流程。它處理事件並作出響應。“事件”包括用戶的行為和數據模型上的改變。

 

image

 

3.2 被動MVC

下圖是被動MVC中的流程,和主動MVC不同之處是, View沒有訂閱Model數據變化的事件,等待Model來通知需要根據新的數據來更新View. 在被動MVC中,Controller負責通知View, 有數據變化,需要更新視圖。

image

 

被動MVC 中,與主動MVC的區別在於: 
1、模型對視圖和控制器一無所知,它僅僅是被它們使用 
2、控制器使用視圖,並通知它更新數據顯示 
3、視圖僅僅是在控制器通知它去模型取數據的時候它才這麼做(視圖並不會訂閱或監視模型的更新) 

3.3. Web應用中的MVC框架

Web中的MVC框架都是被動MVC模式,因為web應用中, 由於http是基於請求和響應方式協同工作的,因此當伺服器端的model(數據)發生變化時,它不會立即更新客戶端的view,只有客戶端重新請求或刷新頁面時才更新.

下圖是典型的MVC框架中的MVC一個請求流程。

image

3.4 MVC總結

MVC優點

  • 由於MVC很好的分離了視圖層和業務層,所以它具有以下優點
  • 耦合性低
  • 開發速度快
  • 可維護性高
  • 沒有控制項的概念,對html沒有封裝,易於理解
  • 和其它平臺(java, php)等更加相似。便於人才獲取

 

MVC使用的誤區

1.把Model理解成實體類(Entity),在MVC中Model應該包含2部分功能,一部分是處理業務邏輯,一部分是提供View顯示的數據
2.把業務邏輯全部放在Controller端

這兩個誤區本質上都是對Model的作用不明導致的。

Model在MVC架構中起的作用非常重要,它應該是業務邏輯真正的實現層。所以Model的實際上是Business Model(業務模型)。而Controller僅僅起一個“橋梁”作用,它負責把View的請求轉發給Model,再負責把Model處理結束的消息通知View。Controller是用來解耦View和Model的,具體一點說,就是為了讓UI與邏輯分離(界面與代碼分離)。

引自http://www.techopedia.com/definition/27454/model-mvc-aspnet

Techopedia explains Model (MVC)

The Model is the part of MVC which implements the domain logic. In simple terms, this logic is used to handle the data passed between the database and the user interface (UI).

The Model is known as domain object or domain entity. 
The domain objects are stored under the Models folder in ASP.NET. The domain model represents the application perspective for the data to be handled whereas a view model is required to produce the engine that generates the View.

This definition was written in the context of ASP.NET.

 

MVC的缺點

完美的MVC應用場景應該是這樣的:

有個Student Model, 關聯StudentListView,  StudentEditView.
對於StudentListView, Student Model提供Student的集合數據來顯示StudentListView
對於StudentEditView, Student Model提供單個Student數據來展示StudentEditView並且響應StudentEditView的保存操作。

但是這隻是完美的情況,實際應用中,在ListView上,不單單顯示Student的信息,可能還需要這個Student的歷史成績,家庭情況,  老師信息。而這些是Student Model不能提供的。
也許我們可以擴展Student Model, 將Student Model能夠提供的信息擴展,包含成績信息等,這本身也可以。但是,如果Student顯示的View,這個需要只是需要額外的成績信息,另一個View只是需要額外的家庭信息,Student Model是不是有些疲於奔命,你能知道還會有多少個差異化的View的需求? 而且讓邏輯端代碼這樣不斷的修改來適應View端,好嗎?

由於MVC的設計思想是從Model出發,而沒有考慮到View端的複雜性,這樣導致的問題是Model難以符合複雜多變的View端變化。
相對這點,MVP和MVVM就要好得多。它們都獨立出了Presenter 和ViewModel來對應每個View。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 接下來是apply的用法與理解 代碼大多是網上找的資料,然後自己隨手做了一下小改動,測試通過,便於自己理解-w- 便於理解的格式: 父類.call(子類); 父類.apply(子類,arguments); 和C#相反: class 子類 : 父類 { ... } ...
  • dataset--自定義屬性 HTMLElement.dataset data-*屬性集 元素上保存數據 liujl div.dataset. 屬性名 值 id “123456” accountName “liujl” name “劉江龍” email “[email protected]” mobi... ...
  • ...
  • 在逛別人的博客的時候,看見別人的代碼的例子使用了高亮的語法,無論是java,js還是php等等語言,都會自動的對關鍵字進行高亮。 於是在前幾天自己寫了一個博客,遇到code時,自然就想到了別人網站如何漂亮,巴拉巴拉。 開始了正式的搗鼓。 在搗鼓之前去別的網站看了看。這裡貼上簡書的效果: 其中的關鍵字 ...
  • 總有人問我面試時候原型鏈怎麼寫, 作為一位職場老司機,面試界的白神。身經百戰,擼出以下的代碼 怎麼樣,看懂的是不是覺得以上的代碼清新脫俗,煥然一新 沒看懂的,在這裡解釋下 首先我定義了interviewer(面試官)和handsome (英俊)2個函數。 然後給他們2個的原型加了點東西,當然主要是h ...
  • 圖片預覽的 javascript 本地操作 早期瀏覽器,不能將本地圖片作為頁面元素處理,要實現圖片預覽需要將圖片先上傳到伺服器,再從伺服器取得進行預覽 現代的瀏覽器功能越來越全面,因此可以實現對一些數據的本地處理 Chrome MsEdge(ie11) Firefox 上圖的html ...
  • 在學習ajax的過程中,我曾經遇到過這樣的一個問題,為了得到一個詳情列表,我要先向伺服器去請求得到索引表,簡單描述就是ajax中的success中的for迴圈中再次嵌套了ajax,結果第二層success中的ajax的success並不能取得上層ajax的success中的值。 我先使用ajax發送 ...
  • <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script type="text/javascript"> //substring()方法用於提取字元串中介於兩個指定下標之間的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...