天天看點

Android - MVC、MVP與MVVM架構

轉載請注明出處:https://blog.csdn.net/mythmayor/article/details/107061609

一、MVC

1.MVC(Model-View-Controller)介紹。

MVC即為模型-視圖-控制器,是一種軟體設計模式,通常用于開發使用者界面,該界面将相關的程式邏輯分為三個互相連接配接的元素。這樣做是為了将資訊的内部表示形式與資訊呈現給使用者和從使用者接受的方式分開。這種模式用于設計頁面的布局。

傳統上,此模式用于桌面圖形使用者界面(GUI),在設計Web應用程式時已變得很流行。流行的程式設計語言(如JavaScript,Python,Ruby,PHP,Java,C#和Swift)具有MVC架構,可直接用于Web或移動應用程式開發。

模型(Model)

MVC模式的中心組成部分。它是應用程式的動态資料結構,獨立于使用者界面。它直接管理應用程式的資料,邏輯和規則。

視圖(View)

資訊的任何表示形式,例如圖表,圖表或表格。可以使用同一資訊的多種視圖,例如用于管理的條形圖和用于會計的表格視圖。

控制器(Controller)

接受輸入并将其轉換為模型或視圖的指令。

除了将應用程式劃分為這些元件之外,模型-視圖-控制器設計還定義了它們之間的互動。

  • 模型負責管理應用程式的資料。它從控制器接收使用者輸入。
  • 視圖意味着以特定格式呈現模型。
  • 控制器響應使用者輸入并在資料模型對象上執行互動。控制器接收輸入,可選地對其進行驗證,然後将輸入傳遞給模型。

與其他軟體模式一樣,MVC表示問題的“解決方案核心”,同時允許其适用于每個系統。特定的MVC設計可能與此處的傳統描述大不相同。

服務

在控制器和模型之間有時會有一個稱為服務的層。它從模型中擷取資料,并讓控制器使用擷取的資料。該層允許分離資料存儲(模型),資料擷取(服務)和資料操作(控制器)。由于此層不是原始MVC概念的一部分,是以在大多數情況下是可選的,但在某些情況下可用于代碼管理和可重用性。

二、MVP

1.MVP(Model-View-Presenter)介紹。

MVP即為模型-視圖-示範者,是MVC架構模式的派生産品,主要用于建構使用者界面。在MVP中,Presenter承擔“中間人”的功能,所有示範邏輯都被推送到Presenter。

MVP是一種使用者界面架構模式,旨在促進自動化的單元測試并改善表示邏輯中關注點的分離。

模型(Model)

模型定義要在使用者界面中顯示或作用的資料的界面。

視圖(View)

視圖是一個被動的界面,用于顯示資料(模型)并将使用者指令(事件)路由到示範者以對該資料進行操作。

示範者(Presenter)

示範者會根據模型和視圖進行操作。 它從存儲庫(模型)檢索資料,并将其格式化以顯示在視圖中。

通常,視圖實作執行個體化具體的Presenter對象,并為其提供引用。

2.項目Github位址。

https://github.com/mythmayor/MvpArchitecture

三、MVVM

1.MVVM(Model-View-ViewModel)介紹。

MVVM即為模型-視圖-視圖模型,是一種軟體架構模式,可促進将圖形使用者界面(視圖)的開發(通過标記語言或GUI代碼)與業務邏輯或背景開發的分離。邏輯(模型),以便視圖不依賴于任何特定的模型平台。 MVVM的視圖模型是一個值轉換器,表示視圖模型負責以易于管理和呈現對象的方式公開(轉換)來自模型的資料對象。在這方面,視圖模型比視圖更具模型性,可以處理大多數(不是全部)視圖顯示邏輯。視圖模型可以實作中介者模式,圍繞視圖支援的一組用例來組織對後端邏輯的通路。

Model-View-ViewModel也稱為Model-View-Binder,尤其是在不涉及.NET平台的實作中。

模型(Model)

模型是指表示真實狀态内容的域模型(面向對象的方法),也是表示内容的資料通路層(以資料為中心的方法)。

視圖(View)

就像在MVC模式和MVP模式中一樣,視圖是使用者在螢幕上看到的内容的結構,布局和外觀。它顯示模型的表示并接收使用者與視圖的互動(單擊,鍵盤,手勢等),并通過資料綁定(屬性,事件回調等)将這些操作的處理轉發給視圖模型。定義為連結視圖和視圖模型。

視圖模型(ViewModel)

視圖模型是視圖的抽象,公開了公共屬性和指令。 MVVM具有綁定程式,可以自動執行視圖及其視圖模型中的綁定屬性之間的通信,而不是MVC模式的控制器或MVP模式的示範者。視圖模型已被描述為模型中資料的狀态。

在MVP模式中,視圖模型與Presenter之間的主要差別在于,Presenter具有對視圖的引用,而視圖模型則沒有。相反,視圖直接綁定到視圖模型上的屬性以發送和接收更新。為了有效運作,這需要綁定技術或生成樣闆代碼來進行綁定。

綁定器(Binder)

聲明性資料和指令綁定在MVVM模式中是隐式的。綁定器使開發人員不必編寫模闆邏輯來同步視圖模型和視圖。

MVVM基本原理

MVVM旨在利用WPF(Windows Presentation Foundation)中的資料綁定功能,通過從視圖層中删除幾乎所有GUI代碼(“後置代碼”)來更好地促進視圖層開發與其餘模式的分離。

MVVM模式試圖通過将資料綁定到盡可能接近純應用程式模型的方式來利用MVC提供的功能開發分離的優勢,同時利用資料綁定和架構的優勢。它需要使用Binder,視圖模型和任何業務層的資料檢查功能來驗證傳入的資料。結果是模型和架構驅動了盡可能多的操作,進而消除或最小化了直接操縱視圖的應用程式邏輯(例如,背景代碼)。

MVVM的劣勢

使用MVVM的開銷對于簡單的UI操作來說是過于龐大的。另外非常大的應用程式中進行資料綁定會導緻相當大的記憶體消耗。

2.項目Github位址。

https://github.com/mythmayor/MvvmArchitecture

四、MVC、MVP、MVVM的優缺點比較。

1.MVC的優缺點。

優點:

  • 把業務邏輯全部分離到Controller中,子產品化程度高。當業務邏輯變更的時候,不需要變更View和Model,隻需要Controller換成另外一個Controller就行了(Swappable Controller)。
  • 觀察者模式可以做到多視圖同時更新。

缺點:

  • Controller測試困難。因為視圖同步操作是由View自己執行,而View隻能在有UI的環境下運作。在沒有UI環境下對Controller進行單元測試的時候,Controller業務邏輯的正确性是無法驗證的:Controller更新Model的時候,無法對View的更新操作進行斷言。
  • View無法元件化。View是強依賴特定的Model的,如果需要把這個View抽出來作為一個另外一個應用程式可複用的元件就困難了。因為不同程式的的Domain Model是不一樣的。

2.MVP的優缺點。

優點:

  • 便于測試。Presenter對View是通過接口進行,在對Presenter進行不依賴UI環境的單元測試的時候。可以通過Mock一個View對象,這個對象隻需要實作了View的接口即可。然後依賴注入到Presenter中,單元測試的時候就可以完整的測試Presenter業務邏輯的正确性。
  • View可以進行元件化。在MVP當中,View不依賴Model。這樣就可以讓View從特定的業務場景中脫離出來,可以說View可以做到對業務邏輯完全無知。它隻需要提供一系列接口提供給上層操作。這樣就可以做高度可複用的View元件。

缺點:

  • Presenter中除了業務邏輯以外,還有大量的View->Model,Model->View的手動同步邏輯,造成Presenter比較笨重,維護起來會比較困難。

3.MVVM的優缺點。

優點:

  • 提高可維護性。解決了MVP大量的手動View和Model同步的問題,提供雙向綁定機制。提高了代碼的可維護性。
  • 簡化測試。因為同步邏輯是交由Binder做的,View跟着Model同時變更,是以隻需要保證Model的正确性,View就正确。大大減少了對View同步更新的測試。

缺點:

  • 過于簡單的圖形界面不适用,或說牛刀殺雞。
  • 對于大型的圖形應用程式,視圖狀态較多,ViewModel的建構和維護的成本都會比較高。
  • 資料綁定的聲明是指令式地寫在View的模版當中的,這些内容是沒辦法去打斷點debug的。