Android 架構MVI、MVVM、MVC、MVP

目錄

一、MVC(Model-View-Controller)

二、 MVP(Model-View-Presenter)

三. MVVM(Model-View-ViewModel)

四. MVI(Model-View-Intent)

五.MVI簡單實現


先簡單了解一下MVC、MVP和MVVM。

一、MVC(Model-View-Controller)

模型-視圖-控制器
MVC的目的就是為了M和V代碼分離,降低耦合性。

Model:數據來源,網絡請求數據和數據庫數據。
View:對應xml布局文件和動態的布局部分。
Controller:邏輯控制部分。主要起到協調M層和V層的關系,起承上啟下的作用。

優點:

一定程度上實現了代碼分離,降低代碼的耦合性。


缺點:

1.Controller和View層難以完全解耦,而且隨著業務邏輯增多

2.Controller會變的越來越臃腫。在Android中Activity充當Controller的角色,后面Activity會變成GadActivity。

3. M層和V層還有交互,沒有做到完全分離。

二、 MVP(Model-View-Presenter)

模型-視圖-提供者
MVP是在MVC的基礎上發展過來的,實現了M層和V層的完全分離,進一步代碼解耦。

Model:數據來源,網絡請求數據和數據庫數據。
View:對應xml布局文件和動態的布局部分。對應Activity。
Presenter:邏輯控制部分。通過接口連接M層和V層。

優點:

1.V層對應Activity,只負責UI的展示和P層直接通信,和M層沒有任何交互。
2.V層沒有和M層有交互,可以抽成單獨的組件,方便復用。
3.代碼結構清晰,P層可以用于多個視圖,而不需要改變P層的邏輯。
4.V層和M層完全分離,方便協同工作,只需要專注做視圖或者邏輯控制部分,不用關系對方的邏輯。比如負責邏輯控制部分不用等設計出圖,就可以直接寫代碼,并進行單元測試。
5.代碼復用率高,方便單元測試。


缺點:

1.M層和V層都需要和P層進行通許,會導致P層代碼很復雜,而且都是通過接口通訊,如果一個P層用于多個Activity,所有Activity都要實現全部都接口,無論能不能用得到。修改P層接口,往往會涉及到很多個界面,很麻煩。
2.P層和V層通過接口通訊,會持有View的引用,容易造成內存泄露。
3.隨著業務增多,P層即使只對應一個視圖,接口也會越來越多。

三. MVVM(Model-View-ViewModel)

模型-視圖-視圖模型
MVVM在MVP的基礎上進一步解耦,VM層不在持有View的引用。
引入響應式編程、Lifecycle生命周期感知、LiveData數據存儲、DataBinding數據綁定概念。配合Goole提供的Jetpack組件能節省很多代碼。

Model:數據來源,網絡請求數據和數據庫數據。
View:對應xml布局文件和動態的布局部分。對應Activity。向比較MVP這里的View是通過DataBinding來進行雙向綁定數據。
ViewModel:邏輯控制部分。作為橋梁,通知M層處理數據,并將結果回調到V層處理UI。Activity持有ViewModel引用,ViewModel不持有View的引用。

優點:

1.進一步解耦,ViewModel不持有View的引用,當V層改遍,只要V層綁定的數據不變,ViewModel就不需要修改。
2.不需要寫很多樣板代碼,省略findViewById(),Activity變得很簡介。
3.通過DataBinding實現View和Model的實時改變,一方改變就會同步到對方。


缺點:

1.DataBinding雙向綁定采用異步更新數據,對ListView這樣的列表,效率比較低。而且在實際開發中,設計出的Ui效果比較復雜,數據綁定不能完全實現,往往只使用到DataBinding一半的功能,數據更新部分還是手動實現。
2.DataBinding會自動生成大量的代碼和屬性字段。
3.復雜的頁面要定義多個LiveData,并且都要暴露為不可變的LiveData。
4.LiveData是粘性事件,數據倒灌等問題。解決方法:使用第三方 UnPeekLiveData

四. MVI(Model-View-Intent)

模型-視圖-意圖
出現的目的是為了解決MVVM中雙向綁定數據的不足。把雙向綁定變成單向數據流。使用Flow代替LiveData存儲數據。

Model:這里的Model不是其他框架中的Model層,在MVI框架中表示存儲UI的狀態。
View:在MVI中View層主要是接口,負責相應UI的狀態。
Intent:在MVI中Intent(和Android中的Intent不是同一個)主要負責傳遞UI狀態。使用sealed關鍵字,形成一個封閉類,類似枚舉。主要用于V層通知ViewModel處理數據。
State:和Intent一樣是一個封閉類,主要用于ViewModel回調數據修改UI。

優點:

1.UI的所有變化來自State,所以只需聚焦State,架構更簡單、易于調試
2.數據單向流動,很容易對狀態變化進行跟蹤和回溯
3.State實例都是不可變的,確保線程安全
4.UI只是反應State的變化,沒有額外邏輯,可以被輕松替換或復用

缺點:

1.所有的操作最終都會轉換成State,所以當復雜頁面的State容易膨脹
2.State是不變的,每當State需要更新時都要創建新對象替代老對象,這會帶來一定內存開銷

五、總結

mvc:activity即是v也是c,代碼臃腫
mvp:接口太多,p層容易內存泄漏
mvvm:databinding生成的代碼態度,livedata數據倒灌/粘性
mvi:復雜頁面,state膨脹

非常小的項目用MVC


六.MVI簡單實現

1.MVI

mvi的改動在于將View和ViewModel之間的多數據流改為基于ViewState的單數據流。

MVI分為四個部分:

  • View: Activity 和xml文件,與其他模式中的View的概念相同。
  • Intent: 定義數據操作,將數據傳到Model的唯一來源。
  • ViewModel: 存儲視圖狀態,負責處理表現邏輯,并將ViewState設置給可觀察數據容器
  • ViewState: 一個數據類,包含頁面狀態和對應的數據。

2.MVI特點

唯一可信源:數據只有一個來源(ViewModel),與MVVM思想相同
單向數據流:狀態向下流動,事件向上流動。
響應式:ViewState包含頁面當前狀態和數據,View通過訂閱
ViewState就可以完成頁面刷新。相比于 MVVM 是新的特性。

3.單向數據流

界面變化是數據流的末端,界面消費上游產生的數據,并隨上游數據的變化進行刷新。

狀態向下流動,事件向上流動的這種模式稱為單向數據流

MVI強調數據的單向流動,主要分為幾步:

  1. 用戶操作以Intent的形式通知Model.
  2. Model基于Intent更新State
  3. View接收到State變化刷新UI

數據永遠在一個環形結構中單向流動,不能反向流動。

4.缺點:

  • State 膨脹: 所有視圖變化都轉換為 ViewState,還需要管理不同狀態下對應的數據。實踐中應該根據狀態之間的關聯程度來決定使用單流還是多流;
  • 內存開銷: ViewState 是不可變類,狀態變更時需要創建新的對象,存在一定內存開銷;
  • 局部刷新: View 根據 ViewState 響應,不易實現局部 Diff 刷新,可以使用 Flow#distinctUntilChanged() 來刷新來減少不必要的刷新。

?

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

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

相關文章

索引使用規則6——單列索引聯合索引

1、單列索引 單列索引:即一個索引只包含單個列 舉個例子 1.1、給phone和那么建立索引 create index index_name on tb_qianzhui(name); create index index_phone on tb_qianzhui(phone);1.2、查詢發現可能的索引有好幾個,但是最終選擇了phone的索引…

軟考 系統分析師系列知識點之詳細調查(2)

接前一篇文章:軟考 系統分析師系列知識點之詳細調查(1) 所屬章節: 第10章. 系統分析 第2節. 詳細調查 在系統規劃階段,通過初步調查,系統分析師已經對企業的組織結構、系統功能等有了大致的了解。但是&…

蘿卜大雜燴 | 提高數據科學工作效率的 8 個 Python 庫

本文來源公眾號“蘿卜大雜燴”,僅用于學術分享,侵權刪,干貨滿滿。 原文鏈接:提高數據科學工作效率的 8 個 Python 庫 在進行數據科學時,可能會浪費大量時間編碼并等待計算機運行某些東西。所以我選擇了一些 Python 庫…

Vue3中的Hooks詳解

vue3帶來了Composition API,其中Hooks是其重要組成部分。之前我寫過一篇關于vue3 hooks的文章比較簡單 Vue3從入門到刪庫 第十一章(自定義hooks) 所以本文將深入探討Vue3中Hooks,幫助你在Vue3開發中更加得心應手。 一、Vue3 Hoo…

貪吃蛇(C語言)步驟講解

一:文章大概 使用C語言在windows環境的控制臺中模擬實現經典小游戲 實現基本功能: 1.貪吃蛇地圖繪制 2.蛇吃食物的功能(上,下,左,右方向控制蛇的動作) 3.蛇撞墻死亡 4.計算得分 5.蛇身加…

[C語言]——C語言常見概念(1)

目錄 一.C語言是什么、 二.C語言的歷史和輝煌 三.編譯器的選擇(VS2022為例) 1.編譯和鏈接 2.編譯器的對比 3.VS2022 的優缺點 四.VS項目和源文件、頭文件介紹 五.第?個C語言程序 ??????? 一.C語言是什么、 ?和?交流使?的是?然語?&…

【python】爬取鏈家二手房數據做數據分析【附源碼】

一、前言、 在數據分析和挖掘領域中,網絡爬蟲是一種常見的工具,用于從網頁上收集數據。本文將介紹如何使用 Python 編寫簡單的網絡爬蟲程序,從鏈家網上海二手房頁面獲取房屋信息,并將數據保存到 Excel 文件中。 二、效果圖&#…

【JS】解構賦值注意點,解構賦值報錯

報錯代碼 const 小明 { email: 6, pwd: 66 } const 小剛 { email: 9, pwd: 99 }const { email } 小明 const { email } 小剛 報錯圖 原因 2個常量重復,重復在同一個作用域內是不能重復的,例如大括號內{const a 1; const a 2} 小伙伴A提問 問&…

Redis-基礎篇

Redis是一個開源、高性能、內存鍵值存儲數據庫,由 Salvatore Sanfilippo(網名antirez)創建,并在BSD許可下發布。它不僅可以用作緩存系統來加速數據訪問,還可以作為持久化的主數據存儲系統或消息中間件使用。Redis因其數…

leetcode:37.解數獨

題目理解:本題中棋盤的每一個位置都要放一個數字(而N皇后是一行只放一個皇后),并檢查數字是否合法,解數獨的樹形結構要比N皇后更寬更深。 代碼實現:

SpringBoot+Redis 解決海量重復提交問題,yyds!

在實際的開發項目中,一個對外暴露的接口往往會面臨很多次請求,我們來解釋一下冪等的概念:任意多次執行所產生的影響均與一次執行的影響相同。按照這個含義,最終的含義就是 對數據庫的影響只能是一次性的,不能重復處理。如何保證其…

?動類型轉換、強制類型轉換

為何short s1 1;是對的,而float f3.4;是錯的? 整數直接量,默認是int型。所以int a 4L; 會報錯,但是long l 4; 這樣不會,因為這樣會形成一個自動類型的轉換,int類型自動轉換為long類型 小數直接量&#…

JetBrains Gateway Github Copilot 客戶端插件和主機插件

JetBrains Gateway可以通過插件支持Github Copilot(需另行注冊)。 需要安裝插件 客戶端,而非插件 主機,如圖所示: 大概是因為代碼顯示在客戶端(運行在本地的IDE)?

NOC2023軟件創意編程(學而思賽道)python初中組復賽真題

目錄 下載打印原文檔做題: 軟件創意編程 一、參賽范圍 1.參賽組別:小學低年級組(1-3 年級)、小學高年級組(4-6 年級)、初中組。 2.參賽人數:1 人。 3.指導教師:1 人(可空缺)。 4.每人限參加 1 個賽項。 組別確定:以地方教育行政主管部門(教委、教育廳、教育局) 認…

Python 潮流周刊#40:白宮建議使用 Python 等內存安全的語言

△△請給“Python貓”加星標 ,以免錯過文章推送 你好,我是貓哥。這里每周分享優質的 Python、AI 及通用技術內容,大部分為英文。本周刊開源,歡迎投稿[1]。另有電報頻道[2]作為副刊,補充發布更加豐富的資訊,…

三層靶機靶場之環境搭建

下載: 鏈接:百度網盤 請輸入提取碼 提取碼:f4as 簡介 2019某CTF線下賽真題內網結合WEB攻防題庫,涉 及WEB攻擊,內網代理路由等技術,每臺服務器存在一個 Flag,獲取每一 個Flag對應一個積分&…

在docker中搭建selenium 爬蟲環境(3分鐘快速搭建)

1、安裝docker 省略 2、拉取鏡像 docker pull selenium/standalone-chrome-debug 3、運行容器 docker run -d -p 4444:4444 -p 5900:5900 -v C:\Users\Public\VNC_Donwnloads:/home/seluser/Downloads --memory6g --name selenium_chrome selenium/standalone-chrome-debu…

Vue中commit和dispatch區別及其用法辨析

在Vue中,commit和dispatch是兩個用于觸發 Vuex store 中的 mutations 和 actions 的方法。 區別 commit: 用于觸發 mutations,即直接修改 state 的同步操作。通過commit方法可以調用 store 中的 mutations,并且只能同步地執行。使用方式如下…

大數據核心技術概論

大數據核心技術概述 大數據基石三大論文:GFS(Hadoop HDFS)、BigTable(Apache HBase)、MapReduce(Hadoop MapReduce)。 搜索引擎的核心任務:一是數據采集,也就是網頁的爬…

matlab 感知器算法

1. 原理 兩類線性可分的模式類:,設判別函數為:。 對樣本進行規范化處理,即類樣本全部乘以(-1),則有: 感知器算法通過對已知類別的訓練樣本集的學習,尋找一個滿足上式的權向量。 2. 過程 2.1 …