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的模型,為了實現顯示和數據的分離,我們在視圖和模型之間加入一個控製層,視圖隻能通過控製器來操作模型,也就是數據層,一旦數據有更新,模型就會通知視圖更新自己。在桌麵程序中,用戶可以直接和視圖進行交互,通過對事件的操作,可以觸發視圖的各種事件,通過控製器,以達到更新模型或數據的目的。
由於Web應用的複雜程度的日益增加,功能也日益龐大,表示層與數據層的分離也顯得日益重要。於是MVC這種架構模式被移植到WEB開發中來也是很自然的事情,然而,Web程序和Desktop程序是有很大區別的,大家都知道,HTTP協議是無連接的,當用戶從服務器拿到一個頁麵之後,整個交互過程也就完成了,用戶無法知道服務器端狀態的更新,除非用戶再次發送請求。而且,在Web程序中,是沒有事件模型支持的,用戶的每個動作都必須轉化為對服務器請求。以往的經驗,我們經常把視圖和控製器組合起來,一個頁麵既包含程序的業務邏輯,又包含頁麵的顯示信息。然而,視圖是經常變化的,業務邏輯確實相對比較穩定的。為了解決這個問題,比較流行的做法是讓控製器執行業務邏輯,從數據層(模型)中抓取顯示相關的數據,而視圖僅僅是一段顯示代碼,沒有業務邏輯。由於請求多種多樣,而且在控製器到視圖的數據轉發部分含有很多相同的邏輯,而且為了方便擴展和管理,於是就有人提出了前端控製器的概念,也就是請求分發器。分發器的作用主要工作就是將一個request分發到一個合適的處理器上,並將處理返回的包含特定信息的視圖返回給客戶端。下圖展現了現在常用的Web MVC 的標準模型。
然而,這不是唯一的模型,在ASP.net中,有一種叫做頁麵控製器的模型。在這種MVC中,並不是令分發器去尋找一個控製器並執行之,而是直接到達視圖並且在繼續生成視圖之前調用相應的控製器。與傳統的MVC模式中的前端控製器對應,這種模式稱為頁麵控製器。頁麵控製器和前端控製器實現實現之間的區別在於頁麵控製器描述的往往是同一個頁麵中(如類似於控製麵板那樣的頁麵)的處理邏輯,不能用於跨多個頁麵對處理過程進行控製或協調。它是一種Poll的模型。
對應的,前端控製器是很典型的一種Push的模型,對同一個請求的幾個不同的動作,根據業務邏輯處理後的結果分別被壓入到response的各個不同部分。
在下文中,我們僅討論前端控製器這種方式的具體實現。
相關文章:
- MVC架構探究及其源碼實現(2)-核心組件定義
- MVC架構探究及其源碼實現(3)-WebApplicationContext
- MVC架構探究及其源碼實現(4)-前端控製器
- MVC架構探究及其源碼實現(5)-相關組件實現
- MVC架構探究及其源碼實現(6)-簡單示例
最後更新:2017-04-02 04:00:25