2012-06-25 44 views
0

有三個接口:IServer, IComponent, IClient.它們之間的連接是通過事件完成的。我寫Server, Component, Client分別實現它們的類。區分方法的兩個入口點

組件之間可能存在依賴關係。也就是說,如果組件y依賴於x,則調用x.Start() - 調用所有後代Start()。依賴關係通過IComponent中的AddDependency()方法創建。 (請參閱下面的源代碼鏈接)。

客戶端無法直接看到組件,並使用事件通過服務器與它們進行交互。只有在服務器上註冊了所有組件和客戶端之後才能完成此操作。

問題: Start()有2個入口點的方法: 1:Start()援引Server事件處理程序(第1'成分) 2:Start()Component事件處理程序調用(後代被啓動)。

對於1:如果組件的狀態已經爲Running - 拋出IllegalOperationException 對於2:如果子孫已經是Running - 什麼也不做。

如何區分1和2?

限制條件: - 修改界面 - 禁止 - 向下投影 - 禁止。

我看到的一個解決方案是放置靜態標誌,該標誌正好落在Start()之後,用於調用第1個組件。然而,這種方法破壞了封裝,因爲每次在某些「外部」方法中(例如在服務器的處理程序中)標誌都應該重新初始化,所以外部方法必須看到比接口中指定的更多的東西。而且這隱含地暗示了Start()僅由服務器調用,這在問題中沒有保證。

還有什麼想法?

來源: http://rghost.net/38868270

在此先感謝。

回答

1

據我可以看到你的問題歸結爲「我有一個接口,它只是一個啓動方法,我怎麼知道它是否已經開始沒有添加任何東西」。

答案讓我感到你不能。不管它如何被調用,你所能做的總是拋出IllegalOperationException。然後在你的組件中,你可以捕獲IllegalOperationException並傳遞(不做任何事)。在你的服務器方法中,你讓它冒泡到更相關的位置。

就我所能想到的這是您給出限制的唯一選擇。

注:我沒有看任何代碼,因爲我不想從一個不值得信任的來源下載一個帶有9個文件的壓縮文件(對您沒有任何影響)。