天天看點

MVC架構探究及其源碼實作(1)-理論基礎

博學,切問,近思--詹子知 (https://jameszhan.github.io)

  mvc本來是存在于desktop程式中的,m是指資料模型,v是指使用者界面,c則是控制器。使用mvc的目的是将m和v的實作代碼分離,進而使同一個程式可以使用不同的表現形式。比如一批統計資料你可以分别用柱狀圖、餅圖來表示。c存在的目的則是確定m和v的同步,一旦m改變,v應該同步更新。

  模型-視圖-控制器(mvc)是xerox parc在八十年代為程式設計語言smalltalk-80發明的一種軟體設計模式,至今已經被廣泛使用。

  我們先來看下經典桌面mvc的模型,為了實作顯示和資料的分離,我們在視圖和模型之間加入一個控制層,視圖隻能通過控制器來操作模型,也就是資料層,一旦資料有更新,模型就會通知視圖更新自己。在桌面程式中,使用者可以直接和視圖進行互動,通過對事件的操作,可以觸發視圖的各種事件,通過控制器,以達到更新模型或資料的目的。

MVC架構探究及其源碼實作(1)-理論基礎

  由于web應用的複雜程度的日益增加,功能也日益龐大,表示層與資料層的分離也顯得日益重要。于是mvc這種架構模式被移植到web開發中來也是很自然的事情,然而,web程式和desktop程式是有很大差別的,大家都知道,http協定是無連接配接的,當使用者從伺服器拿到一個頁面之後,整個互動過程也就完成了,使用者無法知道伺服器端狀态的更新,除非使用者再次發送請求。而且,在web程式中,是沒有事件模型支援的,使用者的每個動作都必須轉化為對伺服器請求。以往的經驗,我們經常把視圖和控制器組合起來,一個頁面既包含程式的業務邏輯,又包含頁面的顯示資訊。然而,視圖是經常變化的,業務邏輯确實相對比較穩定的。為了解決這個問題,比較流行的做法是讓控制器執行業務邏輯,從資料層(模型)中抓取顯示相關的資料,而視圖僅僅是一段顯示代碼,沒有業務邏輯。由于請求多種多樣,而且在控制器到視圖的資料轉發部分含有很多相同的邏輯,而且為了友善擴充和管理,于是就有人提出了前端控制器的概念,也就是請求分發器。分發器的作用主要工作就是将一個request分發到一個合适的處理器上,并将處理傳回的包含特定資訊的視圖傳回給用戶端。下圖展現了現在常用的web

mvc 的标準模型。

MVC架構探究及其源碼實作(1)-理論基礎

然而,這不是唯一的模型,在asp.net中,有一種叫做頁面控制器的模型。在這種mvc中,并不是令分發器去尋找一個控制器并執行之,而是直接到達視圖并且在繼續生成視圖之前調用相應的控制器。與傳統的mvc模式中的前端控制器對應,這種模式稱為頁面控制器。頁面控制器和前端控制器實作實作之間的差別在于頁面控制器描述的往往是同一個頁面中(如類似于控制台那樣的頁面)的處理邏輯,不能用于跨多個頁面對處理過程進行控制或協調。它是一種poll的模型。

MVC架構探究及其源碼實作(1)-理論基礎

對應的,前端控制器是很典型的一種push的模型,對同一個請求的幾個不同的動作,根據業務邏輯處理後的結果分别被壓入到response的各個不同部分。

MVC架構探究及其源碼實作(1)-理論基礎

在下文中,我們僅讨論前端控制器這種方式的具體實作。

相關文章:

mvc架構探究及其源碼實作(2)-核心元件定義

mvc架構探究及其源碼實作(3)-webapplicationcontext

mvc架構探究及其源碼實作(4)-前端控制器

mvc架構探究及其源碼實作(5)-相關元件實作

mvc架構探究及其源碼實作(6)-簡單示例

繼續閱讀