2010-12-14 9 views
5

Mam zajęcia, które muszą komunikować się ze sobą. Problem polega na tym, że jeśli jeden z nich zawiera drugi (relacja potomka dziecka), to sprawy stają się trudne. Musisz przekazać instancję elementu nadrzędnego do elementu potomnego (wtedy należy go najpierw utworzyć, jeśli używa się wtyczki zależności) lub można użyć delegatów/zdarzeń. Ale chcę egzekwować fakt, że rodzic musi być w stanie poradzić sobie z wydarzeniem, które dziecko rodzi. Nie jestem pewien, jak to zrobić. Nie chcę też wielu subskrybentów wydarzenia.Jaki jest najlepszy wzór dla dwukierunkowej komunikacji między zajęciami?

Relacja rodzic-dziecko jest po prostu niewłaściwa w przypadku komunikacji dwukierunkowej. Niestety nie jest tak, że jeden z obiektów zawsze inicjuje, a drugi odpowiada. Albo może zainicjować, a drugi odpowiedzieć.

Czy istnieje inny wzór, którego mi brakuje?

AKTUALIZACJA: Niestety jest to dość trudne do wyjaśnienia. Zapomniałem dodać, że gdy jedna klasa wysyła wiadomość do innej klasy, nie oczekuje natychmiastowej odpowiedzi. Odpowiedź przychodzi asynchronicznie, dlatego potrzebujesz instancji rodzica, aby wywołać właściwą metodę lub delegata/zdarzenie. Przykro nam, że poniższy przykład to pseudo kod. Mam nadzieję, że wystarczy, aby uzyskać pomysł. Czy powinienem spojrzeć na wzór mediatora?

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

Co różni dziecko, co oznacza, że ​​nie chcesz tutaj korzystać z wydarzeń? –

+0

Czy możesz dodać przykłady kodu dziecka i rodzica? – jgauffin

+0

Może to pomoże, jeśli opiszecie, jakie rzeczywiste obiekty nazywacie rodzicami i dziećmi. Nie zawsze jest źle, jeśli dziecko ma prawo do rodzicielstwa. Istnieje wiele przypadków, takich jak TreeView, XmlNode itp., A także korzystanie z Observer jest również bardzo opłacalną opcją. Nie wiesz, dlaczego mówisz "Nie chcę też wielu subskrybentów wydarzenia". Czy możesz to wyjaśnić? –

Odpowiedz

2

Trudno jest podać dobrą odpowiedź, ponieważ twoje pytanie jest nieco abstrakcyjne. Ale co z wzorcem Mediator?

+0

Właśnie natknąłem się na wzór Mediatora. Teraz patrzę na to. :) – uriDium

1

Może należy użyć programu inicjującego:

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

Teraz zarówno A i B są w błogiej nieświadomości siebie.

+0

Uwielbiam składnię! –

0

Możesz chcieć spojrzeć na Domain Events Pattern i próbkę kodu przez Udi Dahan. Ma on tę samą podstawową zasadę do fragmentu kodu opublikowanego przez Chad. Martin Fowler również napisał o wzorze i dostarcza trochę więcej informacji na ten temat.

0

To jest przykład, można to również zrobić za pomocą interfejsów.

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

Nie jestem pewien, jak to by działało. Czy możesz rozwinąć? – uriDium

+0

Zobacz moją aktualizację (użycie). Każdy może zadzwonić do DoSomethingUseful drugiej osoby (którą zmieniasz dla swojego celu) i mogą się komunikować. – Aliostad

1

Złóż pośredni obiekt, który zawiera dane komunikacyjne i wstrzyknąć go zarówno w A i B?

+0

To wydaje się podobne do wzorca mediatora. Jeszcze nie skończyłem czytać. Poinformuje Cię. – uriDium

+0

Tak, dziękuję za wskazanie tego.http://en.wikipedia.org/wiki/Mediator_pattern dość opisuje twoją sprawę. – Grozz

+0

Czy zatem "mediator" i "bootstrapper" są w zasadzie takie same? – Chad

Powiązane problemy