網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
MVC
經(jīng)典MVC模式中,M是指業(yè)務(wù)模型,V是指用戶(hù)界面,C則是控制器,使用MVC的目的是將M和V的實(shí)現(xiàn)代碼分離,從而使同一個(gè)程序可以使用不同的表現(xiàn)形式。
MVC 編程模式
M(Model):模型層。是應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯的部分,模型對(duì)象負(fù)責(zé)在數(shù)據(jù)庫(kù)中存取數(shù)據(jù);
V(View):視圖層。是應(yīng)用程序中處理數(shù)據(jù)顯示的部分,視圖是依據(jù)模型數(shù)據(jù)創(chuàng)建的;
C(Controller):控制層。是應(yīng)用程序中處理用戶(hù)交互的部分,控制器接受用戶(hù)的輸入并調(diào)用模型和視圖去完成用戶(hù)的需求,控制器本身不輸出任何東西和做任何處理。它只是接收請(qǐng)求并決定調(diào)用哪個(gè)模型構(gòu)件去處理請(qǐng)求,然后再確定用哪個(gè)視圖來(lái)顯示返回的數(shù)據(jù)。
?MVC的優(yōu)缺點(diǎn)
優(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),比如,用戶(hù)可以通過(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ù)用戶(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.完全理解MVC比較復(fù)雜。
由于MVC模式提出的時(shí)間不長(zhǎng),加上同學(xué)們的實(shí)踐經(jīng)驗(yàn)不足,所以完全理解并掌握MVC不是一個(gè)很容易的過(guò)程。
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ā),往往會(huì)花費(fèi)大量時(shí)間,并且不能體現(xiàn)MVC的優(yōu)勢(shì),同時(shí)會(huì)使開(kāi)發(fā)變得繁瑣。
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ú)立重用。
依據(jù)模型操作接口的不同,視圖可能需要多次調(diào)用才能獲得足夠的顯示數(shù)據(jù)。對(duì)未變化數(shù)據(jù)的不必要的頻繁訪問(wèn),也將損害操作性能。
MVVM
MVVM是Model-View-ViewModel的簡(jiǎn)寫(xiě)。它本質(zhì)上就是MVC 的改進(jìn)版。
MVVM包括view視圖層、model數(shù)據(jù)層、viewmodel層。采用雙向數(shù)據(jù)綁定,View的變動(dòng),自動(dòng)反映在 ViewModel,反之亦然。
MVVM 就是將其中的View 的狀態(tài)和行為抽象化,讓我們將視圖 UI 和業(yè)務(wù)邏輯分開(kāi)。其中ViewModel 就是View和Model層的粘合劑,可以取出 Model 的數(shù)據(jù)同時(shí)幫忙處理 View 中由于需要展示內(nèi)容而涉及的業(yè)務(wù)邏輯。說(shuō)白了,就是把原來(lái)ViewController層的業(yè)務(wù)邏輯和頁(yè)面邏輯等剝離出來(lái)放到ViewModel層
M(Model):模型層。就是業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù)對(duì)象,通常從數(shù)據(jù)庫(kù)映射而來(lái),我們可以說(shuō)是與數(shù)據(jù)庫(kù)對(duì)應(yīng)的model。
V(View):視圖層。就是展現(xiàn)出來(lái)的用戶(hù)界面。
VM(ViewModel):視圖模型層。連接view和model的橋梁。因?yàn)?,Model層中的數(shù)據(jù)往往是不能直接跟View中的控件一一對(duì)應(yīng)上的,所以,需要再定義一個(gè)數(shù)據(jù)對(duì)象專(zhuān)門(mén)對(duì)應(yīng)view上的控件。而ViewModel的職責(zé)就是把model對(duì)象封裝成可以顯示和接受輸入的界面數(shù)據(jù)對(duì)象。
MVVM優(yōu)點(diǎn)
MVVM模式和MVC模式一樣,主要目的是分離視圖(View)和模型(Model),有幾大優(yōu)點(diǎn)
1. 低耦合。視圖(View)可以獨(dú)立于Model變化和修改,一個(gè)ViewModel可以綁定到不同的"View"上,當(dāng)View變化的時(shí)候Model可以不變,當(dāng)Model變化的時(shí)候View也可以不變。
2. 可重用性。你可以把一些視圖邏輯放在一個(gè)ViewModel里面,讓很多view重用這段視圖邏輯。
3. 獨(dú)立開(kāi)發(fā)。開(kāi)發(fā)人員可以專(zhuān)注于業(yè)務(wù)邏輯和數(shù)據(jù)的開(kāi)發(fā)(ViewModel),設(shè)計(jì)人員可以專(zhuān)注于頁(yè)面設(shè)計(jì),使用Expression Blend可以很容易設(shè)計(jì)界面并生成xaml代碼。
4. 可測(cè)試。界面素來(lái)是比較難于測(cè)試的,測(cè)試可以針對(duì)ViewModel來(lái)寫(xiě)。
MVC與MVVM的區(qū)別
在MVC里,View是可以直接訪問(wèn)Model的,所以View里會(huì)包含Model信息以及一些業(yè)務(wù)邏輯。 MVC模型關(guān)注的是Model的不變,所以在MVC模型里,Model不依賴(lài)于View,但是 View是依賴(lài)于Model的。不僅如此,因?yàn)橛幸恍I(yè)務(wù)邏輯在View里實(shí)現(xiàn)了,導(dǎo)致要更改View也是比較困難的,至少那些業(yè)務(wù)邏輯是無(wú)法重用的。
MVVM在概念上是真正將頁(yè)面與數(shù)據(jù)邏輯分離的模式,它把數(shù)據(jù)綁定工作放到一個(gè)JS里去實(shí)現(xiàn),而這個(gè)JS文件的主要功能是完成數(shù)據(jù)的綁定,即把model綁定到UI的元素上。此外MVVM另一個(gè)重要特性雙向綁定,它更方便你去同時(shí)維護(hù)頁(yè)面上都依賴(lài)于某個(gè)字段的N個(gè)區(qū)域,而不用手動(dòng)更新它們。
MVC和MVVM都是一種設(shè)計(jì)思想。 主要就是MVC中Controller演變成MVVM中的viewModel。 MVVM主要解決了MVC中大量DOM操作使頁(yè)面渲染性能降低,加載速度變慢的問(wèn)題 。
MVVM與MVC最大的區(qū)別就是:它實(shí)現(xiàn)了View和Model的自動(dòng)同步:當(dāng)Model的屬性改變時(shí),我們不用再自己手動(dòng)操作Dom元素來(lái)改變View的顯示,它會(huì)自動(dòng)變化。
原文鏈接:https://blog.csdn.net/m0_53206841/article/details/125824684
相關(guān)推薦
- 2022-04-14 Python中字典的相關(guān)操作介紹_python
- 2022-01-06 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to
- 2022-10-29 正則表達(dá)式從HTML中匹配img標(biāo)簽的圖片地址_正則表達(dá)式
- 2023-01-17 關(guān)于最大池化層和平均池化層圖解_python
- 2022-04-18 Android實(shí)現(xiàn)繪制折線圖APP代碼_Android
- 2023-02-07 C#實(shí)現(xiàn)自定義屏保的示例代碼_C#教程
- 2023-12-11 使用SSH地址拉取遠(yuǎn)程倉(cāng)庫(kù)代碼報(bào)下面的錯(cuò)誤
- 2022-03-16 使用Nginx實(shí)現(xiàn)端口轉(zhuǎn)發(fā)TCP代理的實(shí)現(xiàn)示例_nginx
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支