MVC(溫習深入)

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

[編輯] 參考資料

  1. ^ 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”

轉載于:https://www.cnblogs.com/cuihongyu3503319/archive/2009/11/12/1601548.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276329.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276329.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276329.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面試官問:能否模擬實現JS的new操作符(高頻考點)

可以點擊上方的話題JS基礎系列,查看往期文章這篇文章寫于2018年11月05日,new模擬實現,Object.create是面試高頻考點,之前發布在掘金有近2萬人閱讀,現在發布到公眾號聲明原創。1. 前言這是面試官問系列的第一篇&#xf…

Linux環境下設置IPDNSGateway

轉載鏈接:http://www.myhack58.com/Article/sort099/sort0102/2011/29291.htm 在Linux中不管你是做服務器還是只是平常使用,上網肯定都是最重要和不可缺少的一個因素之一,所以就涉及到它的ip gateway dns等network配置和使用。但是設置Linux…

跟我一起學WCF(2)——利用.NET Remoting技術開發分布式應用

一、引言 上一篇博文分享了消息隊列(MSMQ)技術來實現分布式應用,在這篇博文繼續分享下.NET平臺下另一種分布式技術——.NET Remoting。 二、.NET Remoting 介紹 2.1 .NET Remoting簡介 .NET REmoting與MSMQ不同,它不支持離線可得&…

二叉樹的建立與遍歷_51、二叉樹遍歷-重建二叉樹JZ4

題目描述輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹并返回。思路回顧三種經典的遍歷&…

越來越覺得現在的工作很枯燥

很不想這么說,但又不想欺騙自己,真的是很枯燥,不過這種感覺早在一年在在上一間公司時就很強烈的有過這種感覺了,只不過現在是又一次有感觸罷了。話說說我這種性質的工作枯燥很多人都講過,如果哪個人說不枯燥估計腦袋進…

推薦關注這7個高質量的前端公眾號

拓寬眼界,增加深度,在閱讀的世界里,我們往往能找到不一樣的態度,提升朋友圈質量,從關注這幾個公眾號開始。輕掃一下二維碼就行了,你可以試試,肯定會有意外收獲。大遷世界 簡介:前端小…

MySQL 實用語句集合

MySQL 實用語句集合 參考鏈接[用戶]:http://blog.csdn.net/dmtnewtons_blog/article/details/9136339 參考鏈接[屬性]:http://stackoverflow.com/questions/15821532/get-current-auto-increment-value-for-any-table 參考鏈接[索引]:htt…

python對象序列化或持久化的方法

http://blog.csdn.net/chen_lovelotus/article/details/7233293 一、Python對象持久化方法 目前為止,據我所知,在python中對象持久化有以下幾種方法: 1. 使用(dbhash/bsddb, dbm, gdbm, dumbdbm 等)以及它們的"管理器"(…

Windows Live Writer 在win2003 的安裝方法

下載Windows Live Writer整體安裝包,最好是離線安裝包 2.在xp系統上安裝 3.查找C:\Program Files\Common Files\Windows Live\.cache目錄 .cache目錄是隱藏的,目錄下面就是各個安裝文件的msi安裝包 4.拷貝相應的msi文件,到Windows 2003安裝就…

decode 大于比較 小于_6 燃氣輸配系統6.3 壓力不大于1.6Mpa的室外燃氣管道城鎮燃氣設計規范 GB500282006(2020修訂版)...

6.3 壓力不大于1.6Mpa的室外燃氣管道6.3.1中壓和低壓燃氣管道宜采用聚乙烯管、機械接口球墨鑄鐵管、鋼管或鋼骨架聚乙烯塑料復合管,并應符合下列要求: 1 聚乙烯燃氣管應符合現行的國家標準《燃氣用埋地聚乙烯管材》GB15558.1 和《燃氣用埋地聚乙烯管件…

若川的2017年度總結,一如既往

可以點擊上方的標簽若川的故事、年度總結,查看往期文章有讀者反饋說看我年度總結系列比我源碼系列更有啟發。所以打算把2016-2018的年度總結發布到公眾號聲明原創,希望對大家有所啟發。(雖然我的每一年都過得非常普通...)若川的20…

MIME協議及源郵件格式分析

轉載鏈接:http://wenku.baidu.com/view/7246de671ed9ad51f01df277.html 電子郵件也許是一個Internet上的流行最廣泛的應用。也是我們現在的大多數網絡辦公流程的基礎。各種郵件服務器很多,但都大都遵循以1982年出版的RFC822--《ARPA網絡文本信息格式標準(STANDARD F…

溝通:用故事產生共鳴

《溝通:用故事產生共鳴》(全彩) 基本信息作者: Nancy Duarte(南希.杜瓦特)譯者: 馮海洋出版社:電子工業出版社ISBN:9787121195914上架時間:2013-4-1出版日期:2013 年3月開本:12開頁碼&#xff1…

合工大五套卷_2020合工大超越數一五套卷第一套感想

合工大的卷子確實不錯,題目給我的感覺是題干包裝的看起來就很難,但是寫起來還是一樣的套路。計算上要難一些,需要細心點選擇題:1.可去間斷點的定義和泰勒公式2.這個題我用排除法寫的,可微的話連續和偏導存在都成立了,然…

DotNet關鍵知識點——WPF篇(一)(范德成編輯批注版)

1. Journal 的使用 Journal 用于在 XAML 瀏覽器應用程序(XBAP)中維護歷史訪問頁。刪除前一訪問頁只需調當前 NavigationService 對象的 RemoveBackEntry() 即可;而增加一個訪問頁則復雜得多: 1) 實現一個 CustomContentState 的派…

若川的2018年度總結,平淡無奇

可以點擊上方的標簽若川的故事、年度總結,查看往期文章偷偷告訴你,公眾號內回復【報告】,可以獲取你自己的github 2020 年度報告昨晚在我的6個微信群里都發了紅包,以這樣的方式跨過了2020年。運營公眾號真的挺難的,比如…

Simple TCP Server Client Socket C

轉載鏈接&#xff1a;http://blog.163.com/caipeipei_love126/blog/static/2596603220101118433940/ tcpserver.c #include<stdlib.h> #include<stdio.h> #include<errno.h> #include<string.h> #include<netdb.h> #include<sys/types.h>…

基于dnn的車牌識別_自然場景中文文字識別,身份證火車票都能識別

圖像處理中OCR(Optical Character Recognition光學字符識別)場景非常多&#xff0c;也給大家的工作生活帶來了很多便利&#xff0c;比如車牌識別就能管理停車場車輛的出入&#xff0c;快遞時只需給一個帶有快遞信息的圖就能自動解析上傳發件信息和收件信息&#xff0c;再比如我…

年末的大廠前端面試總結(20屆雙非二本)-終入字節

關注若川視野, 回復"pdf" 領取資料&#xff0c;回復"1"&#xff0c;可加群長期交流學習自我介紹雙非二本,軟件工程,自學前端,今年畢業。喜歡編程,古風,日語和英語。常以冷月心之名混跡前端江湖,也曾在混跡網文圈時用冷月心做筆名簽約掌閱,作品《清起風云》…