2010-12-14 4 views
5

私はお互いにコミュニケーションが必要なクラスを持っています。問題は、一方が他方(親の親の関係)を含むようにすると、物事が難しくなるということです。親のインスタンスを子に渡す必要があります(依存性注入を使用している場合は最初に作成します)か、代理人/イベントを使用できます。しかし、私は、親が子どもが育てるイベントに対処できなければならないという事実を強制したい。それをどうやって行うかについてはあまりよく分かりません。私はまた、イベントに複数の加入者を望んでいません。クラス間の双方向通信に最適なパターンは何ですか?

親子関係は、双方向通信では間違っていると感じます。残念ながら、オブジェクトの1つが常に始まり、もう1つが応答するケースではありません。いずれかが開始でき、もう一方は応答する必要があります。

もう1つのパターンがありますか?

更新日: 申し訳ありませんが、これは説明が難しいです。あるクラスが別のクラスにメッセージを送信したときに、即座にその応答を期待していないときに追加することを忘れました。レスポンスは非同期的に発生します。そのため、正しいメソッドを呼び出すために親のインスタンスが必要であるか、デリゲート/イベントが必要です。申し訳ありませんが、以下の例は疑似コードです。うまくいけば、アイデアを得るだけで十分です。私は仲介者のパターンを見なければならない。

public class Foo 
    { 
     public void SendMessageAToBar() 
     { 
      MessageA msg = new MessageA(); 
      Bar.ReceiveMessageAFromFoo(msg); 
     } 

     public void ReceiveMessageARespFromBar(MessageAResp msgResp) 
     { 
      //Got a response do something 
     } 

     public void ReceiveMessageBFromBar(MessageB msg) 
     { 
      //Do something msg 
      MessageBResp msgBResp = new MessageBResp(); 
      Bar.ReceiveMessageBRespFromFoo() 
     } 
    } 

    public class Bar 
    { 


     public void ReceiveMessageAFromFoo(MessageA msg) 
     { 
      //DO something. 
      MessageAResp resp = new MessageAResp(); 
      Foo.ReceiveMessageARespFromBar(resp); 
     } 

     public void SendMessageBToFoo() 
     { 
      MessageB msg = new MessageB(); 
      Foo.ReceiveMessageBFromBar(msg); 
     } 

     public void ReceiveMessageBRespFromFoo(MessageBResp msgResp) 
     { 
      //Got a response do something 
     } 
    } 
+0

ここでイベントを使用したくないということは、子供の違いは何ですか? –

+0

子と親のコード例を追加できますか? – jgauffin

+0

おそらく、あなたが実際にどのようなオブジェクトを親や子供として参照しているかを記述すると役に立ちます。子供が親を知っていれば必ずしも悪いとは限りません。 TreeView、XmlNodeなどの多くのケースがあり、Observerも非常に実行可能なオプションです。なぜあなたは「私もイベントに複数の加入者を望んでいない」と言っているのか分かりません。それについても説明できますか? –

答えて

2

あなたの質問は少し抽象的ですので、良い答えを提供するのは少し難しいです。 しかし、Mediatorパターンについてはどうですか?

+0

私はちょうどMediatorパターンを見つけました。私は今それを見ています。 :) – uriDium

1

たぶん、あなたは、ブートストラップを使用する必要があります今

class Main 
{ 
    void Main(...) 
    { 
     A a = new A(); 
     B b = new B(); 

     a.MessagePosted += (sender, messageArgs) => b.ReadMessage(messageArgs.Message); 
     b.MessagePosted += (sender, messageArgs) => a.ReadMessage(messageArgs.Message); 
    } 
} 

を、AとBの両方がお互いの穏やか気づいていません。

+0

シンタックスが大好き! –

0

Domain Events PatternとUdi Dahanのコードサンプルを参照してください。それはChadによってポストされたコードスニペットと同じ基本原則を持っています。 Martin Fowlerもパターンについて書かれていて、トピックに関するもう少しの情報を提供しています。

0

これは一例であり、インタフェースを使用して行うこともできます。

public abstract class Attachable 
{ 
    public void Attach(Attachable attachable) 
    { 
     Attached = attachable; 
     attachable.Attach(this); 
    } 

    public Attachable Attached { get; private set; } 
    public abstract void DoSomethingUseful(object argument); 
} 


public class A : Attachable 
{ 
    #region Overrides of Attachable 

    public override void DoSomethingUseful(object argument) 
    { 
     // do something useful 
    } 

    #endregion 
} 

public class B : Attachable 
{ 
    #region Overrides of Attachable 

    public override void DoSomethingUseful(object argument) 
    { 
     // do something useful 

    } 

    #endregion 
} 

// Usage 
A a = new A(); 
B b = new B(); 
a.Attach(b); 
+0

これはどのように動作するのか分かりません。あなたは精緻化できますか? – uriDium

+0

私の更新情報(使用法)を参照してください。それぞれは相手のDoSomethingUseful(あなたの目的に合わせて変更)を呼び出すことができ、彼らは通信することができます。 – Aliostad

1

通信の詳細を含む中間オブジェクトを作成し、それをAとBの両方に挿入しますか?

+0

それはメディエーターのパターンに似ているようです。それをまだ読み終えていない。お知らせします。 – uriDium

+0

はい、それを指摘してくれてありがとう。http://en.wikipedia.org/wiki/Mediator_patternでは、あなたのケースについてほとんど説明しています。 – Grozz

+0

"mediator"と "bootstrapper"は基本的に同じですか? – Chad

関連する問題