MVC(Model-View-Controller,模型—視圖—控制器模式)是軟件工程中的一種軟件架構模式。它把軟件系統分為三個基本部分:模型(Model),視圖(View)和控制器(Controller)。
MVC最早由Trygve Reenskaug在1974年[1]提出,是施樂帕羅奧多研究中心(Xerox PARC)在20世紀80年代為程序語言Smalltalk發明的一種軟件設計模式。模型—視圖—控制器模式的目的是實現一種動態的程序設計,使后續對程序的修改和擴展簡化,并且使程序某一部分的重復利用成為可能。除此之外此模式通過對復雜度的簡化使程序結構更加直觀。軟件系統通過對自身基本部份分離的同時也賦予了各個基本部分應有的功能。專業人員可以通過自身的專長分組:
- 控制器- 負責轉發請求,對請求經行處理。
- 視圖 - 界面設計人員進行圖形界面設計。
- 模型 - 程序員編寫程序應有的功能(實現算法等等)、數據庫專家進行數據管理和數據庫設計(可以實現具體的功能)。
目錄[隱藏]
|
[編輯] 層次
模型(Model) “數據模型”(Model)用于封裝與應用程序的業務邏輯相關的數據以及對數據的處理方法。“模型”有對數據直接訪問的權利,例如對數據庫的訪問。“模型”不依賴“視圖”和“控制器”,也就是說,模型不關心它會被如何顯示或是如何被操作。但是模型中數據的變化一般會通過一種刷新機制被公布。為了實現這種機制,那些用于監視此模型的視圖必須事先在此模型上注冊,從而,視圖可以了解在數據模型上發生的改變。(比較:觀察者模式(軟件設計模式))
視圖(View) 視圖層能夠實現數據有目的的顯示(理論上,這不是必需的)。在視圖中一般沒有程序上的邏輯。為了實現視圖上的刷新功能,視圖需要訪問它監視的數據模型(Model),因此應該事先在被它監視的數據那里注冊。
控制器(Controller) 控制器起到不同層面間的組織作用,用于控制應用程序的流程。它處理事件并作出響應。“事件”包括用戶的行為和數據模型上的改變。
[編輯] 優點
在最初的JSP網頁中,像數據庫查詢語句這樣的數據層代碼和像HTML這樣的表示層代碼混在一起。經驗比較豐富的開發者會將數據從表示層分離開來,但這通常不是很容易做到的,它需要精心地計劃和不斷的嘗試。MVC從根本上強制性地將它們分開。盡管構造MVC應用程序需要一些額外的工作,但是它帶給我們的好處是毋庸置疑的。
首先,多個視圖能共享一個模型。如今,同一個Web應用程序會提供多種用戶界面,例如用戶希望既能夠通過瀏覽器來收發電子郵件,還希望通過手機來訪問電子郵箱,這就要求Web網站同時能提供Internet界面和WAP界面。在MVC設計模式中,模型響應用戶請求并返回響應數據,視圖負責格式化數據并把它們呈現給用戶,業務邏輯和表示層分離,同一個模型可以被不同的視圖重用,所以大大提高了代碼的可重用性。
其次,模型是自包含的,與控制器和視圖保持相對獨立,所以可以方便的改變應用程序的數據層和業務規則。如果把數據庫從MySQL移植到Oracle,或者把RDBMS數據源改變成LDAP數據源,只需改變模型即可。一旦正確地實現了模型,不管數據來自數據庫還是LDAP服務器,視圖都會正確地顯示它們。由于MVC的三個模塊相互獨立,改變其中一個不會影響其他兩個,所以依據這種設計思想能構造良好的松耦合的構件。
此外,控制器提高了應用程序的靈活性和可配置性。控制器可以用來連接不同的模型和視圖去完成用戶的需求,也可以構造應用程序提供強有力的手段。給定一些可重用的模型和視圖,控制器可以根據用戶的需求選擇適當的模型機型處理,然后選擇適當的的視圖將處理結果顯示給用戶。
[編輯] 缺點及適用范圍
MVC的缺點是由于它沒有明確的定義,所以完全理解MVC并不是很容易。使用MVC需要精心的計劃,由于它的內部原理比較復雜,所以需要花費一些時間去思考。開發一個MVC架構的工程,將不得不花費相當可觀的時間去考慮如何將MVC運用到應用程序中,同時由于模型和視圖要嚴格的分離,這樣也給調試應用程序帶來了一定的困難。每個構件在使用之前都需要經過徹底的測試。另外由于MVC將一個應用程序分成了三個部件,所以這意味著同一個工程將包含比以前更多的文件。
因此MVC并不適合小型甚至中等規模的應用程序,這樣會帶來額外的工作量,增加應用的復雜性。但對于開發存在大量用戶界面,并且邏輯復雜的大型應用程序,MVC將會使軟件在健壯性、代碼重用和結構方面上一個新的臺階。盡管在最初構建MVC框架時會花費一定的工作量,但從長遠的角度來看,它會大大提高后期軟件開發的效率。
[編輯] 實現
[編輯] MFC
微軟所推出的MFC Document/View架構是早期對于MVC的實現,MFC將程序分成CView以及CDocument兩大類,其中的Document對應MVC中的Model,View相當于MVC中的View+Controller,再加上CWinApp類,合成三大項。但是基本上MFC是一個失敗的MVC作品。
由于MFC之下的Document/View定義過于模糊,未將Controller(MessageMap)部份取出,因此Controller可以置入View或Document,但不管置入哪一方面,都會與View或Document綁死,沒有彈性。
[編輯] Java
[編輯] Java 平臺企業版 (J2EE)
和其他的各種框架不一樣,J2EE為模型對象(Model Objects)定義了一個規范。
- 視圖(View)
- 在J2EE應用程序中,視圖(View)可能由Java Server Page(JSP)承擔。生成視圖的代碼則可能是一個servlet的一部分,特別是在客戶端服務端交互的時候。
- 控制器(Controller)
- J2EE應用中,控制器可能是一個servlet,現在一般用Struts實現。
- 模型(Model)
- 模型則是由一個實體Bean來實現。
[編輯] Java Swing
[編輯] .NET
[編輯] ASP.NET
在ASP.NET中,針對視圖(View)和控制器(Controller)的模式沒有被很好地定義。而模型(Model)則留給開發者去設計。
- 視圖(View)
- ASPX和ASCX文件被用來處理視圖的職責。在這個設計中視圖實際上是從控制器繼承而來。這個和Smalltalk的實施有所不同,在Smalltalk中不同的類都有指針互相指向對方.
- 控制器(Controller)
- 控制器的職責被分割成兩部分。事件(Event)的產生和傳輸是框架的一部分,更明確的說是Page和Control兩個類。而事件的處理則在分離的代碼中實現。
- 模型(Model)
- ASP.NET 不嚴格需要一個模型。開發者可以自行選擇創建一個模型類,但是很多人選擇放棄這一步,直接把事件處理放在控制器里處理任何計算、數據保存等等。但用模型來包含商業邏輯和數據訪問是可實現的。
[編輯] ASP.NET MVC
針對原本ASP.NET對于MVC的架構支持的不足,而預計在ASP.NET 4.0中推出ASP.NET MVC這個新的Framework。
[編輯] Windows Forms
在WinForms中,這個針對視圖(View)和控制器(Controller)的模式已經很好的定義好的。而模型(Model)則留給開發者去設計。
- 視圖(View)
- 由Form或者Control類繼承來的一個類處理視圖的職責。在WinForm這個例子中視圖和控制器被編譯在同一個類中,這個和ASP.NET不同。
- 控制器(Controller)
- 控制器的職責被分割成三部分。事件(Event)的產生和傳輸是操作系統的一部分。在.Net框架中Form和Control類將不同的事件轉發給相應的事件處理器。而事件的處理則在分離的代碼中實現。
- 模型(Model)
- 就像ASP.NET一樣,WinForm不嚴格需要一個模型。開發者可以自行選擇創建一個模型類,但是很多人選擇放棄這一步,直接把事件處理放在控制器里處理任何計算、數據保存等等。也就是說用模型來包含商業邏輯和數據訪問。
[編輯] Perl
Catalyst和Jifty是通過Perl語言所開發出來的Web Framework,都采用Model-View-Controller架構。Catalyst 本身只是做了 Controller,View 和 Model 讓開發者自由選用 CPAN 上的模塊開發,例如 Template 和 Template Declare 都可用來產生視圖。Jifty 將 MVC 完全實做完成,View 的部份在早期版本使用 Mason 實做,較新版本使用 Template Declare。
[編輯] Ruby on Rails
Ruby on Rails是通過Ruby語言所開發出來的Web Framework,也是采用Model-View-Controller架構。Model 部份使用 Active Record 概念實做,加上 Migration 機制,使得其 Model 結構非常容易控制。
[編輯] Python
Python 有許多的 MVC 架構。最常用的有 Django 和 TurboGears。
[編輯] JavaScript
- Model-View-Controller (MVC) with JavaScript
[編輯] PHP
- The Model View Controller Framework for PHP Web Applications
[編輯] ActionScript 3
- PureMVC Standard for ActionScript 3
[編輯] 參考資料
- ^ Trygve M. H. Reenskaug/MVC—XEROX PARC 1978-79
[編輯] 外部鏈接
- An overview of the MVC pattern in Java from the Sun website
- Model View Presenter with ASP.NET CodeProject article.
- History of the evolution of MVC and derivatives by Martin Fowler.
- ASP.NET MVC Framework Microsoft's Scott Guthrie on .NET MVC
- Introduction to the ASP.NET Model View Controller (MVC) Framework Scott Hanselman builds an application step-by-step using the first CTP of the ASP.NET MVC Framework in this Introductory Video
- Holub, Allen.Building user interfaces for object-oriented systems,Java World.?
- Greer, Derek. "Interactive Application Architecture Patterns", Ctrl-Shift-B, 2007.
- Building Graphical User Interfaces with the MVC Pattern in Java
- What is behind MVC