2010-12-14 16 views
5

Birbirleriyle iletişim kurması gereken derslerim var. Sorun şu ki eğer birini diğerini (bir çocuk ebeveyn ilişkisi) varsa, işler zorlaşır. Ya ebeveynin bir örneğini çocuğa geçirmeniz gerekir (bağımlılık enjeksiyonunu kullanıyorsanız önce hangisini yaratırsınız) veya delegeleri/etkinlikleri kullanabilirsiniz. Fakat ebeveynin çocuğun büyüdüğü olayı idare edebilmesi gerektiği gerçeğini zorlamak istiyorum. Bunu nasıl yapacağınızdan emin değilim. Ayrıca, etkinliğe birden fazla abone istemiyorum. Ebeveyn-çocuk ilişkisi sadece iki yönlü iletişim için yanlıştır. Ne yazık ki, nesnelerden birinin her zaman başladığını ve diğerinin de yanıt verdiği bir durum değildir. Ya başlayabilir ve diğeri cevap vermelidir.Sınıflar arasında iki yönlü iletişim için en iyi desen nedir?

Eksik olduğum başka bir desen var mı?

GÜNCELLEME: Üzgünüm, bunu açıklamak oldukça zor. Bir sınıfın başka bir sınıfa bir mesaj gönderdiğinde, yanıtı hemen beklemediğini eklemeyi unuttum. Yanıt eşzamansız olarak gelir, bu nedenle ya doğru yöntemi veya bir temsilci/etkinlik çağırmak için ebeveynin bir örneğine ihtiyacınız vardır. Maalesef aşağıdaki örnek sözde koddur. Umarım bu fikri elde etmek için yeterlidir. Arabulucu modeline bakmalı mıyım?

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

Çocuk hakkında farklı olan, burada etkinlikleri kullanmak istemediğiniz anlamına mı geliyor? –

+0

Bir çocuğun ve bir ebeveynin kod örneklerini ekleyebilir misiniz? – jgauffin

+0

Belki de ebeveynler ve çocuklar olarak atıfta bulunduğunuz gerçek nesneleri tanımlamanız size yardımcı olacaktır. Çocuğun ebeveyne bir ref ihtiyacı varsa, her zaman kötü değildir. TreeView, XmlNode gibi birçok durum vardır ve ayrıca bir Gözlemci kullanmak da çok uygun bir seçenek. Neden "Siz de olaya birden fazla abone istemiyorum" dediğinizden emin değilsiniz. Bunu açıklayabilir misiniz? –

cevap

2

Sorunuz biraz özet olduğundan iyi bir yanıt vermek biraz zor. Ancak, Mediator modelinden ne haber?

+0

Yeni Medya Oluşturucu düzeninde tökezledim. Şuna bir bakıyorum. :) – uriDium

1

Belki önyükleyici kullanan olmalıdır: Şimdi

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 ve B her ikisi birbirinden blissfully farkında değildir.

+0

Söz dizimini seviyorum! –

0

Udi Dahan tarafından Domain Events Pattern ve kod örneğine bakmak isteyebilirsiniz. Chad tarafından yayınlanan kod snippet'inde aynı temel ilkeye sahiptir. Martin Fowler da desen hakkında yazdı ve konu hakkında biraz daha fazla bilgi sağlar.

0

Bu bir örnektir, Arayüzler kullanılarak da yapılabilir.

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

Bunun nasıl işe yaradığını tam olarak bilmiyordum. Detaylandırır mısın? – uriDium

+0

Güncellemeye bakın (Kullanım). Her biri diğerinin DoSomethingUseful'unu (sizin amaçlarınız için değiştirdiğiniz) arayabilir ve iletişim kurabilir. – Aliostad

1

İletişim ayrıntılarını içeren bir ara nesne yapın ve hem A hem de B içine enjekte edin?

+0

Bu, aracı modeline benziyor. Henüz okumayı bitirmedim. Size bildireceğiz. – uriDium

+0

Evet, bunu işaretlediğiniz için teşekkürler.http://en.wikipedia.org/wiki/Mediator_pattern davanızı hemen hemen açıklıyor. – Grozz

+0

Yani, "arabulucu" ve "bootstrapper" temelde aynı? – Chad

İlgili konular