mvc的兩個變形
1 被動模型
當一個控制器以獨佔方式操作模型時,將使用被動模型。控制器將修改模型,然後通知視圖:模型已經更改,應該進行重新整理。此情況下的模型完全獨立於視圖和控制器,這意味著模型無法報告其狀態更改。HTTP協議是此方案的樣本。瀏覽器沒有從伺服器擷取非同步更新的簡單方法。瀏覽器顯示視圖並對使用者輸入作出響應,但是它不會檢測伺服器上的資料更改。僅當使用者顯式請求重新整理時,才會詢問伺服器是否發生了更改
被動模型的行為
2 主動模型
當模型更改狀態而不涉及控制器時,將使用主動模型。當其他資源正在更改資料並且更改必須反映在視圖中時,可能會發生這種情況。以股票報價機的顯示為例。您從外部源接收股票資料,並希望當股票資料更改時更新視圖(例如,報價機資料區和警告視窗)。因為只有模型檢測對其內部狀態的更改(在這些更改發生時),所以模型必須通知視圖重新整理顯示。
但是,使用MVC模式的一個目的是使模型獨立於視圖。如果模型必須將更改通知視圖,則會重新帶來您希望避免的依賴性。幸運的是,Observer模式[Gamma95]提供了這樣的機制:提醒其他對象注意狀態的更改,而不會導致對這些對象的依賴性。各個視圖實現Observer介面,並向模型註冊。模型將跟蹤由訂閱更改的所有觀察器組成的列表。當模型發生改變時,模型將會遍曆所有登入的觀察器,並將更改通知它們。此方法通常稱為“發布-訂閱”。模型從不需要有關任何視圖的特定資訊。實際上,在需要將模型更改通知控制器的情況下(例如,啟用或禁用菜單選項),控制器必須做的全部工作是實現Observer接口並訂閱模型更改。對於存在許多視圖的情況,定義多個主體是有意義的,其中每個主體都描述了特定類型的模型更改。然後,每個視圖都只能訂閱與視圖有關的更改類型。圖3顯示了使用Observer的主動MVC的結構,以及觀察器如何將模型與直接引用視圖隔離開來。
在主動模型中使用觀察器將模型與視圖分離
說明當模型發生改變時Observer如何通知視圖。可惜的是,在整合模組化語言(UML)順序圖表中,沒有好的方法來展示模型與視圖的分離,因為該圖表示的是對象的執行個體而不是類和介面。
圖4、主動模型的行為