2015-10-23 44 views
1

我有三個類,比如ABC。基本思想是,類A將消息傳遞給B,並等待,根據該消息B將消息傳遞給C。最後,在C處理該消息之後,它通知A繼續其功能。現在這形成了圈子。爲了減少依賴關係,我使類ABC通信,即C有一個方法將A的消息傳遞給B。這種方法的問題是它暴露了BA的接口,我不想發生這種情況。我的問題是,解決這個問題的最好方法是什麼?解決java中的循環依賴關係

爲了給出更多的上下文,我正在研究語音識別系統。我從2個班級開始,一個獲得識別結果(A)另一個來處理結果。後來我不得不打破這一處理結果兩個階級,一個做一些預處理(B),如檢查結果如何好,另一個處理結果(C

回答

1

控制反轉

class Controller { 
    A a; 
    B b; 
    C c; 

    private void injectControll() { 
     a.registerListener(b); // a.passTo(b); 
     b.registerListener(c); 
     c.registerListener(a); 
    } 
+0

如果我使用單例類,這會工作嗎? –

+0

類似於'A.getInstance()。registerListener(B.getInstance());'或其他。當然。 –

+0

這三者現在都依賴於消息抽象,例如聽衆或觀察者,這三者都實現。這也是間接的。 – Fuhrmanator

1

如果AC運行在相同的JVM中,您可以在消息中添加一個方法,以便B可以調用該方法,而無需直接訪問A

您還可以查看訪客模式或消息總線。

1

您可以在服務/類之間發送相應的消息。但是在收到消息之前不要阻止你的應用程序。使用回調對象作爲通信機制。

  1. A向B發送消息並傳遞一個回叫參數。 A會繼續等待。

  2. B向C發送消息並傳遞一個回叫參數。 B將繼續等待。

  3. C處理消息並通過回調向A發送消息。

  4. A將處理回叫通知。