當一個事件觸發時應該對焦點控件(而不是觸發該事件的控件)起作用,那麼如何在Model-GUI-調解員(MGM)模式?我懷疑這個問題也適用於密切相關的MVP pattern,如果你有多個模型。在Model-GUI-Mediator模式中委派事件(也可能是MVP?)
我標題爲「授權事件」,因爲我認爲事件源控制的中介必須將事件委託給所選控件(或其模型)的中介 - 但問題是,'如何?'
背景
的MGM圖案有點像MVP Passive View,不同之處在於必須爲每個控制(每形式,而不是一個演示者)一個單獨的「介體」。控件的事件全部由其中介處理,中介調用其特定模型的方法作爲響應。介體是模型的observer,並在模型更改時更新其控件。它特別適用於您的控件沒有數據綁定並且不想子類化的RAD環境。與被動視圖不同,它的優點是隻有很少的樣板代碼來連接事件。這裏有兩個更詳細的描述:
問題實施例
甲形式包含許多用於提供對多個模型的視圖控件對象。一次只能選擇其中一個視圖。 (假設你想要一些具體的東西,可以想象一個多文檔編輯器。)
用戶從菜單調用命令。這將調用特定菜單項的中介對象中的Execute方法。 (菜單項是一個控件,因此它有一個相應的介體。)
該命令應該對當前選定的控件執行操作。
因此,菜單項的介體需要找到屬於選定控件的介體並委託該操作,或者需要找到與所選控件的介體相關聯的模型並直接調用該介體。
但是,菜單項的介體如何找到選定的控制介體?
在米高梅,中介對象應該是獨立的,所以不知道其他中介對象。不允許控件知道任何有關模型的內容(保持明確的關注點分離)。控件只知道其中介是事件處理程序。
哈克解決方法
我想出到目前爲止是檢查所選擇的控制,這將是一個對象的方法指針,該控件的調停事件領域中的最佳。在Delphi中,我可以將它轉換爲TMethod並因此提取控件中介的對象指針。然後,我可以將其轉換爲中介的類型並調用所需的方法。
但是,這似乎嚴重依賴於一種語言功能(TMethod),並且還創建了介體類之間的依賴關係。
也許我是在錯誤的軌道上完全...
(PS可能有人比我更代表請創建一個「模型GUI的調解員」的標籤?謝謝。)