『设计模式』Web程序开发最基本的编程模式--MVC编程模式
23種設(shè)計(jì)模式+額外常用設(shè)計(jì)模式匯總 (持續(xù)更新)
什么是MVC編程模式 ?
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫(xiě),一種軟件設(shè)計(jì)典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí),不需要重新編寫(xiě)業(yè)務(wù)邏輯。MVC被獨(dú)特的發(fā)展起來(lái)用于映射傳統(tǒng)的輸入、處理和輸出功能在一個(gè)邏輯的圖形化用戶界面的結(jié)構(gòu)中
MVC開(kāi)始是存在于桌面程序中的,M是指業(yè)務(wù)模型,V是指用戶界面,C則是控制器,使用MVC的目的是將M和V的實(shí)現(xiàn)代碼分離,從而使同一個(gè)程序可以使用不同的表現(xiàn)形式。比如一批統(tǒng)計(jì)數(shù)據(jù)可以分別用柱狀圖、餅圖來(lái)表示。C存在的目的則是確保M和V的同步,一旦M改變,V應(yīng)該同步更新。
后來(lái)多用于Web程序設(shè)計(jì)中,前端View提供數(shù)據(jù)模型展示和人機(jī)交互,Controller 接收用戶請(qǐng)求,委托給模型進(jìn)行處理(狀態(tài)改變),處理完畢后把返回的模型數(shù)據(jù)返回給視圖,由視圖負(fù)責(zé)展示。 起到了一個(gè)調(diào)度服務(wù)的作用。Mode模型層原來(lái)是包括數(shù)據(jù)和服務(wù)層,現(xiàn)在一般分開(kāi)處理數(shù)據(jù)和服務(wù)層。
模型-視圖-控制器模式是一個(gè)有用的工具箱,它有很多好處,但也有一些缺點(diǎn)。
MVC模式都出現(xiàn)了好久了,為啥還要學(xué)?
我問(wèn)了幾個(gè)工作了的程序員(不是什么大牛,說(shuō)的不對(duì)可以指正)大廠和特殊的廠可能會(huì)玩一些的花的,但是很多公司仍是繞不開(kāi)MVC和三層架構(gòu)(不一樣都是三個(gè),千萬(wàn)不可混淆)。MVC仍是經(jīng)典的Web開(kāi)發(fā)的編程模式。
為什么GOF四人幫設(shè)計(jì)模式?jīng)]有寫(xiě)這個(gè)設(shè)計(jì)模式?
我個(gè)人覺(jué)得主要是當(dāng)時(shí)要解決的問(wèn)題和后來(lái)的解決的問(wèn)題不一樣,隨著時(shí)代發(fā)展,而生產(chǎn)出的這個(gè)設(shè)計(jì)模式。深挖一下不難發(fā)現(xiàn)MVC模式是組合模式、策咯模式、觀察者模式的一個(gè)結(jié)合體。其中View層,單獨(dú)實(shí)現(xiàn)了組合模式,Model層和View層,實(shí)現(xiàn)了觀察者模式,View層和Controller層,實(shí)現(xiàn)了策咯模式。
MVC應(yīng)用
一個(gè)非常好的應(yīng)用就是 Struts框架。 Struts是最早的Java開(kāi)源框架之一,它是MVC設(shè)計(jì)模式的一個(gè)優(yōu)秀實(shí)現(xiàn)。 Struts定義了通用的Controller(控制器),通過(guò)配置文件(通常是 Struts -config.xml)
Struts是最早的java開(kāi)源框架之一,它是MVC設(shè)計(jì)模式的一個(gè)優(yōu)秀實(shí)現(xiàn)。 Struts定義了通用的Controller(控制器),通過(guò)配置文件(通常是 Struts -config.xml)隔離Model(模型)和View(視圖),以Action的概念以對(duì)用戶請(qǐng)求進(jìn)行了封裝,使代碼更加清晰易讀。 Struts還提供了自動(dòng)將請(qǐng)求的數(shù)據(jù)填充到對(duì)象中以及頁(yè)面標(biāo)簽等簡(jiǎn)化編碼的工具。 Struts能夠開(kāi)發(fā)大型Java Web項(xiàng)目。
圖是在網(wǎng)上找的,不要罵我!
優(yōu)點(diǎn)
1.耦合性低
視圖層和業(yè)務(wù)層分離,這樣就允許更改視圖層代碼而不用重新編譯模型和控制器代碼,同樣,一個(gè)應(yīng)用的業(yè)務(wù)流程或者業(yè)務(wù)規(guī)則的改變只需要改動(dòng)MVC的模型層即可。因?yàn)槟P团c控制器和視圖相分離,所以很容易改變應(yīng)用程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則。
2.重用性高
MVC模式允許使用各種不同樣式的視圖來(lái)訪問(wèn)同一個(gè)服務(wù)器端的代碼,因?yàn)槎鄠€(gè)視圖能共享一個(gè)模型,它包括任何WEB(HTTP)瀏覽器或者無(wú)線瀏覽器(wap),比如,用戶可以通過(guò)電腦也可通過(guò)手機(jī)來(lái)訂購(gòu)某樣產(chǎn)品,雖然訂購(gòu)的方式不一樣,但處理訂購(gòu)產(chǎn)品的方式是一樣的。由于模型返回的數(shù)據(jù)沒(méi)有進(jìn)行格式化,所以同樣的構(gòu)件能被不同的界面使用。
3.部署快,生命周期成本低
MVC使開(kāi)發(fā)和維護(hù)用戶接口的技術(shù)含量降低。使用MVC模式使開(kāi)發(fā)時(shí)間得到相當(dāng)大的縮減,它使程序員(Java開(kāi)發(fā)人員)集中精力于業(yè)務(wù)邏輯,界面程序員(HTML和JSP開(kāi)發(fā)人員)集中精力于表現(xiàn)形式上。
4.可維護(hù)性高
分離視圖層和業(yè)務(wù)邏輯層也使得WEB應(yīng)用更易于維護(hù)和修改。
缺點(diǎn)
1.沒(méi)有很明確的定義,完全理解MVC比較復(fù)雜。
現(xiàn)在學(xué)習(xí)處于斷層,前邊的人學(xué)完了扔了,后邊的人不愿意用,到現(xiàn)在沒(méi)啥可說(shuō)的,時(shí)代就這樣。
2.調(diào)試?yán)щy。
因?yàn)槟P秃鸵晥D要嚴(yán)格的分離,這樣也給調(diào)試應(yīng)用程序帶來(lái)了一定的困難,每個(gè)構(gòu)件在使用之前都需要經(jīng)過(guò)徹底的測(cè)試。
3.不適合小型,中等規(guī)模的應(yīng)用程序
在一個(gè)中小型的應(yīng)用程序中,強(qiáng)制性的使用MVC進(jìn)行開(kāi)發(fā),花費(fèi)大量時(shí)間將MVC應(yīng)用到規(guī)模并不是很大的應(yīng)用程序通常會(huì)得不償失,完全顯示不出MVC的優(yōu)點(diǎn)。
4.增加系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)的復(fù)雜性
對(duì)于簡(jiǎn)單的界面,嚴(yán)格遵循MVC,使模型、視圖與控制器分離,會(huì)增加結(jié)構(gòu)的復(fù)雜性,并可能產(chǎn)生過(guò)多的更新操作,降低運(yùn)行效率。
5.視圖與控制器間的過(guò)于緊密的連接并且降低了視圖對(duì)模型數(shù)據(jù)的訪問(wèn)
視圖與控制器是相互分離,但卻是聯(lián)系緊密的部件,視圖沒(méi)有控制器的存在,其應(yīng)用是很有限的,反之亦然,這樣就妨礙了他們的獨(dú)立重用。
6.效率問(wèn)題
依據(jù)模型操作接口的不同,視圖可能需要多次調(diào)用才能獲得足夠的顯示數(shù)據(jù)。對(duì)未變化數(shù)據(jù)的不必要的頻繁訪問(wèn),也將損害操作性能。
7.畢竟是整合了三種設(shè)計(jì)模式,還是有一部分的缺點(diǎn)沒(méi)有得到消除。
最經(jīng)典的MVC實(shí)現(xiàn)
最典型的MVC就是jsp+servlet+javabean模式,也就是很多高校里講的那種,有幸我就是一員。
JavaBean作為模型,既可以作為數(shù)據(jù)模型來(lái)封裝業(yè)務(wù)數(shù)據(jù),又可以作為業(yè)務(wù)邏輯模型來(lái)包含應(yīng)用的業(yè)務(wù)操作。其中,數(shù)據(jù)模型用來(lái)存儲(chǔ)或傳遞業(yè)務(wù)數(shù)據(jù),而業(yè)務(wù)邏輯模型接收到控制器傳過(guò)來(lái)的模型更新請(qǐng)求后,執(zhí)行特定的業(yè)務(wù)邏輯處理,然后返回相應(yīng)的執(zhí)行結(jié)果。
JSP作為表現(xiàn)層,負(fù)責(zé)提供頁(yè)面為用戶展示數(shù)據(jù),提供相應(yīng)的表單(Form)來(lái)用于用戶的請(qǐng)求,并在適當(dāng)?shù)臅r(shí)候(點(diǎn)擊按鈕)向控制器發(fā)出請(qǐng)求來(lái)請(qǐng)求模型進(jìn)行更新,JSP雖然可以使用Html的功能,但是畢竟是動(dòng)態(tài)的,效率還是有一定問(wèn)題的。
Serlvet作為控制器,用來(lái)接收用戶提交的請(qǐng)求,然后獲取請(qǐng)求中的數(shù)據(jù),將之轉(zhuǎn)換為業(yè)務(wù)模型需要的數(shù)據(jù)模型,然后調(diào)用業(yè)務(wù)模型相應(yīng)的業(yè)務(wù)方法進(jìn)行更新,同時(shí)根據(jù)業(yè)務(wù)執(zhí)行結(jié)果來(lái)選擇要返回的視圖。
這篇文章借鑒了不少,看了挺多的東西,才大致弄明白是什么意思,他不像其他的設(shè)計(jì)模式,這個(gè)只有一個(gè)定義,大概就是這個(gè)樣子的,你按這個(gè)來(lái)。哈哈哈,一開(kāi)始看的我挺蒙的,這是啥玩意,再看第二遍的時(shí)候,我就能明白了。如果不明白,多看幾遍。
總結(jié)
以上是生活随笔為你收集整理的『设计模式』Web程序开发最基本的编程模式--MVC编程模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 花费10万元!英国小哥做了一把可以用的巨
- 下一篇: 应该是最全的算法学习路线了吧法学习路线了