2010-12-14 4 views
5

Ich habe Klassen, die miteinander kommunizieren müssen. Das Problem ist, dass, wenn Sie eine andere (eine Kind-Eltern-Beziehung) enthalten, die Dinge schwierig werden. Sie müssen entweder eine Instanz des übergeordneten Elements an das untergeordnete Element übergeben (dann welches Sie zuerst erstellen, wenn Sie die Abhängigkeitsinjektion verwenden), oder Sie können Delegaten/Ereignisse verwenden. Aber ich möchte die Tatsache durchsetzen, dass der Elternteil in der Lage sein muss, mit dem Ereignis umzugehen, das das Kind auslöst. Nicht sicher, wie das geht. Ich möchte auch nicht mehrere Abonnenten für die Veranstaltung.Was ist das beste Muster für die Zwei-Wege-Kommunikation zwischen Klassen?

Die Eltern-Kind-Beziehung fühlt sich einfach falsch für Zwei-Wege-Kommunikation. Es ist leider nicht der Fall, dass eines der Objekte immer initiiert und das andere antwortet. Beide können initiieren und der andere sollte antworten.

Gibt es ein anderes Muster, das ich vermisse?

UPDATE: Sorry das ist ziemlich schwer zu erklären. Ich habe vergessen hinzuzufügen, dass wenn eine Klasse eine Nachricht an eine andere Klasse sendet, sie die Antwort nicht sofort erwartet. Die Antwort kommt asynchron, weshalb Sie entweder eine Instanz des übergeordneten Elements benötigen, um die richtige Methode oder einen Delegaten/ein Ereignis aufzurufen. Das folgende Beispiel ist Pseudocode. Hoffentlich ist es genug, um die Idee zu bekommen. Sollte ich mir das Mediatormuster ansehen?

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

Was ist anders an dem Kind, was bedeutet, dass Sie hier keine Ereignisse verwenden möchten? –

+0

Können Sie Codebeispiele für ein Kind und ein Elternelement hinzufügen? – jgauffin

+0

Vielleicht hilft es, wenn Sie beschreiben, welche Objekte Sie als Eltern und Kinder bezeichnen. Es ist nicht immer schlecht, wenn das Kind einen Verweis auf Eltern hat. Es gibt viele Fälle wie TreeView, XmlNode usw., und auch die Verwendung eines Observers ist eine sehr praktikable Option. Nicht sicher, warum Sie sagen: "Ich möchte auch nicht mehrere Abonnenten für die Veranstaltung". Kannst du das auch erklären? –

Antwort

2

Es ist ein bisschen schwierig, eine gute Antwort zu geben, da Ihre Frage ein bisschen abstrakt ist. Aber was ist mit dem Muster Mediator?

+0

Ich bin gerade über das Mediator Muster gestolpert. Ich schaue mir das jetzt an. :) – uriDium

1

Vielleicht sollten Sie eine Bootstrap-Programm verwenden:

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); 
    } 
} 

, nun sowohl A als auch B sind völlig ahnungslos voneinander.

+0

Liebe die Syntax! –

0

Sie könnten sich das Domain Events Pattern und Codebeispiel von Udi Dahan anschauen. Es hat das gleiche Grundprinzip zu dem Codeausschnitt, der von Tschad gepostet wird. Martin Fowler hat auch über das Muster geschrieben und liefert ein wenig mehr Informationen zum Thema.

0

Dies ist ein Beispiel, kann auch mit Schnittstellen erfolgen.

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

Nicht wirklich sicher, wie das funktionieren würde. Kannst du es ausarbeiten? – uriDium

+0

Siehe mein Update (Verwendung). Jeder kann den DoSomethingUseful des anderen nennen (den Sie für Ihren Zweck ändern) und er kann kommunizieren. – Aliostad

1

Erstellen Sie ein Zwischenobjekt, das Kommunikationsdetails enthält, und injizieren Sie beides in A und B?

+0

Das scheint dem Mediatormuster ähnlich zu sein. Habe es noch nicht fertig gelesen. Ich werde dich es wissen lassen. – uriDium

+0

Ja, vielen Dank, dass Sie darauf hingewiesen haben.http://en.wikipedia.org/wiki/Mediator_pattern beschreibt ziemlich genau Ihren Fall. – Grozz

+0

Also, sind "Mediator" und "Bootstrapper" grundsätzlich gleich? – Chad

Verwandte Themen