2010-12-14 11 views
5

मेरे पास कक्षाएं हैं जिन्हें एक दूसरे के साथ संवाद करने की आवश्यकता है। समस्या यह है कि यदि आप एक को दूसरे (एक बच्चे के माता-पिता संबंध) बनाते हैं तो चीजें मुश्किल हो जाती हैं। आपको या तो माता-पिता के बच्चे में एक उदाहरण पारित करने की आवश्यकता है, (यदि आप निर्भरता इंजेक्शन का उपयोग कर रहे हैं तो आप पहले कौन सी बनाते हैं) या आप प्रतिनिधियों/घटनाओं का उपयोग कर सकते हैं। लेकिन मैं इस तथ्य को लागू करना चाहता हूं कि माता-पिता उस घटना को संभालने में सक्षम होना चाहिए जो बच्चे उठाता है। यह भी सुनिश्चित नहीं है कि यह कैसे करें। मैं भी इस कार्यक्रम के लिए कई ग्राहकों को नहीं चाहता।कक्षाओं के बीच दो तरह के संचार के लिए सबसे अच्छा पैटर्न क्या है?

अभिभावक-बाल संबंध दो तरह के संचार के लिए गलत लगता है। दुर्भाग्य से यह कोई मामला नहीं है कि वस्तुओं में से एक हमेशा शुरू होता है और दूसरा जवाब देता है। या तो शुरू कर सकते हैं और दूसरे को जवाब देना चाहिए।

क्या कोई अन्य पैटर्न है जिसे मैं याद कर रहा हूं?

अद्यतन: क्षमा करें यह समझाने में काफी मुश्किल है। मैं यह जोड़ना भूल गया कि जब एक वर्ग किसी अन्य वर्ग को संदेश भेजता है तो वह तुरंत प्रतिक्रिया की उम्मीद नहीं कर रहा है। प्रतिक्रिया असीमित रूप से आती है, यही कारण है कि आपको या तो सही विधि या प्रतिनिधि/घटना को कॉल करने के लिए माता-पिता के उदाहरण की आवश्यकता होती है। क्षमा करें नीचे दिया गया उदाहरण छद्म कोड है। उम्मीद है कि यह विचार पाने के लिए पर्याप्त है। क्या मुझे मध्यस्थ पैटर्न देखना चाहिए।

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 आदि जैसे कई मामले हैं, और एक पर्यवेक्षक का भी उपयोग करना बहुत व्यवहार्य विकल्प है। निश्चित नहीं है कि आप क्यों कह रहे हैं "मैं भी कई ग्राहकों को घटना के लिए नहीं चाहता"। क्या आप इसे समझा सकते हैं? –

उत्तर

2

एक अच्छा जवाब प्रदान करना थोड़ा मुश्किल है, क्योंकि आपका प्रश्न थोड़ा सा सार है। लेकिन, Mediator पैटर्न के बारे में क्या?

+0

मैंने मध्यस्थ पैटर्न पर बस ठोकर खाई है। मैं अब उस पर एक नज़र डाल रहा हूँ। :) – uriDium

1

शायद तुम एक bootstrapper का उपयोग करना चाहिए: अब

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

, दोनों ए और बी एक दूसरे के आनंदपूर्वक अनजान हैं।

+0

सिंटैक्स से प्यार करें! –

0

आप Domain Events Pattern और उडी दहन द्वारा कोड नमूना देखना चाहेंगे। चाड द्वारा पोस्ट किए गए कोड स्निपेट के लिए यह वही बुनियादी सिद्धांत है। 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

एक मध्यवर्ती वस्तु बनाएं जिसमें संचार विवरण शामिल है और इसे ए और बी दोनों में इंजेक्ट करें?

+0

यह मध्यस्थ पैटर्न के समान लगता है। अभी तक इसे पढ़ना समाप्त नहीं हुआ है। तुम्हे बता दूंगा। – uriDium

+0

हां, इसे इंगित करने के लिए धन्यवाद।http://en.wikipedia.org/wiki/Mediator_pattern आपके मामले का बहुत अधिक वर्णन करता है। – Grozz

+0

तो, मूल रूप से "मध्यस्थ" और "बूटस्ट्रैपर" हैं? – Chad

संबंधित मुद्दे