1 問題描述最近在學(xué)習(xí)springMVC,大家應(yīng)該都知道該框架是基于MVC架構(gòu)的框架,我們平時也常說MVC架構(gòu),MVC模式等等。都覺得MVC非常的神秘,我們平時都在使用MVC,但卻鮮有人知其所以然,那究竟什么是MVC呢?我們今天就來揭開MVC的神秘面紗。 2 問題分析MVC定義:全名Model View Controller,MVC即模型(model)-視圖(view)-控制器(controller)的縮寫。 首先我們先了解一下這三者的概念: Model(模型): 數(shù)據(jù)模型,提供要展示的數(shù)據(jù),因此包含數(shù)據(jù)和行為,可以理解為JavaBean組件(包含數(shù)據(jù)和行為),不過現(xiàn)在一般都分離開來:數(shù)據(jù)層和服務(wù)層(行為)。也就是model提供了模型數(shù)據(jù)查詢和模型數(shù)據(jù)的狀態(tài)更新等功能,包括數(shù)據(jù)和業(yè)務(wù)。 View(視圖): 負責(zé)進行模型的展示,一般就是我們見到的用戶界面,客戶想看到的東西。 Controller(控制器): 接收用戶請求,委托給模型進行處理(狀態(tài)改變),處理完畢后把返回的模型數(shù)據(jù)返回給視圖,由視圖負責(zé)展示。因此我們可以把控制器理解為一個調(diào)度員。 使用MVC的目的: MVC要實現(xiàn)的目標(biāo)是將軟件用戶界面與業(yè)務(wù)邏輯分離,從而使同一個程序可以使用不同的表現(xiàn)形式。使得代碼可擴展性、可復(fù)用性、可維護性、靈活性加強。View層是界面,Model層是業(yè)務(wù)邏輯,Controller這位調(diào)度員用來調(diào)度View層和Model層,將用戶界面與業(yè)務(wù)邏輯合理的組織在一起,起粘合劑的效果。 例如,有一個View會提交數(shù)據(jù)給Model進行處理以實現(xiàn)具體的行為,View通常不會直接提交數(shù)據(jù)給Model,它會先把數(shù)據(jù)提交給Controller,然后Controller再將數(shù)據(jù)轉(zhuǎn)發(fā)給Model。假如此時業(yè)務(wù)邏輯的處理方式有變化,那么只需要在Controller中將原來定的Model換成新實現(xiàn)的Model就可以了,這就是控制的作用,用來將不同的View和不同的Model組織在一起,順便替雙方傳遞消息。 3 MVC究竟是什么說了這么多,我們已經(jīng)知道了MVC(Model-View-Controller)三個單詞的含義與作用,那MVC究竟是什么呢?它是一種編程技術(shù)嗎?不是的,MVC是一種設(shè)計思想。用于指導(dǎo)開發(fā)者將數(shù)據(jù)也表現(xiàn)解耦,提高代碼,特別是模型部分代碼的復(fù)用性。如果我們將MVC理解為“外觀”、“機制”和“功能/數(shù)據(jù)”這三層結(jié)構(gòu),那么我們生活中很多地方都可以通過MVC進行架構(gòu)。 比如一家商場,完全可以分為三部分,一部分是倉庫,負責(zé)提供農(nóng)商品,這是“功能層”或者“數(shù)據(jù)層”;另一部分是零售店鋪,負責(zé)銷售商品,這是他的“外觀層”;它們兩者之間就是“機制層”,包括柜臺和倉庫之間一切互動的機制。這樣區(qū)分過后,這個商場的就夠就變得非常清楚,可以針對不同的層進行優(yōu)化,提高效率。 而在我們的實際開發(fā)中,最典型的MVC架構(gòu)是Jsp+Servlet+JavaBean的模式。 請看圖3-1: 圖3-1 Jsp+Servlet+JavaBean中的MVC 如圖中所示,實際上在Jsp+Servlet+JavaBean的開發(fā)中,Servlet就是控制器(Controller)的角色,Jsp就是視圖(View),而JavaBean就是模型(Model)。三者之間緊密配合形成了一個閉環(huán)。當(dāng)從瀏覽器發(fā)起一個請求過后,首先servlet會接收此請求,然后將用戶輸入的指令和數(shù)據(jù)傳遞給相應(yīng)的JavaBean來處理業(yè)務(wù)邏輯,再根據(jù)業(yè)務(wù)邏輯選擇不同的Jsp頁面顯示即視圖,最終由瀏覽器顯示視圖。而View會隨時對Model中的數(shù)據(jù)進行狀態(tài)查詢,如果model中數(shù)據(jù)有了改變,那么model將會通知view進行視圖改變。這就是我們實際開發(fā)中最典型的MVC架構(gòu)模型。 經(jīng)過我們上面的分析,有人可能會問了,MVC是一種設(shè)計模式嗎?在GoF所著的《設(shè)計模式》一書中總結(jié)出了java編程中23種設(shè)計模式,然而23種設(shè)計模式中并沒有MVC這個設(shè)計模式。其實確切的說MVC不僅僅是一個單獨的設(shè)計模式,它是多個設(shè)計模式的組合。組成MVC的三個模式分別是組合模式、策略模式、觀察者模式,MVC的強大,是離不開這三個設(shè)計模式的默契配合。那MVC中到底哪里用到了這三個設(shè)計模式呢?我們分別來看。 先說組合模式,組合模式只在視圖層活動,其實視圖層實現(xiàn)用的就是組合模式。組合模式的類層次結(jié)構(gòu)是樹狀的,而我們做web頁面時寫的HTML代碼結(jié)構(gòu)不就是樹狀的嗎,這就是一個組合模式的應(yīng)用。在平時頁面的渲染都是由瀏覽器幫我們完成了,所以我們幾乎感受不到其存在。 再一個是觀察者模式,觀察者模式分為兩部分,被觀察的對象和觀察者,觀察者又稱為監(jiān)聽者。對應(yīng)到MVC中,Model就是被觀察的對象,View是觀察者,Model層一旦發(fā)生變化,View即被通知更新。View層和Model層互相之間是持有引用的。我們在開發(fā)Web MVC程序時,因為視圖層的HTML和Model層的業(yè)務(wù)邏輯之間隔了一個HTTP,所以不能顯示的進行關(guān)聯(lián),但是他們觀察者和收聽者的關(guān)系沒有改變。當(dāng)View通過HTTP提交數(shù)據(jù)給服務(wù)器,服務(wù)器上的Model接受到數(shù)據(jù)執(zhí)行某些操作,再通過HTTP響應(yīng)將結(jié)果返回給View,瀏覽器接受到數(shù)據(jù)并更新界面,這是觀察者模式的另一宗表現(xiàn)形式。 最后是策略模式。策略模式是View和Controller之間的關(guān)系,Controller是View的一個策略。怎么理解這句話呢?想一下我們實際開發(fā)中,我們一個View有可能會被多個Controller給引用,也就是說Controller對于View是可替換的,View和Controller的關(guān)系是一對多。這就是策略模式的一種體現(xiàn)。 總結(jié)一下關(guān)于MVC各層之間關(guān)系所對應(yīng)的設(shè)計模式: View層:單獨實現(xiàn)組合模式 Model層和View層:實現(xiàn)了觀察者模式 View層和Controller層:實現(xiàn)了策略模式。 在這補充討論一點,平時開發(fā)中有許多人喜歡將業(yè)務(wù)邏輯放在controller層,從設(shè)計模式的角度講,策略模式中的策略通常都很小很薄,不會包含太多內(nèi)容,Controller既然是一個策略,那自然不能在里面放太多的內(nèi)容,否則替換一個新的會相當(dāng)麻煩,于此同時會破壞View-Model的觀察者模式,使得View不能快捷的觀察到Model的變化,以至于造成混亂。所以切忌,避免這種情況。 4 總結(jié)經(jīng)過分析我們已經(jīng)揭開了MVC的神秘面紗,我們分析了MVC的各個模塊的含義與作用,并且根據(jù)一個經(jīng)典MVC案例講解了其流程。我們明白MVC存在的主要作用就是解耦,提高代碼的復(fù)用性,并簡要說明了其用到的三個設(shè)計模式,只要將這三個設(shè)計模式弄明白,MVC將毫無神秘感而言。我們在實際開發(fā)中幾乎都在利用MVC這種方式進行開發(fā),所以知其然并知其所以然是很有必要的。 |
|