深刻理解MVC

 

1 問題描述

最近在學習springMVC,你們應該都知道該框架是基於MVC架構的框架,咱們平時也常說MVC架構,MVC模式等等。都以爲MVC很是的神祕,咱們平時都在使用MVC,但卻鮮有人知其因此然,那究竟什麼是MVC呢?咱們今天就來揭開MVC的神祕面紗。java

2 問題分析

MVC定義:全名Model View Controller,MVC即模型(model)-視圖(view)-控制器(controller)的縮寫。web

首先咱們先了解一下這三者的概念:spring

Model(模型):編程

數據模型,提供要展現的數據,所以包含數據和行爲,能夠理解爲JavaBean組件(包含數據和行爲),不過如今通常都分離開來:數據層和服務層(行爲)。也就是model提供了模型數據查詢和模型數據的狀態更新等功能,包括數據和業務。設計模式

View(視圖):瀏覽器

負責進行模型的展現,通常就是咱們見到的用戶界面,客戶想看到的東西。服務器

Controller(控制器):架構

接收用戶請求,委託給模型進行處理(狀態改變),處理完畢後把返回的模型數據返回給視圖,由視圖負責展現。所以咱們能夠把控制器理解爲一個調度員。框架

使用MVC的目的:ide

MVC要實現的目標是將軟件用戶界面與業務邏輯分離,從而使同一個程序可使用不一樣的表現形式。使得代碼可擴展性、可複用性、可維護性、靈活性增強。View層是界面,Model層是業務邏輯,Controller這位調度員用來調度View層和Model層,將用戶界面與業務邏輯合理的組織在一塊兒,起粘合劑的效果。

例如,有一個View會提交數據給Model進行處理以實現具體的行爲,View一般不會直接提交數據給Model,它會先把數據提交給Controller,而後Controller再將數據轉發給Model。假如此時業務邏輯的處理方式有變化,那麼只須要在Controller中將原來定的Model換成新實現的Model就能夠了,這就是控制的做用,用來將不一樣的View和不一樣的Model組織在一塊兒,順便替雙方傳遞消息。

3 MVC到底是什麼

說了這麼多,咱們已經知道了MVC(Model-View-Controller)三個單詞的含義與做用,那MVC到底是什麼呢?它是一種編程技術嗎?不是的,MVC是一種設計思想。用於指導開發者將數據也表現解耦,提升代碼,特別是模型部分代碼的複用性。若是咱們將MVC理解爲「外觀」、「機制」和「功能/數據」這三層結構,那麼咱們生活中不少地方均可以經過MVC進行架構。

好比一家商場,徹底能夠分爲三部分,一部分是倉庫,負責提供農商品,這是「功能層」或者「數據層」;另外一部分是零售店鋪,負責銷售商品,這是他的「外觀層」;它們二者之間就是「機制層」,包括櫃檯和倉庫之間一切互動的機制。這樣區分事後,這個商場的就夠就變得很是清楚,能夠針對不一樣的層進行優化,提升效率。

而在咱們的實際開發中,最典型的MVC架構是Jsp+Servlet+JavaBean的模式。

請看圖3-1:

640?wx_fmt=png

圖3-1 Jsp+Servlet+JavaBean中的MVC

如圖中所示,實際上在Jsp+Servlet+JavaBean的開發中,Servlet就是控制器(Controller)的角色,Jsp就是視圖(View),而JavaBean就是模型(Model)。三者之間緊密配合造成了一個閉環。當從瀏覽器發起一個請求事後,首先servlet會接收此請求,而後將用戶輸入的指令和數據傳遞給相應的JavaBean來處理業務邏輯,再根據業務邏輯選擇不一樣的Jsp頁面顯示即視圖,最終由瀏覽器顯示視圖。而View會隨時對Model中的數據進行狀態查詢,若是model中數據有了改變,那麼model將會通知view進行視圖改變。這就是咱們實際開發中最典型的MVC架構模型。

通過咱們上面的分析,有人可能會問了,MVC是一種設計模式嗎?在GoF所著的《設計模式》一書中總結出了java編程中23種設計模式,然而23種設計模式中並無MVC這個設計模式。其實確切的說MVC不只僅是一個單獨的設計模式,它是多個設計模式的組合。組成MVC的三個模式分別是組合模式、策略模式、觀察者模式,MVC的強大,是離不開這三個設計模式的默契配合。那MVC中到底哪裏用到了這三個設計模式呢?咱們分別來看。

先說組合模式,組合模式只在視圖層活動,其實視圖層實現用的就是組合模式。組合模式的類層次結構是樹狀的,而咱們作web頁面時寫的HTML代碼結構不就是樹狀的嗎,這就是一個組合模式的應用。在平時頁面的渲染都是由瀏覽器幫咱們完成了,因此咱們幾乎感覺不到其存在。

再一個是觀察者模式,觀察者模式分爲兩部分,被觀察的對象和觀察者,觀察者又稱爲監聽者。對應到MVC中,Model就是被觀察的對象,View是觀察者,Model層一旦發生變化,View即被通知更新。View層和Model層互相之間是持有引用的。咱們在開發Web MVC程序時,由於視圖層的HTML和Model層的業務邏輯之間隔了一個HTTP,因此不能顯示的進行關聯,可是他們觀察者和收聽者的關係沒有改變。當View經過HTTP提交數據給服務器,服務器上的Model接受到數據執行某些操做,再經過HTTP響應將結果返回給View,瀏覽器接受到數據並更新界面,這是觀察者模式的另外一宗表現形式。

最後是策略模式。策略模式是View和Controller之間的關係,Controller是View的一個策略。怎麼理解這句話呢?想一下咱們實際開發中,咱們一個View有可能會被多個Controller給引用,也就是說Controller對於View是可替換的,View和Controller的關係是一對多。這就是策略模式的一種體現。

總結一下關於MVC各層之間關係所對應的設計模式:

View層:單獨實現組合模式

Model層和View層:實現了觀察者模式

View層和Controller層:實現了策略模式。

在這補充討論一點,平時開發中有許多人喜歡將業務邏輯放在controller層,從設計模式的角度講,策略模式中的策略一般都很小很薄,不會包含太多內容,Controller既然是一個策略,那天然不能在裏面放太多的內容,不然替換一個新的會至關麻煩,於此同時會破壞View-Model的觀察者模式,使得View不能快捷的觀察到Model的變化,以致於形成混亂。因此切忌,避免這種狀況。

4 總結

通過分析咱們已經揭開了MVC的神祕面紗,咱們分析了MVC的各個模塊的含義與做用,而且根據一個經典MVC案例講解了其流程。咱們明白MVC存在的主要做用就是解耦,提升代碼的複用性,並簡要說明了其用到的三個設計模式,只要將這三個設計模式弄明白,MVC將毫無神祕感而言。咱們在實際開發中幾乎都在利用MVC這種方式進行開發,因此知其然並知其因此然是頗有必要的。

更多精彩文章:

相關文章
相關標籤/搜索