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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...