
圖1展示了獨立桌面環(huán)境中的oMVC。圖中顯示了作為模型的組成部分的本地軟盤數(shù)據(jù)存儲。oMVC中控制器和視圖具有成對出現(xiàn)的關(guān)系,但是模型的改變并不在兩者間直接產(chǎn)生通信。控制器和視圖知道模型的狀態(tài),但是反之并非如此。
一旦模型從控制器獲取了變更通知,它并不直接通過調(diào)用去更新所涉及的視圖。在模型-視圖的關(guān)系中,變更通知的獲取是通過每個獨立的參與者之間的相互注冊實現(xiàn)。一旦一方發(fā)生了變更,就會生成一個事件,對方就會采取相應的動作作為響應。在圖1中,視圖是附屬于模型的,對模型進行觀察。一旦控制器觸發(fā)了模型變更事件,視圖必須去確保自身顯示也按需更新,以相應地反映出模型的狀態(tài)。更新模型的通知信號也可由視圖自身生成。這種視圖與模型之間的 觀察 (或訂閱)和通知關(guān)系,有助于模型和視圖間的解耦,使得多個視圖可隸屬于同一模型,進而可提供不同的表示。
在圖1中值得注意的是,控制器并非直接地改變視圖。在Smalltalk社區(qū)及其它后續(xù)的桌面GUI應用庫中,通常將視圖和控制器看成一對耦合的對象。視圖使用具有特定控制器類型的實例實現(xiàn)預期的響應。為創(chuàng)建所期望的行為,控制器還可以在不同情景中 策略性地 、動態(tài)地切換類型。這樣的視圖-控制器對可以嵌套于 復合 層次結(jié)構(gòu)中(如圖2A所示)。在該層次結(jié)構(gòu)中的父輩之間、子女之間及父子之間,視圖-控制器組件都可以進行交互和通信。很多情況下,層次結(jié)構(gòu)中的每個獨立視圖-控制器的子女組件僅處理部分的模型對象。此外,從oMVC組合的角度看,模型也可以使用層次結(jié)構(gòu)的形式進行組織,這樣 MVC三元組作為一個整體 構(gòu)成 層次結(jié)構(gòu)中的父子關(guān)系 ,如圖2B所示。
(點擊放大圖像)

圖2左圖是oMVC的復合表示,右圖是 PAC (顯示-抽象-控制,Presentation-Abstraction-Control)的表示。
總而言之,oMVC設(shè)計范例是由一系列的 GoF設(shè)計模式 所組成,尤其是其中包括了觀察者模式 、 策略模式 和 復合模式 。在早期的桌面應用庫中,oMVC域架構(gòu)和模式的設(shè)計意圖得以保持,即模型組件由應用域?qū)ο蠛蛿?shù)據(jù)存儲所組成,其中存儲多是本地的或是受限的。在oMVC三元組類的行為中,應用域行為的維護和廣播起著核心的作用。oMVC的一個關(guān)鍵假設(shè)是模型的穩(wěn)定性,該假設(shè)在上世紀七十和八十年代的桌面應用情景中顯然是正確的。但是在WMVC領(lǐng)域,模型時常發(fā)生改變通常是一種常態(tài)。直至近些年,向用戶實時廣播變更(類似于oMVC所實現(xiàn)的)所需的技術(shù)基礎(chǔ)才得以實現(xiàn)。
WMVC的分類
具有諷刺意味的是,雖然直到上世紀九十年代,尤其是在Win95出現(xiàn)之后的年代,桌面計算機開始進入普通百姓家并得到普及,但是傳統(tǒng)的桌面應用卻因為因特網(wǎng)互聯(lián)的Web應用開始統(tǒng)治了業(yè)界而逐漸退居幕后。不同于安裝并于運行于終端用戶計算機上的桌面應用,Web應用是宿主于遠離用戶的服務器上,創(chuàng)建了客戶-服務器的關(guān)系。在本文的其后內(nèi)容中,我們將瀏覽器(browser)和客戶(client)這兩個概念互換使用。根據(jù)瀏覽器和服務器相對于WMVC三元組對象的部署位置和執(zhí)行方式的不同,可將WMVC明確地分組為:
服務器端WMVC (Server-side WMVC,sWMVC):所有WMVC的組件位于服務器上,并在服務器上執(zhí)行。
雙重WMVC(Dual WMVC,dWMVC):WMVC組件分布于瀏覽器和服務器之間。通信可由客戶或者服務器端發(fā)起。
點對點WMVC(Peer-to-Peer WMVC,pWMVC):這種架構(gòu)中沒有集中式服務器。所有WMVC組件位于客戶端,在客戶端執(zhí)行。pWMVC可具有自己的沙箱SoR。
服務器端WMV(sWMVC)
在sWMVC模型中,用戶使用瀏覽器作為瘦客戶,通過無狀態(tài)的請求-響應HTTP協(xié)議訪問應用(如圖3所示)??蛻粝蚍掌靼l(fā)送HTTP請求或輸入內(nèi)容,接收并顯示整個更新的Web頁面(或是其它的文檔)。一旦頁面被加載以后,各頁面組件間就很少有交互了,頁面成為靜止的。
在這種瘦客戶-服務器范式的sWMVC架構(gòu)中,應用SoR版本庫外部化為一種集中式環(huán)境。它與應用服務器內(nèi)存中的域?qū)ο笫窍嗷シ蛛x的。服務器和數(shù)據(jù)版本庫都是遠離用戶瀏覽器部署的(如圖3所示)。SoR存儲常常是由一個或多個關(guān)系數(shù)據(jù)庫這樣的數(shù)據(jù)源所組成。鑒于數(shù)據(jù)已經(jīng)外部化了,帶外進程或不同的用戶都可對數(shù)據(jù)進行更新。數(shù)據(jù)的變更只會從控制器流向模型(參見圖3);當SoR中數(shù)據(jù)被不同的用戶或系統(tǒng)改變時,并不向應用服務器發(fā)送入站數(shù)據(jù)變更通知。不同于oMVC,模型及其所關(guān)聯(lián)的視圖間不再有任何的直接聯(lián)系和必要的同步。由于視圖不再反映模型的狀態(tài),這就需要用戶手動地發(fā)起新的HTTP請求去同步和刷新視圖。因此sWMC中的“s”,也可指代這種WMVC范例的靜態(tài)(static)或是陳舊(stale)的本質(zhì)特性。