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

  • 2022 年 10 月 26 日
  • 筆記

一、引子

一個系統可能由很多子系統組成。各子系統內部高度內聚,子系統之間低耦合。子系統關注自己的職責。實現:   職責分離,關注點分離。—-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做數據接收和展示。

 

 

 

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

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

Exit mobile version