MVC和MVP在app中的對比分析以及實際應用

2021-07-26 16:57:15 字數 1651 閱讀 7136

這篇文章算是講解mvp文章中思路比較清晰的一篇(可以在本站搜尋mvp檢視其他文章),同時非常推薦文章作者的其他文章。

那什麼是mvp呢?它又和我們常常聽到的mvc有什麼關係了以及區別呢?

mvp 是從經典的模式mvc演變而來,它們的基本思想有相通的地方:controller/presenter負責邏輯的處理,model提供資料,view負 責顯示。作為一種新的模式,mvp與mvc有著乙個重大的區別:在mvp中view並不直接使用model,它們之間的通訊是通過presenter (mvc中的controller)來進行的,所有的互動都發生在presenter內部,而在mvc中view會從直接model中讀取資料而不是通過 controller。

在mvc裡,view是可以直接訪問model的!從而,view裡會包含model資訊,不可避免的還要包括一些業務邏輯。 在mvc模型裡,更關注的model的不變,而同時有多個對model的不同顯示,及view。所以,在mvc模型裡,model不依賴於view,但是 view是依賴於model的。不僅如此,因為有一些業務邏輯在view裡實現了,導致要更改view也是比較困難的,至少那些業務邏輯是無法重用的。

在mvp裡,presenter完全把model和view進行了分離,主要的程式邏輯在presenter裡實現。而且,presenter與具 體的view是沒有直接關聯的,而是通過定義好的介面進行互動,從而使得在變更view時候可以保持presenter的不變,即重用! 不僅如此,我們還可以編寫測試用的view,模擬使用者的各種操作,從而實現對presenter的測試—而不需要使用自動化的測試工具。 我們甚至可以在model和view都沒有完成時候,就可以通過編寫mock object(即實現了model和view的介面,但沒有具體的內容的)來測試presenter的邏輯。 在mvp裡,應用程式的邏輯主要在presenter來實現,其中的view是很薄的一層。因此就有人提出了presenter first的設計模式,就是根據user story來首先設計和開發presenter。在這個過程中,view是很簡單的,能夠把資訊顯示清楚就可以了。在後面,根據需要再隨便更改view, 而對presenter沒有任何的影響了。 如果要實現的ui比較複雜,而且相關的顯示邏輯還跟model有關係,就可以在view和presenter之間放置乙個adapter。由這個 adapter來訪問model和view,避免兩者之間的關聯。而同時,因為adapter實現了view的介面,從而可以保證與presenter之 間介面的不變。這樣就可以保證view和presenter之間介面的簡潔,又不失去ui的靈活性。 在mvp模式裡,view只應該有簡單的set/get的方法,使用者輸入和設定介面顯示的內容,除此就不應該有更多的內容,絕不容許直接訪問model— 這就是與mvc很大的不同之處。

mvp的優點:

1、模型與檢視完全分離,我們可以修改檢視而不影響模型;

2、可以更高效地使用模型,因為所有的互動都發生在乙個地方——presenter內部;

3、我們可以將乙個presenter用於多個檢視,而不需要改變presenter的邏輯。這個特性非常的有用,因為檢視的變化總是比模型的變化頻繁;

4、如果我們把邏輯放在presenter中,那麼我們就可以脫離使用者介面來測試這些邏輯(單元測試)。

MVP和MVC的區別

1 mvc model controller view 把業務剝離到controller中,讓view專注於現實ui。但是view和model並沒有解耦合,controller和view有可能由同乙個物件承擔,比如android的activity.2.mvp model view presenter...

MVC和MVP的區別

mvc的概念 mvc是model view controller的縮寫,分別代表web應用程式中的3種職責。模型 用於儲存資料以及處理使用者請求的業務邏輯。檢視 想控制器提交資料,顯示模型中的資料。控制器 根據檢視提出的請求,判斷將請求和資料交給哪個模型處理,處理後的有關結果交給哪個檢視顯示更新顯示...

MVC和MVP的初步理解

mvc model view controller 模式,即模型 檢視 控制器模式,其核心思想是將整個程式 分成相對獨立而又能協同工作的3個組成部分,具體的功能如下 模型 model 業務邏輯層。實現具體的業務邏輯 狀態管理的功能。檢視 view 表現層。就是與使用者實現互動的頁面,通常實現資料的輸...