मध्यस्थ बनाम प्रेक्षक?


27

क्या कोई मुझे एक Observerऔर एक के बीच के अंतर पर एक विहित जवाब प्रदान कर सकता है Mediator, और एक सारांश जब आपको दूसरे पर एक पैटर्न का उपयोग करना चाहिए?

मुझे इस बात की अनिश्चितता है कि किस तरह की स्थिति के लिए किस तरह की आवश्यकता होगी Observerऔर किस तरह की आवश्यकता होगीMediator


मैं 7 वर्षों के बाद इस बारे में आपके अपने विचार जानना चाहूंगा?
निंग

जवाबों:


19

मूल पुस्तक में जो ऑब्जर्वर और मध्यस्थ, डिजाइन पैटर्न, पुन: प्रयोज्य ऑब्जेक्ट-ओरिएंटेड सॉफ्टवेयर के तत्वों को कहते हैं, यह कहता है कि ऑब्जर्वर पैटर्न का उपयोग करके मध्यस्थ पैटर्न को लागू किया जा सकता है। हालाँकि इसे सहकर्मियों (मोटे तौर पर ऑब्जर्वर पैटर्न के विषय के बराबर) के द्वारा भी लागू किया जा सकता है, या तो एक मध्यस्थ वर्ग या मध्यस्थ मध्यस्थ का संदर्भ है।

ऐसे कई मामले हैं जब आप पर्यवेक्षक पैटर्न का उपयोग करना चाहते हैं, वे कुंजी यह है कि ऑब्जेक्ट पर यह नहीं पता होना चाहिए कि अन्य ऑब्जेक्ट क्या स्थिति देख रहे हैं।

मध्यस्थ थोड़ा अधिक विशिष्ट है, यह कक्षाओं को सीधे संवाद करने से रोकता है, लेकिन इसके बजाय मध्यस्थ के माध्यम से। यह एकल जवाबदेही सिद्धांत की मदद करता है जिससे संचार को केवल उस हैंडल करने वाले वर्ग में उतार दिया जा सके।

एक क्लासिक मध्यस्थ उदाहरण एक जीयूआई में है, जहां भोले दृष्टिकोण एक बटन क्लिक घटना पर कोड के लिए नेतृत्व कर सकते हैं "अगर फू पैनल अक्षम है और बार पैनल में" कृपया तारीख दर्ज करें "कहते हुए एक लेबल है, तो सर्वर को कॉल न करें, अन्यथा आगे बढ़ें ", जहां मध्यस्थ पैटर्न के साथ यह कह सकता है" मैं सिर्फ एक बटन हूं और फू पैनल और बार पैनल पर लेबल के बारे में जानने वाला कोई सांसारिक व्यवसाय नहीं है, इसलिए मैं सर्वर को कॉल करने पर अपने मध्यस्थ से पूछूंगा अभी ठीक है। "

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


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

@ राचेल - मैं पर्यवेक्षक का वर्णन करूँगा जैसा आपने किया। मध्यस्थ शायद वैश्विक नहीं है, लेकिन सेट में सभी वस्तुओं के लिए जाना जाता है जो एक दूसरे के साथ संवाद कर रहे थे, लेकिन अब मध्यस्थ के माध्यम से जाना। जब तक मध्यस्थ को एक पर्यवेक्षक के रूप में लागू नहीं किया जाता है, उस स्थिति में यह उन सभी वस्तुओं के बारे में जानता है (कम से कम उनके अवलोकन योग्य इंटरफ़ेस के माध्यम से, शायद सीधे) लेकिन उन्हें इसके बारे में पता नहीं है।
Psr

9

ऑब्जर्वर पैटर्न अच्छी तरह से काम करता है जब पर्यवेक्षकों के बीच कोई समन्वय आवश्यक नहीं है और अवलोकन संबंध एक तरह से चला जाता है।

उदाहरण के लिए, ऑब्जेक्ट B और C ऑब्जेक्ट ए को देखते हैं। जब ऑब्जेक्ट ए फायर ईवेंट X होता है, तब ऑब्जेक्ट B को विधि Y () और ऑब्जेक्ट C को Z () विधि निष्पादित करनी चाहिए। यदि तरीके BY () और CZ () पूरी तरह से स्वतंत्र हैं और किसी समन्वय की आवश्यकता नहीं है, तो आगे बढ़ें और पर्यवेक्षक पैटर्न का उपयोग करें।

दूसरी ओर, यदि BY () को CZ () से पहले निष्पादित किया जाना चाहिए, तो आप मध्यस्थ पैटर्न का उपयोग करना चाहेंगे जहां मध्यस्थ इस समन्वय को अंजाम देता है। इस परिदृश्य में, मध्यस्थ एम ऑब्जेक्ट ए का अवलोकन करेगा और वस्तुओं बी और सी के संदर्भ होगा। जब एक आग घटना एक्स, एम घटना को संभालेगा और निर्धारित क्रम में BY () और CZ () को कॉल करेगा।

इसके अलावा, यदि ऑब्जेक्ट A, B और C को एक दूसरे को देखने की आवश्यकता है, तो मध्यस्थ के रूप में मध्यस्थ का उपयोग करके इन वस्तुओं को हटाने और स्पेगेटी कोड से बचने के लिए एक लंबा रास्ता तय करना होगा।


5

Observerपैटर्न जब एक कार्रवाई एक वर्ग (मनाया वर्ग) पर लिए गए प्रयोग किया जाता है एक और कक्षा में एक प्रतिक्रिया (अवलोकन वर्ग) का उत्पादन करने की जरूरत है, लेकिन यह अवांछनीय है के लिए मनाया वर्ग को देख वर्ग के लिए युग्मित किया जाना है। यह एक बहुत ही सामान्य पैटर्न है। SAX XML पार्सर एक अच्छा उदाहरण हो सकता है। SAX पार्सर का उपयोग करने के लिए, एक क्लाइंट ContentHandlerपार्सर ऑपरेशन को "निरीक्षण" करने के लिए इंटरफ़ेस को लागू करता है। जैसा कि पार्सर XML दस्तावेज़ के तत्वों का सामना करता है, यह के तरीकों को कॉल करता है ContentHandler। पार्सर क्लाइंट कोड को लागू करने में सक्षम है, लेकिन पार्सर क्लाइंट कोड के लिए युग्मित नहीं है।

Mediatorपैटर्न वस्तुओं का एक सेट के उपयोग का एक पैटर्न के एक कैप्सूलीकरण है। क्लाइंट कोड केवल मध्यस्थ के लिए युग्मित है, बजाय कई अन्य वर्गों के लिए युग्मित होने के। यह एकत्रीकरण के समान है, सिवाय आच्छादित वस्तुओं के जीवनकाल के मध्यस्थ के जीवनकाल से स्वतंत्र है।


1

सरल शब्दों में (कि मैं इसे याद करने के लिए उपयोग करता हूं):

ऑब्जर्वर: जब एक ऑब्जेक्ट दूसरे में राज्य परिवर्तन की सूचना देना चाहता हो (सख्ती से बोलना, घटनाओं का उपयोग करना ऑब्जर्वर का उपयोग करना)

मध्यस्थ को समझने के लिए, मुझे यह आसान लगता है जब आप पहले विचार करते हैं: मुखौटा अलग-अलग वर्गों (कभी-कभी पूरे उपसमूह) की कार्यक्षमता को एकत्रित करता है और एक ही इंटरफ़ेस में उस कार्यक्षमता को प्रदान करता है।

मध्यस्थ: चेहरे के रूप में भी, सिवाय इसके कि यह कुल वर्गों की कार्यक्षमता को जोड़ती है नई कार्यक्षमता का उत्पादन करने के लिए । (अच्छी व्याख्या यहाँ )

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.