軟體架構(六)MVC架構歷史

2022-10-26 18:02:47

一、引子

一個系統可能由很多子系統組成。各子系統內部高度內聚,子系統之間低耦合。子系統關注自己的職責。實現:   職責分離,關注點分離。----MVC架構早期就是為了分離檢視、模型而誕生的。

注:很多地方說MVC是一種設計模式,博主認為,精確來說MVC是一種架構模式(軟體架構(三)名詞解釋:架構、設計、風格、模式),一種通用設計方案,發展至今,已不侷限於前端或後端。例如springMVC就是其中一種落地實踐。

二、MVC的發展史

MVC有很多變種,這裡列出對現在行業影響最大的幾種,逐一說明。老司機可以直接跳到第三節。

2.1 MVC(Model-View-Controller)

Trygve Reenskaug 於1979 年提出了 MVC 模式,來分離關注點,將 UI 和業務邏輯隔離。

MVC 模式將程式碼拆分成了三個概念單元:

  • Model (模型):代表業務邏輯 ;
  • View (檢視):代表 UI 控制元件,按鈕、文字方塊等等;
  • Controller(控制器):在檢視和模型之間居中協調 ,這意味著:
    • 它決定顯示哪些檢視以及哪些資料;
    • 它將使用者操作(例如點選按鈕)轉換成業務邏輯。

最初的 MVC 模式還有其它一些需要了解的的重要概念:

  1. View 直接使用 Model 資料物件來展示資料;
  2. 當 Model 發生變化時,會觸發一個事件立即更新 View(記住,1979年還沒有 HTTP);
  3. 每一個 View 通常只關聯一個 Controller;
  4. 每個介面可以包含多對 View 和 Controller;
  5. 每個Controller 可以對應多個 View。

2.2 MVP(Model-View-Presenter)

1996 年,IBM 的子公司 Taligent 公開了他們基於 MVC 的 模式 MVP。其思想是將 Model 對 UI 的關注更徹底地分離

  • View 是被動的,對 Model 無感知
  • 專注於輕量 Controller(Presenter),它們不包含任何業務邏輯,只是簡單地呼叫命令/查詢模型,將原始資料傳遞給 View;
  • 資料的變化不會直接觸發 View 的更新:它始終要通過 Presenter,由 Presenter 來更新 View。這樣在更新檢視之前 Controller(Presenter) 還可以執行一些和展現相關的額外邏輯。例如,同時更新另一些資料,它們和資料庫中發生變化的資料有關;
  • 每個 View 對應一個 Presenter。

這更接近我所見到的現在的請求/響應正規化:資料流始終要經過 Controller/Presenter。不過,Presenter 仍然不會主動更新檢視,它始終需要執行一次新的請求才能讓變化可見。

MVP 中的 Presenter 又被稱為 Supervisor Controller監督控制器。

2.3 MVVM(Model-View-ViewModel)

 

由於應用程式的複雜性還在增加,2005 年微軟的 WPF 和 Silverlight 架構師 John Gossman 又提出了 MVVM 模式,目標是進一步將 UI 設計從程式碼中分離出來,並提供 View 到資料模型的資料繫結機制。
MVVM 背後的思想是:
  • ViewModel 和 View 一 一對應;
  • 將 View 中的邏輯轉移到 ViewModel 來簡化 View
  • View 使用的資料和 ViewModel 中的資料一 一對應;
  • 將 ViewModel 中的資料繫結到 View 中的資料上,這樣 ViewModel 中資料的變化會立即體現在 View 上。

2.4 MVPVM(Model-View-Presenter-ViewModel)

MVPVM中, View Model 是 Martin Fowler 在 2004 年提出的 Presentation Model,。

  • Model

    一組包含業務邏輯和用例的類。

  • View

    一個模板,模板引擎用它來生成 HTML;

  • ViewModel(又叫做 Presentation Model)

    從查詢中接收(或者從 Model 實體中提取)原始資料,持有這些模板會用到的資料。它還要封裝複雜的展現邏輯,來簡化Model。這樣我們才能將 View 和 Model 完全隔離開:

    • Model 中的變化(比如實體結構的變化)會上升並影響 ViewModel,但不會影響Model;
    • 複雜的展現邏輯被封裝到了 ViewModel 之中,因此不會被洩露到領域(DDD領域設計的domain)之中;
    • Model的依賴變得很清晰,因為它們必須在 ViewModel 中設定。
  • Presenter

    接收 HTTP 請求,觸發命令或查詢,使用查詢返回的資料、ViewModel、模板和模板引擎生成 HTML 並將它返回給使用者端。所有 View 的互動都要經過 Presenter。

三、總結

我們對比MVC、MVP、MVVM、MVPVM的變種升級過程,可以更好的瞭解架構的歷史變遷。

快速區分幾種架構:

  1. MVC:初步分離Model、View。
  2. MVP:Controller轉變為Presenter模型和檢視徹底分離。  
  3. MVVM:廢棄控制器層。增加ViewModel,實現Model和View的雙向驅動。
  4. MVPVM:保留Presenter做頁面互動,新增ViewModel給View做資料接收和展示。

 

 

 


 =========參考============

https://herbertograca.com/2017/08/17/mvc-and-its-variants/