一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

深入理解MVC

 算法與編程之美 2020-08-08

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ā),所以知其然并知其所以然是很有必要的。

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产又色又爽又黄又大| 国产亚洲精品久久久优势| 粉嫩内射av一区二区| 91人妻人人做人碰人人九色| 粗暴蹂躏中文一区二区三区| 欧洲一区二区三区蜜桃| 国产内射一级一片内射高清视频| 欧美日韩久久精品一区二区 | 国产精品免费无遮挡不卡视频| 日韩免费午夜福利视频| 国产一区二区精品丝袜| 91亚洲精品亚洲国产| 久久热九九这里只有精品| 国产成人综合亚洲欧美日韩 | av一区二区三区天堂| 福利在线午夜绝顶三级| 国产熟女一区二区不卡| 国产一区二区三区草莓av| 成人午夜视频精品一区| 精品国产亚洲区久久露脸| 日本午夜福利视频免费观看| 国内精品偷拍视频久久| 亚洲中文在线中文字幕91| 国产爆操白丝美女在线观看| 九九九热在线免费视频| 香蕉尹人视频在线精品| 中文人妻精品一区二区三区四区| 精品精品国产欧美在线| 婷婷亚洲综合五月天麻豆| 少妇毛片一区二区三区| 人妻偷人精品一区二区三区不卡 | 国产内射一级一片内射高清| 日韩精品一级一区二区| 亚洲精品一二三区不卡| 风韵人妻丰满熟妇老熟女av| 亚洲乱妇熟女爽的高潮片| 欧美成人一区二区三区在线| 国产精品推荐在线一区| 午夜精品麻豆视频91| 欧美日韩综合在线精品| 精品欧美一区二区三久久|