MVVM、MVC的區別、什么是MVVM

一、什么是MVVM

(一)定義

MVVM是Model - View - ViewModel的縮寫,它是一種軟件架構設計模式,主要用于構建用戶界面。這種模式將應用程序分為三個主要部分:

  1. Model(模型層)
    • 它是應用程序中負責數據管理和業務邏輯的部分。例如,在一個電商應用中,Model層可能包含商品信息(如價格、庫存等)、用戶信息(如用戶名、密碼等)以及與數據庫交互的代碼。Model層不直接與用戶界面交互,它只關注數據的存儲、獲取和處理。比如,當商品價格需要根據促銷活動進行調整時,Model層會負責計算新的價格,并將新的數據提供給其他部分。
  2. View(視圖層)
    • 這是用戶直接看到和交互的部分,也就是用戶界面。它可以是網頁、移動應用的界面等。View層的主要職責是展示數據和接收用戶的輸入。例如,在一個新聞閱讀應用的View層,會顯示新聞的標題、內容、圖片等信息,并且有按鈕讓用戶可以點贊、評論等。View層不直接處理數據邏輯,它只是將用戶的操作(如點擊按鈕)通知給ViewModel層。
  3. ViewModel(視圖模型層)
    • 它是連接View和Model的橋梁。ViewModel層的作用是將Model層的數據轉換成View層可以顯示的格式,并且將View層的用戶操作轉化為Model層可以理解的指令。例如,當用戶在新聞閱讀應用中點擊“點贊”按鈕時,ViewModel層會接收到這個操作,然后通知Model層去更新點贊數量。同時,當Model層的數據發生變化(如新聞內容更新)時,ViewModel層會將這些數據更新傳遞給View層,從而更新用戶界面。

(二)工作原理

  1. 數據綁定
    • 這是MVVM模式的核心機制之一。在MVVM框架下,View層和ViewModel層之間通過數據綁定進行通信。數據綁定可以是單向的也可以是雙向的。單向數據綁定通常是ViewModel到View,例如,ViewModel層從Model層獲取新聞標題數據,然后通過數據綁定機制將新聞標題顯示在View層的新聞標題區域。雙向數據綁定則允許View層和ViewModel層的數據相互更新。例如,在一個表單應用中,用戶在輸入框(View層)輸入內容時,ViewModel層的數據會實時更新,反之亦然。
  2. 命令綁定
    • 用于將用戶的操作(如點擊按鈕)從View層傳遞到ViewModel層。例如,在一個購物應用中,用戶點擊“加入購物車”按鈕,這個操作會通過命令綁定傳遞給ViewModel層,ViewModel層再根據業務邏輯(如檢查庫存等)處理這個操作,并且可能會通知Model層進行數據更新(如增加購物車中的商品數量)。

二、MVVM和MVC的區別

(一)架構組成

  1. MVC(Model - View - Controller)
    • MVC也是將應用程序分為三個部分:Model、View和Controller。
      • Model:和MVVM中的Model類似,負責數據和業務邏輯。
      • View:也是用戶界面部分,用于展示數據和接收用戶輸入。
      • Controller(控制器層):在MVC中,Controller是核心部分,它接收用戶從View層傳來的請求,然后根據請求去操作Model層,并且將處理結果返回給View層。例如,在一個在線課程平臺,當用戶點擊“報名課程”按鈕時,Controller會接收這個請求,然后去檢查Model層中的課程信息(如是否還有名額等),如果可以報名,就更新Model層的數據(如增加報名人數),最后將報名成功的信息返回給View層顯示給用戶。
  2. MVVM
    • 如前面所述,MVVM有Model、View和ViewModel三個部分。ViewModel在MVVM中起到了類似MVC中Controller的作用,但又有所不同。ViewModel更專注于數據綁定和視圖邏輯的處理,而不是像Controller那樣直接處理用戶的請求。

(二)數據流

  1. MVC
    • 數據流是線性的。用戶在View層發起操作,請求傳遞給Controller,Controller處理后更新Model或者將結果返回給View。例如,用戶在博客應用中點擊“發布文章”按鈕,View層將請求發送給Controller,Controller獲取文章內容等數據,然后更新Model層(如將文章存儲到數據庫),最后將發布成功的信息通過View層展示給用戶。
  2. MVVM
    • 數據流主要是通過數據綁定來實現的。View層和ViewModel層之間通過數據綁定雙向通信,ViewModel層和Model層之間也有數據交互。例如,在一個天氣應用中,Model層從天氣服務獲取天氣數據,然后通過ViewModel層的數據綁定機制,將天氣信息(如溫度、天氣狀況等)顯示在View層。當用戶切換城市時,View層通知ViewModel層,ViewModel層再通知Model層獲取新城市的天氣數據,然后更新View層。

(三)開發效率和復雜度

  1. MVC
    • MVC模式在一些簡單的應用程序中比較容易理解和實現。例如,對于一個小型的博客網站,通過MVC模式可以快速搭建起基本的發布文章、瀏覽文章等功能。但是隨著應用程序的復雜度增加,Controller可能會變得臃腫。因為Controller需要處理大量的用戶請求和業務邏輯,當功能越來越多時,Controller代碼可能會變得難以維護。
  2. MVVM
    • MVVM模式在數據綁定和視圖邏輯處理方面有優勢,特別是在復雜的用戶界面應用中。例如,在一個具有復雜表單和動態數據更新的企業管理軟件中,MVVM模式可以通過數據綁定減少大量的模板代碼,使得開發者可以更專注于業務邏輯的實現。不過,MVVM的學習曲線相對較高,需要開發者理解數據綁定、命令綁定等概念,并且在一些簡單的應用中可能會顯得過于復雜。

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

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

相關文章

【SpringCache 提供的一套基于注解的緩存抽象機制】

Spring 緩存(Spring Cache)是 Spring 提供的一套基于注解的緩存抽象機制,常用于提升系統性能、減少重復查詢數據庫或接口調用。 ? 一、基本原理 Spring Cache 通過對方法的返回結果進行緩存,后續相同參數的調用將直接從緩存中讀…

HRI-2025 | 大模型驅動的個性化可解釋機器人人機交互研究

作者:Ferran Gebelli 1 ^{1} 1, Lavinia Hriscu 2 ^{2} 2, Raquel Ros 1 ^{1} 1, Sverin Lemaignan 1 ^{1} 1, Alberto Sanfeliu 2 ^{2} 2, Anais Garrell 2 ^{2} 2單位: 1 ^{1} 1PAL Robotics, 2 ^{2} 2IRI (UPC-CSIC)論文標題:P…

Gitee Wiki:重塑關鍵領域軟件研發的知識管理范式

在數字化轉型浪潮席卷全球的當下,關鍵領域軟件研發正面臨前所未有的知識管理挑戰。傳統文檔管理模式的局限性日益凸顯,知識傳承的斷層問題愈發嚴重,團隊協作效率的瓶頸亟待突破。Gitee Wiki作為新一代知識管理平臺,正在通過技術創…

JVM 內存溢出 詳解

內存溢出 內存溢出指的是內存中某一塊區域的使用量超過了允許使用的最大值,從而使用內存時因空間不足而失敗,虛擬機一般會拋出指定的錯誤。 在Java虛擬機中,只有程序計數器不會出現內存溢出的情況,因為每個線程的程序計數器只保…

dvwa8——SQL Injection(Blind)

由題目得這一關用盲注寫 LOW: 先用bp抓包一下 , 看到這low是get提交 , f12打開hackbar 輸入?id1時報錯 嘗試閉合 , 回顯正常 開始注入 1.order by 判斷列數,3的時候開始回顯報錯,所以有兩列 ?id1 order by 2--&SubmitSubmit# 2.無回顯位置可以爆出,我們通過盲注來繼…

探索分布式存儲與通信:去中心化共享及通訊(DSAC)

在當今數字化時代,分布式系統的重要性愈發凸顯。它不僅能提升數據的存儲安全性和可靠性,還能增強通信的效率和隱私性。于是我做了這個去中心化共享及通訊的程序,它構建了一個強大的分布式存儲和通信網絡,下面我們就來詳細了解其實…

ass字幕嵌入mp4帶偏移

# 格式轉化文件,包含多種文件的互相轉化,主要與視頻相關 from pathlib import Path import subprocess import random import os import reclass Utils(object):staticmethoddef get_decimal_part(x: float) -> float:s format(x, .15f) # 格式化為…

05 APP 自動化- Appium 單點觸控 多點觸控

文章目錄 一、單點觸控查看指針的指針位置實現手勢密碼: 二、多點觸控 一、單點觸控 查看指針的指針位置 方便查看手勢密碼-九宮格每個點的坐標 實現手勢密碼: 執行手勢操作: 按壓起點 -> 移動到下一點 -> 依次移動 -> 釋放&am…

【軟件】在 macOS 上安裝 MySQL

在 macOS 上安裝 MySQL 有多種方法,以下是兩種常見的安裝方式:通過 Homebrew 安裝和通過安裝包安裝。以下是詳細的步驟: 一、通過 Homebrew 安裝 MySQL Homebrew 是 macOS 的包管理器,使用它安裝 MySQL 非常方便。 1.安裝 Home…

第11節 Node.js 模塊系統

為了讓Node.js的文件可以相互調用,Node.js提供了一個簡單的模塊系統。 模塊是Node.js 應用程序的基本組成部分,文件和模塊是一一對應的。換言之,一個 Node.js 文件就是一個模塊,這個文件可能是JavaScript 代碼、JSON 或者編譯過的…

力扣熱題100之二叉樹的直徑

題目 給你一棵二叉樹的根節點,返回該樹的 直徑 。 二叉樹的 直徑 是指樹中任意兩個節點之間最長路徑的 長度 。這條路徑可能經過也可能不經過根節點 root 。 兩節點之間路徑的 長度 由它們之間邊數表示。 代碼 方法:遞歸 計算二叉樹的直徑可以理解…

OpenCV CUDA模塊圖像處理------創建CUDA加速的Canny邊緣檢測器對象createCannyEdgeDetector()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 該函數用于創建一個 CUDA 加速的 Canny 邊緣檢測器對象(CannyEdgeDetector),可以在 GPU 上高效執行 Canny 邊…

unix/linux,sudo,其內部結構機制

我們現在深入sudo的“引擎室”,探究其內部的結構和運作機制。這就像我們從觀察行星運動,到深入研究萬有引力定律的數學表達和物理內涵一樣,是理解事物本質的關鍵一步。 sudo 的內部結構與機制詳解 sudo 的執行流程可以看作是一系列精心設計的步驟,確保了授權的準確性和安…

什么是 TOML?

🛠 Rust 配置文件實戰:TOML 語法詳解與結構體映射( 在 Rust 中,Cargo.toml 是每個項目的心臟。它不僅定義了項目的名稱、版本和依賴項,還使用了一種輕巧易讀的配置語言:TOML。 本文將深入解析 TOML 的語法…

react native webview加載本地HTML,解決iOS無法加載成功問題

在react native中使用 “react-native-webview”: “^13.13.5”,加載HTML文件 Android: 將HTML文件放置到android/src/main/assets目錄,訪問 {uri: file:///android_asset/markmap/index.html}ios: 在IOS中可以直接可以直接放在react native項目下,訪問…

數據結構(JAVA版)練習題

(題目難易程度與題號順序無關哦) 目錄 1、多關鍵字排序 2、集合類的綜合應用問題 3、數組排序 4、球的相關計算問題 5、利用類對象計算日期 6、日期計算問題 7、星期日期的計算 8、計算坐標平面上兩點距離 9、異常處理設計問題 10、Java源文件…

04-redis-分布式鎖-redisson

1 基本概念 百度百科:控制分布式系統之間同步訪問共享資源方式。 在分布式系統中,常常需要協調他們的動作。如果不同的系統或是同一個系統的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥來防止…

性能優化 - 案例篇:緩存_Guava#LoadingCache設計

文章目錄 Pre引言1. 緩存基本概念2. Guava 的 LoadingCache2.1 引入依賴與初始化2.2 手動 put 與自動加載(CacheLoader)2.2.1 示例代碼 2.3 緩存移除與監聽(invalidate removalListener) 3. 緩存回收策略3.1 基于容量的回收&…

使用jstack排查CPU飆升的問題記錄

最近,看到短視頻傳播了一個使用jstack來協助排查CPU飆升的案例。我也是比較感興趣,參考了視頻博主的流程,自己做了下對應案例的實戰演練,在此,想做一下,針對相關問題模擬與排查演練的實戰過程記錄。 案例中…

Sql Server 中常用語句

1.創建用戶數據庫 --創建數據庫 use master --切換到master數據庫 go-- 終止所有與SaleManagerDB數據庫的連接 alter database SaleManagerDB set single_user with rollback immediate goif exists (select * from sysdatabases where nameSaleManagerDB) drop database Sal…