MVC模式(Model-View-Controller)是軟件工程中的一種軟件架構模式,把軟件系統分爲三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。php
MVC模式最先由Trygve Reenskaug在1978年提出[1] ,是施樂帕羅奧多研究中心(Xerox PARC)在20世紀80年代爲程序語言Smalltalk發明的一種軟件設計模式。MVC模式的目的是實現一種動態的程序設計,使後續對程序的修改和擴展簡化,而且使程序某一部分的重複利用成爲可能。除此以外,此模式經過對複雜度的簡化,使程序結構更加直觀。軟件系統經過對自身基本部分分離的同時也賦予了各個基本部分應有的功能。專業人員能夠經過自身的專長分組:html
除了將應用程序劃分爲三種組件,模型 - 視圖 - 控制器(MVC)設計定義它們之間的相互做用。[2]java
在最初的JSP網頁中,像數據庫查詢語句(SQL query)這樣的數據層代碼和像HTML這樣的表示層代碼是混在一塊兒。雖然有着經驗比較豐富的開發者會將數據從表示層分離開來,但這樣的良好設計一般並非很容易作到的,實現它須要精心地計劃和不斷的嘗試。MVC能夠從根本上強制性地將它們分開。儘管構造MVC應用程序須要一些額外的工做,可是它帶給咱們的好處是毋庸置疑的。node
首先,多個視圖能共享一個模型。現在,同一個Web應用程序會提供多種用戶界面,例如用戶但願既可以經過瀏覽器來收發電子郵件,還但願經過手機來訪問電子郵箱,這就要求Web網站同時能提供Internet界面和WAP界面。在MVC設計模式中,模型響應用戶請求並返回響應數據,視圖負責格式化數據並把它們呈現給用戶,業務邏輯和表示層分離,同一個模型能夠被不一樣的視圖重用,因此大大提升了代碼的可重用性。程序員
其次,控制器是自包含(self-contained)指高獨立內聚的對象,與模型和視圖保持相對獨立,因此能夠方便的改變應用程序的數據層和業務規則。例如,把數據庫從MySQL移植到Oracle,或者把RDBMS數據源改變成LDAP數據源,只需改變模型便可。一旦正確地實現了控制器,無論數據來自數據庫仍是LDAP服務器,視圖都會正確地顯示它們。因爲MVC模式的三個模塊相互獨立,改變其中一個不會影響其餘兩個,因此依據這種設計思想能構造良好的少互擾性的構件。angularjs
此外,控制器提升了應用程序的靈活性和可配置性。控制器能夠用來鏈接不一樣的模型和視圖去完成用戶的需求,也能夠構造應用程序提供強有力的手段。給定一些可重用的模型和視圖,控制器能夠根據用戶的需求選擇適當的模型進行處理,而後選擇適當的的視圖將處理結果顯示給用戶。web
MVC模式的缺點是因爲它沒有明確的定義,因此徹底理解MVC模式並非很容易。使用MVC模式須要精心的計劃,因爲它的內部原理比較複雜,因此須要花費一些時間去思考。開發一個MVC模式架構的工程,將不得不花費至關可觀的時間去考慮如何將MVC模式運用到應用程序中,同時因爲模型和視圖要嚴格的分離,這樣也給調試應用程序帶來了必定的困難。每一個構件在使用以前都須要通過完全的測試。另外因爲MVC模式將一個應用程序分紅了三個部件,因此這意味着同一個工程將包含比之前更多的文件。算法
過去MVC模式並不適合小型甚至中等規模的應用程序,這樣會帶來額外的工做量,增長應用的複雜性。但如今多數軟件設計框架,能直接快速提供MVC骨架,供中小型應用程序開發,此問題再也不存在。對於開發存在大量用戶界面,而且邏輯複雜的大型應用程序,MVC將會使軟件在健壯性、代碼重用和結構方面上一個新的臺階。儘管在最初構建MVC模式框架時會花費必定的工做量,但從長遠的角度來看,它會大大提升後期軟件開發的效率。數據庫
微軟所推出的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綁死,沒有彈性。
和其餘的各類框架不同,J2EE爲模型對象(Model Objects)定義了一個規範。
Swing是一個標準的MVC結構. ComponentUI表明View, 負責描畫組件. 組件尤爲Model層, 好比JTextField的Document, JTable的TableModel, JTree的TreeModel等等. 而Control可能不是很明顯, 咱們或許能夠簡單的將其Event機制看做一個Swing團隊開發給開發者的Controller.
做爲Java開發者, 若是想理解MVC的結構, 學習Swing的確是個不錯的選擇.
Android中界面部分也採用了當前比較流行的MVC框架,在Android中:
在ASP.NET中,針對視圖(View)和控制器(Controller)的模式沒有被很好地定義。而模型(Model)則留給開發者去設計。
此外,在ASP.NET MVC中,通常狀況下模型一般搭配LINQ to SQL類(使用O/R Designer工具所製做而成的DBML文件)或ADO.NET實體數據模型(Entity Data Model,使用ADO.NET Entity Framework製做出的EDMX文件)來實做。
在WinForms中,這個針對視圖(View)和控制器(Controller)的模式已經很好的定義。而模型(Model)則留給開發者去設計。
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語言所開發出來的 Web Framework,也是採用 Model-View-Controller 架構。Model 部份使用 Active Record 概念實作,加上 Migration 機制,使得其 Model 結構很是容易控制。
Python 有許多的 MVC 架構。最經常使用的有 Django 和 TurboGears。
|