MVC與三層架構

三層架構MVC

三層架構 (3-tier application) 是將整個業(yè)務應用劃分為:表現(xiàn)層(UI)、業(yè)務邏輯層(BLL)、數(shù)據(jù)訪問層(DAL)。區(qū)分層次的目的即為了“高內(nèi)聚,低耦合”的思想。?

1、表現(xiàn)層(UI):展現(xiàn)給用戶的界面,即用戶在使用一個系統(tǒng)的時候的所見所得。? ??

2、業(yè)務邏輯層(BLL):對數(shù)據(jù)層的操作,對數(shù)據(jù)業(yè)務邏輯處理。? ??

3、數(shù)據(jù)訪問層(DAL):直接操作數(shù)據(jù)庫,針對數(shù)據(jù)的增添、刪除、修改、更新、查找等。

MVC是 Model-View-Controller,嚴格說這三個加起來才是三層架構中的UI層,也就是說,MVC把三層架構中的UI層再度進行了分化,分成了控制器、視圖、實體??刂破魍瓿身撁孢壿?,通過實體來與界面層完成通話,而C層直接與三層中的BLL進行對話。

MVC 可以是三層中的一個表現(xiàn)層框架,屬于表現(xiàn)層。三層和mvc可以共存。 三層是基于業(yè)務邏輯來分的,是一個架構設計,而MVC是基于頁面來分的,是一種設計模式。


MVC模式的介紹

MVC模式是GUI界面開發(fā)的指導模式。它基于表現(xiàn)層分離的思想把程序分為三大部分:Model-View-Controller,呈三角形結構。

Model是指數(shù)據(jù)以及應用程序邏輯,View是指 Model的視圖,也就是用戶界面。這兩者都很好理解,關鍵點在于Controller的角色以及三者之間的關系。在MVC模式中,Controller和View同屬于表現(xiàn)層,通常成對出現(xiàn)。Controller被設計為處理用戶交互的邏輯。

MVC是表現(xiàn)層的架構,MVC的Model實際上是ViewModel,即供View進行展示的數(shù)據(jù)。 ViewModel不包含業(yè)務邏輯,也不包含數(shù)據(jù)讀取。 而在N層架構中,一般還會有一個Model層,用來與數(shù)據(jù)庫的表相對應,也就是所謂ORM中的O。這個Model可能是POCO,也可能是包含一些驗證邏輯的實體類,一般也不包含數(shù)據(jù)讀取。進行數(shù)據(jù)讀取的是數(shù)據(jù)訪問層。而作為UI層的MVC一般不直接操作數(shù)據(jù)訪問層,中間會有一個業(yè)務邏輯層封裝業(yè)務邏輯、調(diào)用數(shù)據(jù)訪問層。UI層(Controller)通過業(yè)務邏輯層來得到數(shù)據(jù)(Model),并進行封裝(ViewModel),然后選擇相應的View。

MVC本來是存在于Desktop程序中的,M是指數(shù)據(jù)模型,V是指用戶界面,C則是控制器。使用MVC的目的是將M和V的實現(xiàn)代碼分離,從而使同一個程序可以使用不同的表現(xiàn)形式。比如一批統(tǒng)計數(shù)據(jù)你可以分別用柱狀圖、餅圖來表示。C存在的目的則是確保M和V的同步,一旦M改變,V應該同步更新。


?MVC如何工作

?MVC是一個設計模式,它強制性的使應用程序的輸入、處理和輸出分開。使用MVC應用程序被分成三個核心部件:模型、視圖、控制器。它們各自處理自己的任務。?

1. 視圖V ?視圖是用戶看到并與之交互的界面。對老式的Web應用程序來說,視圖就是由HTML元素組成的界面,在新式的Web應用程序中,HTML依舊在視圖中扮演著重要的角色,但一些新的技術已層出不窮,它們包括Macromedia Flash和象XHTML,XML/XSL,WML等一些標識語言和Web services. 如何處理應用程序的界面變得越來越有挑戰(zhàn)性。MVC一個大的好處是它能為你的應用程序處理很多不同的視圖。在視圖中其實沒有真正的處理發(fā)生,不管這些數(shù)據(jù)是聯(lián)機存儲的還是一個雇員列表,作為視圖來講,它只是作為一種輸出數(shù)據(jù)并允許用戶操縱的方式。?

2. 模型M ?模型表示企業(yè)數(shù)據(jù)和業(yè)務規(guī)則。在MVC的三個部件中,模型擁有最多的處理任務。被模型返回的數(shù)據(jù)是中立的,就是說模型與數(shù)據(jù)格式無關,這樣一個模型能為多個視圖提供數(shù)據(jù)。由于應用于模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重復性。?

3. ?控制器C 控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求。所以當單擊Web頁面中的超鏈接和發(fā)送HTML表單時,控制器本身不輸出任何東西和做任何處理。它只是接收請求并決定調(diào)用哪個模型構件去處理請求,然后再確定用哪個視圖來顯示返回的數(shù)據(jù)。

模型Model 模型是應用程序的主體部分。模型表示業(yè)務數(shù)據(jù),或者業(yè)務邏輯. 實現(xiàn)具體的業(yè)務邏輯、狀態(tài)管理的功能。?

視圖View 視圖是應用程序中用戶界面相關的部分,是用戶看到并與之交互的界面。 就是與用戶實現(xiàn)交互的頁面,通常實現(xiàn)數(shù)據(jù)的輸入和輸出功能。

?控制器controller 控制器工作就是根據(jù)用戶的輸入,控制用戶界面數(shù)據(jù)顯示和更新model對象狀態(tài)。起到控制整個業(yè)務流程的作用,實現(xiàn)View層跟Model層的協(xié)同工作。


為什么要使用 MVC

大部分Web應用程序都是用像ASP,PHP,或者CFML這樣的過程化(自PHP5.0版本后已全面支持面向對象模型)語言來創(chuàng)建的。它們將像數(shù)據(jù)庫查詢語句這樣的數(shù)據(jù)層代碼和像HTML這樣的表示層代碼混在一起。經(jīng)驗比較豐富的開發(fā)者會將數(shù)據(jù)從表示層分離開來,但這通常不是很容易做到的,它需要精心的計劃和不斷的嘗試。MVC從根本上強制性的將它們分開。盡管構造MVC應用程序需要一些額外的工作,但是它給我們帶來的好處是無庸質(zhì)疑的。

首先,最重要的一點是多個視圖能共享一個模型,現(xiàn)在需要用越來越多的方式來訪問你的應用程序。對此,其中一個解決之道是使用MVC,無論你的用戶想要Flash界面或是 WAP 界面,用一個模型就能處理它們。

第二,你已經(jīng)將數(shù)據(jù)和業(yè)務規(guī)則從表示層分開,所以你可以最大化的重用你的代碼。

第三,模型返回的數(shù)據(jù)沒有進行格式化,所以同樣的構件能被不同界面使用。例如,很多數(shù)據(jù)可能用HTML來表示,但是它們也有可能要用Adobe Flash和WAP來表示。模型也有狀態(tài)管理和數(shù)據(jù)持久性處理的功能,例如,基于會話的購物車和電子商務過程也能被Flash網(wǎng)站或者無線聯(lián)網(wǎng)的應用程序所重用。?

第四,模型是自包含的,并且與控制器和視圖相分離,所以很容易改變你的應用程序的數(shù)據(jù)層和業(yè)務規(guī)則。如果你想把你的數(shù)據(jù)庫從MySQL移植到Oracle,或者改變你的基于RDBMS數(shù)據(jù)源到LDAP,只需改變你的模型即可。一旦你正確的實現(xiàn)了模型,不管你的數(shù)據(jù)來自數(shù)據(jù)庫或是LDAP服務器,視圖將會正確的顯示它們。

第五,由于運用MVC的應用程序的三個部件是相互獨立,改變其中一個不會影響其它兩個,所以依據(jù)這種設計思想你能構造良好的松耦合的構件。 對我來說,控制器也提供了一個好處,就是可以使用控制器來聯(lián)接不同的模型和視圖去完成用戶的需求,這樣控制器可以為構造應用程序提供強有力的手段。給定一些可重用的模型和視圖,控制器可以根據(jù)用戶的需求選擇模型進行處理,然后選擇視圖將處理結果顯示給用戶。

拿一個簡單的登陸模塊說,需求是你輸入一個用戶名、密碼,如果輸入的跟預先定義好的一樣,那么就進入到正確頁面,如果不一樣,就提示個錯誤信息“你Y別在這兒蒙我,輸入的不對!”。 ?這個小小的模塊中,起始的輸入用戶名密碼的頁面跟經(jīng)過校驗后顯示的頁面就相當于View。 而這里還需要一個controller頁面,用于接收輸入進來的用戶名密碼,還有經(jīng)過校驗后返回的一個flag(此flag就是用于判斷你輸入的是否正確,而跳轉到相應的頁面的)。最后還缺一個Model,那么就是你那個用于校驗的類了,他就是處理你輸入的是否跟預先訂好的一樣不一樣的,之后返回一個flag。 這樣就完全實現(xiàn)了邏輯跟頁面的分離,我頁面不管你咋整,反正我就一個顯示,而controller呢也不管你Model咋判斷對不對,反正我給你了用戶名跟密碼,你就得給我整回來一個flag來,而Model呢,則是反正你敢給我個用戶名跟密碼,我就給你整過個flag。


MVC模式是上世紀70年代提出,最初用于Smalltalk平臺上的。 MVC是表現(xiàn)模式,是用來向用戶展現(xiàn)的許多組建的一個模式(UI/Presentation Patten) MVC有三種角色: Model:用來儲存數(shù)據(jù)的組件(與領域模型概念不同,兩者會相互交叉) View:從Model中獲取數(shù)據(jù)進行內(nèi)容展示的組件。同樣的Model在不同的View下可展示不同的效果。獲取Model的狀態(tài),而不對其進行操作。 Controller:接受并處理用戶指令(操作Model(業(yè)務)),選擇一個View進行操作。

MVC概述:協(xié)作 存在單向引用,例如Model不知道View和Controller的存在。View不知道Controller的存在。這就隔離了表現(xiàn)和數(shù)據(jù)。View和controller是單向引用。而實際中View和Controller也是有數(shù)據(jù)交互的。

MVC的重要特點是分離。兩種分離: View和數(shù)據(jù)(Model)的分離 使用不同的View對相同的數(shù)據(jù)進行展示;分離可視和不可視的組件,能夠對Model進行獨立測試。因為分離了可視組件減少了外部依賴利于測試。(數(shù)據(jù)庫也是一種外部組件) View和表現(xiàn)邏輯(Controller)的分離 Controller是一個表現(xiàn)邏輯的組件,并非一個業(yè)務邏輯組件。MVC可以作為表現(xiàn)模式也可以作為建構模式,意味這Controller也可以是業(yè)務邏輯。分離邏輯和具體展示,能夠對邏輯進行獨立測試。

MVC和三層架構 MVC與三層架構類似么??

View--->UI Layer? || ? Controller--->Bussiness Layer? || ?Model--->Data Access Layer 其實這樣是錯誤的。 MVC是表現(xiàn)模式(Presentation Pattern) 三層架構是典型的架構模式(Architecture Pattern) 三層架構的分層模式是典型的上下關系,上層依賴于下層。但MVC作為表現(xiàn)模式是不存在上下關系的,而是相互協(xié)作關系。即使將MVC當作架構模式,也不是分層模式。MVC和三層架構基本沒有可比性,是應用于不同領域的技術。

MVC模式與三層架構:

MVC與三層的關系

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容