模式的基本思想是資料,顯示和處理相分離。模型(Model)負責資料管理,視圖(View)負責資料顯示,控制器(Controller)負責業務邏輯和響應政策。
從MVC的形成過程來看,最初隻有模型和視圖兩個元素。模型封裝了資料并提供操作接口,視圖用來表現資料和接收使用者請求。模型是獨立的,而視圖依賴于模型:從模型擷取資料進行顯示;向模型發送使用者請求,并根據傳回結果重新整理自己。
需要用多個視圖表現同一模型時,情況發生了變化:一個視圖修改資料以後,不但本身要重新整理,其他所有視圖也要重新整理。如果由該視圖通知其他視圖,它就需要知道其他所有視圖,由于每個視圖都可能發出修改,每個視圖都要知道其他所有視圖,這種關聯過于複雜,不但難以維護,而且不便于增加新的視圖。如果讓模型通知所有視圖更新,可能會影響模型的獨立性。用觀察者(Observer)模式可以解決上述沖突,進而實作:由模型通知視圖,而模型不依賴于具體的視圖,具體視圖之間互相獨立。
視圖是使用者請求的接收者,但不宜作為請求的處理者。因為界面是易變的,如果業務代碼和界面代碼放在一起,頻繁的界面修改可能會破壞比較穩定的業務代碼。将業務邏輯分離出來,由一個控制器負責,就是為了避免這種幹擾。
模型,視圖和控制器的基本協作關系如下圖

模型在狀态變化的時候,直接通知所有視圖,視圖向模型查詢狀态資料,然後重新整理自身。當使用者發出操作時,視圖把消息發給控制器,控制器按照業務邏輯進行處理,需要查詢或更新資料時,控制器會調用模型。下面是一個更詳細的示意圖
同樣的資料,可以有不同的顯示和進行各種處理。顯示僅僅是表現資料,而處理是根據使用者請求改變資料的過程,不但包含業務邏輯,也要提供響應政策。響應政策由控制器負責,視圖可以使用不同的控制器提供不同的響應方式,這是政策(Strategy)模式的應用。
此外,MVC還允許視圖嵌套,通過使用組合(Composite)模式,一緻地處理組合視圖和普通視圖。
用多個視圖表現一個模型,在視圖不變的情況下改變響應政策,允許視圖嵌套,這是MVC的三個主要特性。在内部結構上,MVC的主要關系是由觀察者模式,政策模式群組合模式給出的。由觀察者模式确定的模型視圖關系是其中最為重要的。
MVC模式有許多變體。前述結構中,由模型通知視圖重新整理,稱為主動MVC;如果由控制器更新模型以後通知視圖,稱為被動MVC結構。在許多應用中,沒有明顯的控制器角色,也沒有視圖嵌套。可見根據實際需要,構成MVC的三個模式上都可能出現變化。Web浏覽器就是被動MVC結構的一個執行個體。
“浏覽器是一個互動程式,從概念上講,它是由一組客戶、一組解釋器與一個管理它們的控制器所組成。控制器形成了浏覽器的中心部件,它解釋滑鼠點選與鍵盤輸入,并且調用其他元件來執行使用者指定的操作。例如,當使用者鍵入一個URL或者點選一個超文本引用時,控制器調用一個客戶從所需文檔所在的遠端伺服器上取回該文檔,并且調用解釋器向使用者顯示該文檔。每個浏覽器必須包含一個HTML解釋器來顯示文檔,其他解釋器是可選的。HTML解釋器的輸入由符合HTML文法的文檔所組成,輸出由位于使用者顯示器上的格式版本文檔所組成。解釋器通過将HTML規則轉換成适合使用者顯示硬體的指令來處理版面細節。HTML解釋器一個最重要的功能是包含可選項。解釋器必須存儲關于顯示器上位置之間關系的資訊和HTML文檔中被瞄定的項。當使用者用滑鼠標明了一個項,浏覽器通過目前的光标位置和存儲的位置資訊來決定哪個項被使用者標明。”(參考資料5)
- 文檔
- 視圖
- 視圖架構視窗
- 文檔模闆