有三個接口: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
在此先感謝。