2013-08-16 38 views
1

當一個事件觸發時應該對焦點控件(而不是觸發該事件的控件)起作用,那麼如何在Model-GUI-調解員(MGM)模式?我懷疑這個問題也適用於密切相關的MVP pattern,如果你有多個模型。在Model-GUI-Mediator模式中委派事件(也可能是MVP?)

我標題爲「授權事件」,因爲我認爲事件源控制的中介必須將事件委託給所選控件(或其模型)的中介 - 但問題是,'如何?'

背景

的MGM圖案有點像MVP Passive View,不同之處在於必須爲每個控制(每形式,而不是一個演示者)一個單獨的「介體」。控件的事件全部由其中介處理,中介調用其特定模型的方法作爲響應。介體是模型的observer,並在模型更改時更新其控件。它特別適用於您的控件沒有數據綁定並且不想子類化的RAD環境。與被動視圖不同,它的優點是隻有很少的樣板代碼來連接事件。這裏有兩個更詳細的描述:

問題實施例

  1. 甲形式包含許多用於提供對多個模型的視圖控件對象。一次只能選擇其中一個視圖。 (假設你想要一些具體的東西,可以想象一個多文檔編輯器。)

  2. 用戶從菜單調用命令。這將調用特定菜單項的中介對象中的Execute方法。 (菜單項是一個控件,因此它有一個相應的介體。)

  3. 該命令應該對當前選定的控件執行操作。

  4. 因此,菜單項的介體需要找到屬於選定控件的介體並委託該操作,或者需要找到與所選控件的介體相關聯的模型並直接調用該介體。

但是,菜單項的介體如何找到選定的控制介體?

在米高梅,中介對象應該是獨立的,所以不知道其他中介對象。不允許控件知道任何有關模型的內容(保持明確的關注點分離)。控件只知道其中介是事件處理程序。

哈克解決方法

我想出到目前爲止是檢查所選擇的控制,這將是一個對象的方法指針,該控件的調停事件領域中的最佳。在Delphi中,我可以將它轉換爲TMethod並因此提取控件中介的對象指針。然後,我可以將其轉換爲中介的類型並調用所需的方法。

但是,這似乎嚴重依賴於一種語言功能(TMethod),並且還創建了介體類之間的依賴關係。

也許我是在錯誤的軌道上完全...

(PS可能有人比我更代表請創建一個「模型GUI的調解員」的標籤?謝謝。)

回答

2

以防萬一有人在未來看到這個問題,我找到了'官方'的答案。

在MGM(和被動視圖)中,該模型應該包含所有必要的狀態信息。因此,在這種情況下,應用程序模型會跟蹤哪個是重點控制。

在多文檔編輯器的示例中,您將擁有一個應用程序模型,該模型處理各種菜單命令並跟蹤哪個編輯器當前具有焦點。將工作委託給與重點編輯器對應的編輯器模型很容易。

(這實際上並不是我採用的解決方案,狀態信息已包含在GUI中,我不想在模型中複製它 - 它總是將笨重的信息保存在多個位置並具有引入不一致的極不可取的潛力。這也許是模式,如米高梅和被動視圖。不管怎樣,我與我的問題描述的「哈克」的解決方法去一個弱點。)


正如一個腳註,處理這種情況的另一種方式 - 控制處理許多功能並聲明你不想在模型中複製,但模型需要訪問的方式是在需要訪問所述功能/狀態時可以調用的模型中定義事件。使用事件可以保持模型中的中介依賴,這是MGM的基本要求和存在理由。

例如,如果控件能夠保存其內容,請在模型中定義一個OnSave事件,並讓中介掛鉤一個調用控件中保存功能的處理程序。模型的Save方法然後調用事件,並且控件負責實現,而模型不需要知道任何事情。