2009-12-18 40 views
0

Im在設計問題上掙扎了一下。我在c#中製作了一個非常簡單的gui系統。該代碼旨在可重用,所以我在這裏尋找最靈活的解決方案。我提出的解決方案似乎都有其缺點。設計事件驅動通信的問題

爲了簡單起見,假設有三個類:控制器,按鈕和客戶端代碼。客戶端代碼是使用gui系統的代碼。它創建控制器並在其上調用Update()。控制器創建一堆按鈕實例並在其上調用Update()。按鈕繪製自己並檢查鼠標點擊。

現在的問題是如何得到一個按鈕被點擊的客戶端代碼的事實?

選項1:將GetButton(字符串名稱)添加到控制器類。客戶端代碼然後可以訂閱按鈕類中定義的事件=> GetButton(「but」)。MouseUpEvent + = MouseUpHandler;這樣做的缺點是這暴露了Button.Update(),它應該只能被控制器使用。

選項2:有控制器訂閱所有按鈕和客戶端代碼訂閱控制器。這裏的缺點是更多的解析客戶端代碼中的代碼,因爲現在所有的事件都通過控制器進行傳輸,所以客戶端必須檢查哪個按鈕發送了每個事件。我喜歡在初始化階段設置事件流,如選項1中所示。

選項3:爲每個事件添加訂閱/取消訂閱方法到控制器(SubscribeMouseUp(string buttonName,GUIDelegate del)等)。缺點是控制器API快速增長。

所以現在我傾向於選擇1,但GetButton返回一個接口(IClientButton也許),它只聲明事件,從而隱藏客戶端的Update(),但林不知道這是如何接口應該是用過的。

任何洞察力是讚賞。 巴斯

回答

0

想必這是一個問題,因爲Update()是公開的?

假設你已經安排你的按鈕和控制器到同一個命名空間將使用internal保護滿足您的需求?

0

接口可用於這種方式,INotifyPropertyChanged的是具有1個項目是一個事件的interace。

有關使用RoutedEvents什麼?

0

還有第四種,也許更受歡迎的選項。

有一個調度器作爲註冊/註銷的中心位置。所有事件接收方都會向調度員註冊回調。所有事件生成器都將其事件發送給調度員。

它保持API清潔,並有助於解開對象引用。

0

在您的控制器中,添加兩個事件 - ButtonCreatedButtonDestroyed

public event EventHandler<ClientButtonEventArgs> ButtonCreated; 
public event EventHandler<ClientButtonEventArgs> ButtonDestroyed; 

ClientButtonEventArgs僅僅是在你IClientButton接口的EventArgs包裝。

讓您的客戶端代碼訂閱這兩個事件。當控制器創建一個新按鈕時,讓它觸發ButtonCreated事件。客戶端代碼可以在收到事件通知時訂閱必要的Button事件。同樣,控制器將根據需要觸發ButtonDestroyed事件,允許客戶端代碼取消訂閱Button的事件。

以這種方式,整個序列是事件驅動的。客戶端代碼反應創建和銷燬一個按鈕,它看起來像是你在做什麼。