我有一個設計問題,我無法找到一個乾淨漂亮的解決方案。我正在用PHP開發,但我相信這可能發生在任何語言。我的基本問題是我有兩個對象間有一定的循環相互依賴性。這意味着我有一個類(稱爲F)實現Facade模式,該模式包含一個對象(類B),它本身需要創建一個類A的對象。類A的構造函數本身需要創建一個外觀F =>我具有對象的循環相互依賴性。我相信我無法解決循環的相互依賴性(對象基本上用一個使用狀態模式的循環實現一個有限狀態機),所以我正在尋找一個乾淨的解決方案。我想出了兩種可能的解決方案我自己,但我不認爲要麼是特別優雅:創建相互依賴的對象
有A類實現setFacade(F $ facace)方法,並從構造刪除整個門面,只是設置後A和門面被創建。類A的對象不能在沒有外觀的情況下工作,所以這實際上會創建一個類A的對象,它在調用setFacade之前不能執行任何操作,它會減少封裝並允許在對象運行時替換外觀,我也不會不喜歡。
實現類似Promise的東西,它傳遞給A,而不是立面,它將在創建後立即解析立面。我不想介紹這個額外的間接層,特別是因爲我沒有很好的地方來解決這個承諾,而不是處理A內部的buisness邏輯的方法,這會產生可怕的錯誤和(更重要的)b)需要我檢查承諾是否已經解決,或者是否需要現在解決它,只要調用了buisness邏輯。這只是我眼中可怕的設計。
因此,如果任何人都可以想出更好的解決方案或可以支持我的一個可能的解決方案和一個很好的論證我真的很高興。
它似乎違反了GRASP模式。您可能在爲課程分配責任時犯了一些錯誤。 – Kangkan 2010-08-07 17:44:02
這當然是可能的。正如我所說,我基本上實現了一個有限狀態機。我有一個保存當前狀態的控制器(上下文)。只要控制器收到請求,它就會將其委託給該狀態,然後狀態將自行返回(如果它是循環狀態傳輸)或其他狀態(如果傳輸)。這個「其他國家」必須爲國家所知。如果兩個狀態以循環方式轉移到另一個狀態,這在FSM中是絕對常見的,那麼他們需要知道每個其他情況。 Bam - 循環依賴。 – 2010-08-07 18:02:29