MVC、MVP以及MVVM分析

来源:https://www.cnblogs.com/Acee/archive/2018/04/12/8806656.html
-Advertisement-
Play Games

網上現在MVC、MVP以及MVVM的講解一搜一籮筐,根據了網上大多數的文章,根據我的思考習慣進行了總結。 MVC介紹及分析: 各層的職責如下所示: Models: 數據層,負責數據的處理和獲取的數據介面層。 Views: 展示層(GUI),對於 iOS 來說所有以 UI 開頭的類基本都屬於這層,界面 ...


  網上現在MVC、MVP以及MVVM的講解一搜一籮筐,根據了網上大多數的文章,根據我的思考習慣進行了總結。

  MVC介紹及分析:

  

  各層的職責如下所示:

  Models: 數據層,負責數據的處理和獲取的數據介面層。

  Views: 展示層(GUI),對於 iOS 來說所有以 UI 開頭的類基本都屬於這層,界面元素搭建,動畫效果,數據展示。

  Controller: 控制器層,它是 Model 和 View 之間的膠水或者說是中間人。一般來說,當用戶對 View 有操作時它負責去修改相應 Model;當 Model 的值發生變化時它負責去更新對應 View,響應View的事件和作為view的代理,處理view的生命周期以及處理界面之間的跳轉。

  三者是完全獨立分開的,view和model是完全隔離的,而controller作為二者的中間人負責二者的交互,以保證復用性,但是因為controller是作為特定的場景存在的,多以很難服用,這也是MVVM和MVP產生的原因。      先說MVC:   想要做到上述這樣是很難的,因為一個界面的呈現是需要構建一個UIViewController的,但是每一個UIViewController都帶有一個view,這就導致了controller和view一起耦合在了ViewController裡面。iOS裡面的viewcontroller其實是view和controller的組合,目的就是為了提高開發效率,簡化操作。viewcontroller確實應付簡單頁面沒啥問題,認為真正的MVC就是這麼乾的,導致很多新手都把本來view層的代碼都堆到了VC,比如在VC裡面構建view、view的顯示邏輯,甚至在VC裡面發起網路請求。   對於model層的誤解:   model層的正確定義是業務模型,而不是只有幾個乾巴巴的屬性,也就是你所有業務數據和業務實現邏輯都應該定義在M層裡面,而且業務邏輯的實現和定義應該和具體的界面無關,也就是和視圖以及控制之間沒有任何的關係,它是可以獨立存在的。其實這裡面涉及到一個最基本的設計原則,那就是面向對象的基本設計原則。類應該是一個個具有不同操作和不同屬性的對象的抽象(類是屬性和方法的集合),供C層調用的都是M層裡面一個個業務類所提供的成員方法來實現。   總結來說:M層不應該是數據模型,放幾個屬性就完事了。而應該是承載業務邏輯和數據存儲獲取的職責一層。     正確構建MVC:viewcontroller不是C層,而是V和C兩層的混合體。   為了給VC減負,我們現在把VC只當做一個view的容器來使用,因為UIViewController其中有一個self.view,所有的界面上的view都需要addSubview來添加,所以此時的UIViewController的職責就是   1、生成子view並添加到自己的self.view上面   2、管理view的生命周期   3、通知每個子Controller去獲取數據     MVC優點:   1、代碼復用: 三個小模塊的V(cell/userInfoView)對外只暴露Set方法, 對M甚至C都是隔離狀態, 復用完全沒有問題   2、代碼臃腫: 因為Scene大部分的邏輯和佈局都轉移到了相應的MVC中   3、易拓展性: 需要的只是新建相應的MVC模塊, 加到對應的UIViewController即可.   4、可維護性:修改模塊,不需要更改其他的地方   MVC最大的缺點:controller的代碼沒法復用

  C層的功能還有哪些了

  1、作為View和Model的中介者,從model獲取數據,經過數據加工,渲染到view上面顯示

  2、響應view的點擊事件,然後執行相應的業務邏輯  

  3、作為view的代理和數據源

  4、暴露介面給UIviewController來驅動自己獲取數據

  這也就造成了有一些model和view強耦合,有些業務邏輯(頁面跳轉/點贊/分享…)是直接散落在V層的,因為業務邏輯最終改變的是數據M, 我們的關註點應該在M上, 而不是展示M的V。

 

  而MVP正是為瞭解決這一問題而誕生的,而MVVM是在MVP基礎上發展起來的。

  MVVM也就是model、View 和 ViewModel;其中視圖模型(ViewModel)其實就是 MVP 模式中的P,在 MVVM 中叫做VM。在 MVVM 的實現中,還引入了隱式的一個 Binder層,這也是MVVM相對MVP的進步,而聲明式的數據和命令的綁定在 MVVM 模式中就是通過binder層來完成的。MVVM和MVP相對於MVC最大的改進在於:P或者VM創建了一個視圖的抽象,將視圖中的狀態和行為抽離出來形成一個新的抽象已達到復用的目的。

  MVP的想法就是通過對view的事件處理,調用p的邏輯,時間執行成功後,p改變model的書籍,然後破獲掉view的代理乾煸view的顯示,但是時間多起來的話就很麻煩,這就是MVVM的binder機制,讓view的行為和狀態和p的行為狀態同步。


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

-Advertisement-
Play Games
更多相關文章
  • 前言 我在上篇博客 “Spring Boot 的實踐與思考” 中比對不同規範的 ORM 框架應用場景的時候提到過主從與讀寫分離,本篇隨筆將針對此和分庫分表進行更深入地探討。 1. 漫談 在進入正題之前,我想先隨意談談對架構的拓展周期的想法(僅個人觀點)。首先,我認為初期規劃不該太複雜或者龐大,無論項 ...
  • 訂閱+鏡像切換 主資料庫掛了之後,鏡像資料庫沒掛,那麼就需要把鏡像資料庫設置成主資料庫。 1.修改主機名,改成和主資料庫一樣的,重啟 2.修改資料庫中的主機名 IF SERVERPROPERTY('ServerName')<>@@SERVERNAME BEGIN DECLARE @srvname s ...
  • 在mysql的語法中。修改或者刪除的時候不能直接調用子查詢的結果集。需要先給子查詢其別名。在調用。 比如:下麵的去除重覆項 DELETE FROM t_equipment_type t WHERE t.type = 2 AND (t.type_code,t.type_name) IN ( SELEC ...
  • OUTPUT 子句 可以在數據進行增刪改的時候,可以返回受影響的行。先準備一張表 1、insert ,影響行在inserted表裡 返回結果: id name 1 a 批量插入: id name 2 b 2、delete ,影響行在deleted表裡 返回結果: id 1 3、update,會將新數 ...
  • 1.1游標的概念 游標(Cursor)它使用戶可逐行訪問由SQL Server返回的結果集。使用游標(cursor)的一個主要的原因就是把集合操作轉換成單個記錄處理方式。用SQL語言從資料庫中檢索數據後,結果放在記憶體的一塊區域中,且結果往往是一個含有多個記錄的集合。游標機制允許用戶在SQL serv ...
  • 當年忠貞為國酬,何曾怕斷頭? 如今天下紅遍,江山靠誰守? 業未就,身軀倦,鬢已秋。 你我之輩,忍將夙願,付與東流? 資料庫結構如下: 倉庫(倉庫號, 城市, 面積) 訂購單(職工號, 供應商號, 訂購單號, 訂購日期) 供應商(供應商號, 供應商名, 地址) 職工(倉庫號, 職工號, 工資) 具體數 ...
  • 在設置標題欄時常常遇到修改標題、修改返回按鈕標題、增加一些按鈕等需求,實現過程中一般會把UINavigationController、UINavigationBar、navigationItem及self.navigationController.navigationItem之間概念會混淆。 概念描 ...
  • 概述 在我們在進行自定義View的相關開發中,當我們更改了當前View的狀態,比如大小,位置等,我們需要重新刷新整個界面,保證顯示最新的狀態。在Android中,讓當前的視圖重繪有兩種方式,invalidate和requestLayout,今天我們看看這兩種方式的原理以及區別。 分析 invalid ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...