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(),但林不知道這是如何接口應該是用過的。
任何洞察力是讚賞。 巴斯