超詳細的!!!MVC架構模式說明

超詳細的!!!MVC架構模式說明

一、簡介:

  架構模式是一個通用的、可重用的解決方案,用於在給定上下文中的軟體體系結構中經常出現的問題。架構模式與軟體設計模式類似,但具有更廣泛的範圍。

模型-檢視-控制器模式,也稱為MVC模式(Model View Controller)。用一種業務邏輯、資料、介面顯示分離的方法組織程式碼,將業務邏輯聚集到一個部件裡面,在改進和個性化定製介面及使用者互動的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用於對映傳統的輸入、處理和輸出功能在一個邏輯的圖形化使用者介面的結構中。它把軟體系統分為三個基本部分:

模型(Model):負責儲存系統的中心資料。

檢視(View):將資訊顯示給使用者(可以定義多個檢視)。

控制器(Controller):處理使用者輸入的資訊。負責從檢視讀取資料,控制使用者輸入,並向模型傳送資料,是應用程式中處理使用者互動的部分。負責管理與使用者互動互動控制。

檢視和控制器共同構成了使用者介面。

且每個檢視都有一個相關的控制器元件。控制器接受輸入,通常作為將滑鼠移動、滑鼠按鈕的活動或鍵盤輸入編碼的時間。時間被翻譯成模型或試圖的伺服器請求。使用者僅僅透過控制器與系統互動。

超詳細的!!!MVC架構模式說明

超詳細的!!!MVC架構模式說明

二、結構

模型元件包含應用程式的功能核心,他封裝了相應的資料並輸出執行特定應用程式處理的過程;模型也提供訪問資料的函式,這些資料有獲得待顯示的資料的檢視元件使用。

控制器代表使用者呼叫所有這些過程。

三、目的

實現一種動態的程式設計,是後序對程式的修改和擴充套件簡化,並且使程式某一部分的重複利用稱為可能。

透過對複雜度的簡化,使程式結構更加直觀。

將資訊的內部表示與資訊的呈現方式分離開來,並接受使用者的請求。它分離了元件,並允許有效的程式碼重用。即,將模型和檢視的實現程式碼分離,從而使同一個程式可以使用不同的表現形式。比如一批統計資料你可以分別用柱狀圖、餅圖來表示。C存在的目的則是確保模型和檢視的同步,一旦模型改變,檢視應該同步更新。

四、特點

MVC重要特點就是兩種分離:

檢視和資料模型的分離:使用不同的檢視對相同的資料進行展示;分離可視和不可視的元件,能夠對模型進行獨立測試。因為分離了可視元件減少了外部依賴利於測試。(資料庫也是一種外部元件)

檢視和表現邏輯(Controller)的分離:Controller是一個表現邏輯的元件,並非一個業務邏輯元件。MVC可以作為表現模式也可以作為建構模式,意味這Controller也可以是業務邏輯。分離邏輯和具體展示,能夠對邏輯進行獨立測試。

優點:耦合性低;重用性高;生命週期成本低;部署塊;可維護性高;有利軟體工程化管理。

缺點:沒有明確的定義;不適合小型,中等規模的應用程式;增加系統結構和實現的複用性;檢視與控制器間的過於緊密的連線;檢視對模型資料的低效率訪問;一般高階的介面工具或構造器不支援模式。

五、特定環境

大的專案;需要劃分模組的專案。

六、解決的問題

因為在PHP還不支援面向物件之前,是過程化的方式來建立的,它們將 Model View Controller 三層的程式碼混在一起,十分混亂。所以它解決的問題有:維護難,開發速度慢,二次開發難度高,工作量大,程式碼複用,耦合度高,系統不靈活。

七、解決方案

以我的理解,將專案模組化,分為三個部分:模型,檢視和控制器三個部分。模型是應用物件,沒有使用者介面。視圖表示它在螢幕上的顯示,代表流向使用者的資料。控制器定義使用者介面對使用者輸入的響應方式,負責把使用者的動作轉成針對Model的操作。Model 透過更新View的資料來反映資料的變化。

八、例項

應用於基於MVC架構模式的框架,常見的伺服器端MVC框架有:Struts、Spring MVC、ASP。NET MVC、Zend Framework、JSF;常見前端MVC框架:angularjs、reactjs、backbone;由MVC演化出了另外一些模式如:MVP、MVVM。

這裡我們舉例Spring MVC:

Spring MVC是Spring提供的一個強大而靈活的web框架。藉助於註解,Spring MVC提供了幾乎是POJO的開發模式,使得控制器的開發和測試更加簡單。這些控制器一般不直接處理請求,而是將其委託給Spring上下文中的其他bean,透過Spring的依賴注入功能,這些bean被注入到控制器中。Spring MVC主要由DispatcherServlet、處理器對映、處理器(控制器)、檢視解析器、檢視組成。他的兩個核心是兩個核心:

  

處理器對映:選擇使用哪個控制器來處理請求

檢視解析器:選擇結果應該如何渲染

透過以上兩點,Spring MVC保證瞭如何選擇控制處理請求和如何選擇檢視展現輸出之間的松耦合。

執行原理如圖所示:

超詳細的!!!MVC架構模式說明

(1)Http請求:客戶端請求提交到DispatcherServlet。

(2)尋找處理器:由DispatcherServlet控制器查詢一個或多個HandlerMapping,找到處理請求的Controller。

(3)呼叫處理器:DispatcherServlet將請求提交到Controller。

(4)(5)呼叫業務處理和返回結果:Controller呼叫業務邏輯處理後,返回ModelAndView。

(6)(7)處理檢視對映並返回模型: DispatcherServlet查詢一個或多個ViewResoler檢視解析器,找到ModelAndView指定的檢視。

(8) Http響應:檢視負責將結果顯示到客戶端。

Spring MVC框架與MVC架構模式聯絡在於:

SpringMVC中並沒有涉及有關於Controller介面規範的實現,SpringMVC是透過呼叫Handler來實現Controller這一層的。

SpringMVC使用了介面卡模式,前端控制器使用HandlerAdapter來呼叫不同的Controller,然後才是Controller呼叫Model產生資料模型;

產生的資料模型將會再次返回到前端控制器,並由前端控制器決定使用不同的模板引擎將頁面進行渲染。

九、MVC架構模式與分層模式的區別

MVC模式屬於設計模式的範疇,就如同其他設計模式一樣,模式的出現就是為了對某種功能的最佳化,而MVC模式可以看做是對三層架構中表現層的一種細分最佳化。以我的理解,MVC模式就是分層模式中表示層最常用的架構模式。

詳細闡述如下:

嚴格說這三個加起來以後才是三層架構中的表現層,也就是說,MVC把三層架構中的UI層再度進行了分化,分成了控制器、檢視、實體三個部分,控制器完成頁面邏輯,透過實體來與介面層完成通話;而C層直接與三層中的業務邏輯層進行對話。三層和MVC可以共存。 三層是基於業務邏輯來分的,而MVC是基於頁面來分的。

三層架構的分層模式是典型的上下關係,上層依賴於下層。但MVC作為表現模式是不存在上下關係的,而是相互協作關係。即使將MVC當作架構模式,也不是分層模式。MVC和三層架構基本沒有可比性,是應用於不同領域的技術。

十、MVC架構模式與MVC框架的區別

  

MVC框架,強制性的使應用程式輸入、處理和輸出分開。使用MVC應用程式被分成三個核心部件:模型、檢視、控制器。它們各自處理自己的任務。其所使用的三個核心部件都是來時MVC模式的。只不過在框架中讓他們彼此更加獨立了去處理各自的任務而已。最典型的MVC就是JSP+SERVLET+JAVABEAN模式。

MCV框架中:

檢視:檢視是使用者看到並與之互動的介面,檢視的主要有元素HTML,Adobe Flash,XHTML,XML/XSL,WML等一些標識語言和Web services。

模型:模型資料和業務規則。

控制器:控制器接受使用者的輸入並呼叫模型和檢視去完成使用者的需求,所以當單擊Web頁面中的超連結和傳送HTML表單時,控制器本身不輸出任何東西和做任何處理。它只是接收請求並決定呼叫哪個模型構件去處理請求,然後再確定用哪個檢視來顯示返回的資料。

十一、MVC架構模式的舉例說明

例如①,小時候玩的那種卡帶式遊戲機,Control是主機,一般來說我買一個主機就行了,只要他不壞,他就能一直讓我玩這一類的遊戲。View則是電視機和遊戲手柄,電視機可以獨立工作,他不管輸入的是電視訊號、影碟機訊號還是遊戲機訊號,他只管顯示,而且他決定了我們看到的效果是怎麼樣的,如果我想要個尺寸更大的或者彩色的顯示效果,我只需要買個相應的電視機就行了,手柄也是可以換的,遙杆還是帶震動的。Model則是遊戲卡帶,他決定了我玩的是什麼遊戲,是魂鬥羅還是超級瑪莉,而且遊戲機主機和電視機生產廠家永遠也不知道在上面有可能會執行什麼樣的遊戲。卡帶中可能會有遊戲程式碼和儲存單元,都根據遊戲的需要而設計。

例如②,一個採用比例表示的用於政治選舉的一個簡單資訊系統,它提供了一個輸入資料的電子資料表和表示當前結果的幾種圖示。使用者可以透過圖形介面與系統互動。所有資訊顯示必須立即反應出選舉資料的變化。(引用自《面向模式的軟體體系結構-卷1 模式系統》)

超詳細的!!!MVC架構模式說明

即,一旦模型的資料發生了變化,模型要通報所有的檢視。