2017-05-03 3 views
0

のために私は2つのクラスに適したどのようなデザインパターンを持っている - クラスAとB私のシナリオ

をクラスAは、上位レイヤからのメッセージを受け取り、私が処理するために、クラスBにこのメッセージを転送します。 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

あなたがしようとしていることは正直にはっきりしていません。私は、[Observer Pattern](https://en.wikipedia.org/wiki/Observer_pattern)を見てください。 – freedev

+0

Thanks freedev。実際にオブザーバーパターンが私の心に入ってくる最初のパターンです。しかし、観察者パターンは観察可能な観察者にしか関知しない。私の場合、クラスAは観測可能であるとみなし、クラスAはb.processMessage(Message)を使用してクラスBに通知するので、オブザーバとしてクラスBとみなします。しかし、私の質問は、クラスBはクラスAのメソッドを使用することができます。これは逆の通知ですか? –

+0

コンテナ 'A'をコールバックするのに便利な' B'ラムダ、メソッド、またはオブジェクトに渡して、委譲を試みることもできます。 – freedev

答えて

0

class Aがメッセージを送信するためのインタフェース、sendEventToUpperLayerかな(既存のsendEventToUpperLayer方法に、あなたの実装代表者)のバージョンをという名前の、より総称的に宣言する1を実装してもらいます。

class Aclass BprocessMessageメソッドをパラメータとして渡します。クラスBは名前付きインターフェイスとして受け入れます(直接クラスAではありません)。

クラスBは、その後、必要な回数だけ、クラスAの必要なメソッドを呼び出すことができ、それが適切な場合など

を直接クラスAを必要とせず、ユニットが適切にテストすることができるインターフェイスであることから、次のことができクラスBのインスタンスが常にそのコールバックのための同じクラスAのインスタンスを参照している場合は、クラスBのコンストラクタのクラスBにクラスAを(前述のインタフェースを介して)渡します。

+0

Trevorに感謝します。あなたの提案された方法は、私がクラスAのインスタンスを渡すことについて考えたよりもはるかに優れています。実際には、クラスBを破棄してクラスBのロジックをクラスAに移動するという第2の解決策も考えています。どのようにして両方のソリューションの長所/短所を提案しますか? –

+0

@ Lazysheep.wangクラスがどのように結合されているかによって異なります。クラスBがクラスAの外に決して存在しない場合、それらのロジックを組み合わせることも、クラスBをクラスAの内部クラスとして実装することもできます。一般的に言えば、ロジックを別々のクラスに適切に分割すれば、あなたがクラスBにクラスAを渡さなければならない場合であっても、実際のケースの詳細に依存します(例えば、クラスBはデータ/状態を持っているか、メソッドだけですかなど)。 –

関連する問題