[轉載]WIKI MVC模式

MVC模式(Model-View-Controller)是軟件工程中的一種軟件架構模式,把軟件系統分爲三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。php

MVC模式最先由Trygve Reenskaug在1978年提出[1] ,是施樂帕羅奧多研究中心(Xerox PARC)在20世紀80年代爲程序語言Smalltalk發明的一種軟件設計模式。MVC模式的目的是實現一種動態的程序設計,使後續對程序的修改和擴展簡化,而且使程序某一部分的重複利用成爲可能。除此以外,此模式經過對複雜度的簡化,使程序結構更加直觀。軟件系統經過對自身基本部分分離的同時也賦予了各個基本部分應有的功能。專業人員能夠經過自身的專長分組:html

  • (控制器Controller)- 負責轉發請求,對請求進行處理。
  • (視圖View) - 界面設計人員進行圖形界面設計。
  • (模型Model) - 程序員編寫程序應有的功能(實現算法等等)、數據庫專家進行數據管理和數據庫設計(能夠實現具體的功能)。
 
MVC模式

 

 

組件的互動[編輯]

 
MVC組件之間的典型合做

除了將應用程序劃分爲三種組件,模型 - 視圖 - 控制器(MVC)設計定義它們之間的相互做用。[2]java

  • 模型(Model) 用於封裝與應用程序的業務邏輯相關的數據以及對數據的處理方法。「模型」有對數據直接訪問的權力,例如對數據庫的訪問。「模型」不依賴「視圖」和「控制器」,也就是說,模型不關心它會被如何顯示或是如何被操做。可是模型中數據的變化通常會經過一種刷新機制被公佈。爲了實現這種機制,那些用於監視此模型的視圖必須事先在此模型上註冊,從而,視圖能夠了解在數據模型上發生的改變。(比較:觀察者模式軟件設計模式))
  • 視圖(View)可以實現數據有目的的顯示(理論上,這不是必需的)。在視圖中通常沒有程序上的邏輯。爲了實現視圖上的刷新功能,視圖須要訪問它監視的數據模型(Model),所以應該事先在被它監視的數據那裏註冊。
  • 控制器(Controller)起到不一樣層面間的組織做用,用於控制應用程序的流程。它處理事件並做出響應。「事件」包括用戶的行爲和數據模型上的改變。

優勢[編輯]

在最初的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[編輯]

微軟所推出的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,如今通常用 Struts2/ Spring Framework實現。
模型(Model)
模型則是由一個實體Bean來實現。

Java Swing[編輯]

Swing是一個標準的MVC結構. ComponentUI表明View, 負責描畫組件. 組件尤爲Model層, 好比JTextField的Document, JTable的TableModel, JTree的TreeModel等等. 而Control可能不是很明顯, 咱們或許能夠簡單的將其Event機制看做一個Swing團隊開發給開發者的Controller.

做爲Java開發者, 若是想理解MVC的結構, 學習Swing的確是個不錯的選擇.

Android[編輯]

Android中界面部分也採用了當前比較流行的MVC框架,在Android中:

視圖(View)
通常採用XML文件進行界面的描述,使用的時候能夠很是方便的引入。固然,如何你對Android瞭解的比較的多了話,就必定能夠想到在Android中也可使用JavaScript+HTML等的方式做爲View層,固然這裏須要進行Java和JavaScript之間的通訊,幸運的是,Android提供了它們之間很是方便的通訊實現。
控制器(Controller)
Android的控制層的重任一般落在了衆多的Activity的肩上,這句話也就暗含了不要在Activity中寫代碼,要經過Activity交割Model業務邏輯層處理,這樣作的另一個緣由是Android中的Activity的響應時間是5s,若是耗時的操做放在這裏,程序就很容易被回收掉。
模型(Model)
對數據庫的操做、對網絡等的操做都應該在Model裏面處理,固然對業務計算等操做也是必須放在的該層的。就是應用程序中二進制的數據。

.NET[編輯]

ASP.NET[編輯]

在ASP.NET中,針對視圖(View)和控制器(Controller)的模式沒有被很好地定義。而模型(Model)則留給開發者去設計。

視圖(View)
ASPX和ASCX文件被用來處理視圖的職責。在這個設計中視圖其實是從控制器繼承而來。這個和Smalltalk的實施有所不一樣,在Smalltalk中不一樣的類都有指針互相指向對方.
控制器(Controllers)
控制器的職責被分區成兩部分。事件(Event)的產生和傳輸是框架的一部分,更明確的說是Page和Control兩個類。而事件的處理則在分離的代碼中實現。
模型(Model)
ASP.NET 不嚴格須要一個模型。開發者能夠自行選擇建立一個模型類,可是不少人選擇放棄這一步,直接把事件處理放在控制器裏處理任何計算、數據保存等等。但用模型來包含商業邏輯和數據訪問是可實現的。

ASP.NET MVC[編輯]

此外,在ASP.NET MVC中,通常狀況下模型一般搭配LINQ to SQL類(使用O/R Designer工具所製做而成的DBML文件)或ADO.NET實體數據模型(Entity Data Model,使用ADO.NET Entity Framework製做出的EDMX文件)來實做。

Windows Forms[編輯]

在WinForms中,這個針對視圖(View)和控制器(Controller)的模式已經很好的定義。而模型(Model)則留給開發者去設計。

視圖(View)
由Form或者Control類繼承來的一個類處理視圖的職責。在WinForm這個例子中視圖和控制器被編譯在同一個類中,這個和ASP.NET不一樣。
控制器(Controller)
控制器的職責被分區成三部分。事件(Event)的產生和傳輸是操做系統的一部分。在.Net框架中Form和Control類將不一樣的事件轉發給相應的事件處理器。而事件的處理則在分離的代碼中實現。
模型(Model)
就像ASP.NET同樣,WinForm不嚴格須要一個模型。開發者能夠自行選擇建立一個模型類,可是不少人選擇放棄這一步,直接把事件處理放在控制器裏處理任何計算、數據保存等等。也就是說用模型來包含商業邏輯和數據訪問。

Perl[編輯]

CatalystJifty是經過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[編輯]

PHP[編輯]

ActionScript 3[編輯]

參考文獻[編輯]

  1. ^ Reenskaug, Trygve. THING-MODEL-VIEW-EDITOR: an Example from a planningsystem.
  2. ^ Buschmann, Frank (1996) Pattern-Oriented Software Architecture.
  3. ^ ASP.NET MVC 概觀

外部連接[編輯]

相關文章
相關標籤/搜索