MVC(Model-View-Controller,模型—視圖—控制器模式)是軟體工程中的一種軟體架構模式。它把軟體系統分為三個基本部分:模型(Model),視圖(View)和控制器(Controller)。
MVC最早由Trygve Reenskaug在1974年[1]提出,是施樂帕羅奧多研究中心(Xerox PARC)在20世紀80年代為程式語言Smalltalk發明的一種軟體設計模式。模型—視圖—控制器模式的目的是實現一種動態程式設計,使後續對程式的修改和擴充簡化,並且使程式某一部分的重複利用成為可能。除此之外此模式通過對複雜度的簡化使程式結構更加直觀。軟體系統通過對自身基本部份分離的同時也賦予了各個基本部分應有的功能。專業人員可以通過自身的專長分組:
- 控制器- 負責轉寄請求,對請求經行處理。
- 視圖 - 介面設計人員進行圖形介面設計。
- 模型 - 程式員編寫程式應有的功能(實現演算法等等)、資料庫專家進行資料管理和資料庫設計(可以實現具體的功能)。
| 目錄 [隱藏]
- 1 層次
- 2 優點
- 3 缺點及適用範圍
- 4 實現
- 4.1 MFC
- 4.2 Java
- 4.2.1 Java 平台企業版 (J2EE)
- 4.2.2 Java Swing
- 4.3 .NET
- 4.3.1 ASP.NET
- 4.3.2 ASP.NET MVC
- 4.3.3 Windows Forms
- 4.4 Perl
- 4.5 Ruby on Rails
- 4.6 Python
- 4.7 JavaScript
- 4.8 PHP
- 4.9 ActionScript 3
- 5 參考資料
- 6 外部連結
|
[編輯] 層次
模型(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
取自“http://zh.wikipedia.org/zh-cn/MVC”