2017-05-03 82 views
0

我有兩個類 - 類A和B.什麼設計模式是適用於我的方案

類A從上層接收的消息,並且我想這個消息轉發到B級的處理時間。當B處理這個消息時,它會更新自己的狀態併產生一些事件。 A類中有一個方法可以將這些事件發送到上層。

我不能在類A中更改sendEventToUpperLayer()。那麼如何將類B中生成的事件返回到類A?我應該丟棄B類,並將B類的邏輯移入A類?

public class A { 
    private B b; 
    private void processMessage(Message) { 
     b.processMessage(Message); 
    } 

    private void sendEventToUpperLayer() { 
    } 
} 

public class B { 
    public void processMessage(Message) { 
     // It will generate a few events and update b's state. 
     // All these events and b's state will need to use class A's method of sendEventToUpperLayer() to forward to upper layer. 
    } 
} 
+0

老實說不清楚你在做什麼。我可以冒險提出一個建議,看看[觀察者模式](https://en.wikipedia.org/wiki/Observer_pattern) – freedev

+0

感謝freedev。實際上觀察者模式是我想到的第一種模式。但觀察者模式只涉及可觀察的通知觀察者。就我而言,我認爲我的類A是可觀察的,而類B是觀察者,因爲類A將通過使用b.processMessage(Message)通知類B。但我的問題是,B類如何使用A類的方法,這是反向通知? –

+0

你也可以嘗試與委託,傳遞給包含'B'一個lambda,一個方法或對象回調容器'A'。 – freedev

回答

0

class A實現發送郵件的界面,一個聲明sendEventToUpperLayer或這樣的更genericly命名版本(那麼你的實現委託給現有sendEventToUpperLayer方法)。

然後通過class Aclass BprocessMessage方法作爲參數,該類B接受作爲命名接口(不直接作爲A類)。然後

B類可以調用類A的必要方法需要多次,並且由於它是一個接口並不直接需要在A類和可以適當地單元測試等

如果合適的話,可以如果B類實例始終引用同一個A實例作爲它的回調,則還將類A(通過前面提到的接口)傳遞給類B的構造函數中的類B。

+0

謝謝Trevor。你建議的方式比我想通過A級的實例要好得多。實際上,我也在考慮第二種解決方案,放棄B類並將B類的邏輯轉移到A類中。那麼對於這兩種解決方案,您如何建議優點/缺點? –

+0

@ Lazysheep.wang取決於類是如何耦合的。如果B類不會存在於具有A類的外部,那麼可以將它們的邏輯組合起來,或者將B類實現爲A類的內部類。一般來說,如果將邏輯分割爲適當的單獨類,它通常會感覺更清晰,即使你必須將類A傳遞給類B,確實取決於具體情況的細節(例如,類B是否具有數據/狀態,還是隻有方法等)。 –