प्रेक्षक पैटर्न पर प्रतिनिधि पैटर्न के क्या फायदे हैं?


9

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


4
"डेलिगेट पैटर्न" से आपका क्या अभिप्राय है? यदि आप .net के प्रतिनिधियों की तरह कुछ के बारे में बात कर रहे हैं, तो आपके पास जितने चाहें उतने ग्राहक हो सकते हैं।
कोडइन्चोस

संबंधित, हालांकि कोको पर अधिक ध्यान केंद्रित: NSNotificationCenter बनाम प्रतिनिधिमंडल (प्रोटोकॉल का उपयोग करके)?
मौविसील

जवाबों:


7

प्रति सेक्रेटरी पैटर्न नहीं है। मैं आपको डेलिगेशन पैटर्न मानने जा रहा हूं ।

जैसा कि मैं इसे समझता हूं, वे एक दूसरे के पूर्ण उल्टे हैं और विभिन्न प्रयोजनों के लिए उपयोग किए जाते हैं।

आम तौर पर, एक ऑब्जर्वर पैटर्न के साथ , किसी भी ऑब्जर्वर ऑब्जेक्ट की संख्या किसी दूसरी वस्तु पर एक घटना को सुनेगी और घटना पर कार्य करेगी। दूसरी वस्तु को इसके श्रोताओं का कोई ज्ञान नहीं है। यह सिर्फ उनके लिए कहता है।

एक प्रतिनिधि वस्तु दूसरी वस्तु को दी जाती है, जो प्रतिनिधि के सीधे तरीके को बुलाती है। और इसमें वह लाभ है जिसकी आप तलाश कर रहे हैं। एक संदेश को कई श्रोताओं को भेजने के बजाय, इसका एकल वस्तु (किसी निश्चित समय पर) पर पूर्ण नियंत्रण होता है। नियंत्रण का उलटा भी देखें ।


6

आप चीजों को गलत तरीके से देख रहे हैं। एक पर्यवेक्षक देखता है कि एक विशेष घटना होती है। यह इसे प्रभावित नहीं करता है, या इसका मालिक नहीं है। एक प्रतिनिधि एक विशेष घटना को संभालता है, और हैंडलर का स्वामित्व होता है, भले ही प्रतिनिधि घटना के लिए इंटरफ़ेस का मालिक हो।


1
एक प्रतिनिधि वास्तव में एक घटना के पर्यवेक्षक से ज्यादा कुछ नहीं है। एक प्रतिनिधि को कुछ भी "संभाल" करने की आवश्यकता नहीं है। यह सुरक्षित रूप से कुछ भी नहीं कर सकता है और घटना को ट्रिगर करने वाले उदाहरण को प्रभावित नहीं करेगा (या कम से कम नहीं करना चाहिए)।
मार्जन वेनमा

5
@MarjanVenema - अगर वस्तु एक नहीं है सौंपने वस्तु बी को घटना के लिए जिम्मेदारी, आप प्रतिनिधिमंडल पैटर्न उपयोग नहीं कर रहे: आप केवल एक पर्यवेक्षक के साथ पर्यवेक्षक पद्धति का उपयोग कर रहे हैं।
तेलस्टिन डे

हां, यही मैं सोच रहा था। मैं समझ गया कि घटना के हस्ताक्षर प्रकारों का उपयोग "OnWhatever" घटना के ग्राहक द्वारा किया जाएगा। जाहिर तौर पर C # में प्रतिनिधि एकल-ग्राहक नहीं हैं क्योंकि वे डेल्फी उदाहरण के लिए हैं।
मार्जन वेनम

@ मार्जन वेनेमा "एक प्रतिनिधि वास्तव में एक घटना के पर्यवेक्षक से ज्यादा कुछ नहीं है।" - यह निर्भर करता है कि आप किस भाषा में बात कर रहे हैं। ऑब्जेक्टिव सी में, कुछ डेलीगेट्स डेटा प्रदान करने के लिए जिम्मेदार होते हैं - जैसे डेटा डेलिगेट्स - और डेटा डेलीगेट को मिस करने वाली ऑब्जेक्ट में कोई डेटा मौजूद नहीं होता है। उन मामलों में, वहाँ प्रतिनिधिमंडल हो रहा है, बस किसी चीज को देखने के कार्य से अलग है।
occulus

1
@occulus: स्पष्टीकरण के लिए धन्यवाद। दया आती है कि भाषाएं शब्दावली पर सहमत नहीं हो सकती हैं ... भाषा में प्रोग्रामिंग के बारे में अज्ञेय के रूप में बात करना थोड़ा कठिन हो जाता है जब लोग एक ही शब्द के लिए विभिन्न चीजों को समझते हैं।
मार्जन वेनमा

4

यह कई ट्रेड-ऑफ का सवाल है।

व्यापार नापसंद:

  • लचीलापन (n> 1 प्रतिनिधि / पर्यवेक्षक होने के संदर्भ में)
  • एक संदेश भेजने की लागत
  • लचीलापन (प्रतिनिधि / पर्यवेक्षकों की अनुपलब्धता को बनाए रखने की क्षमता)
  • उपयोग में आसानी

प्रतिनिधि पैटर्न:

  • बहुत लचीला नहीं है - 1 से अधिक प्रतिनिधि जोड़ना संभव नहीं है ("बहु-प्रतिनिधि" के कुछ रूप का अर्थ है) (पर्यवेक्षक पैटर्न)
  • संदेश भेजना सस्ता है, O (1) - किसी अन्य फ़ंक्शन या विधि को कॉल करने के लिए समान लागत (कोई लुक-अप, संदेश कतार या अन्य बुनियादी ढांचे की आवश्यकता)
  • आम तौर पर लचीला नहीं - प्रतिनिधियों को उपस्थित होने और उनके काम का हिस्सा करने की उम्मीद की जाती है, अर्थात यदि प्रतिनिधि नहीं जाना जाता है तो प्रेषक विफल हो जाता है
  • आसान करने के लिए आसान, लागू करने के लिए आसान है

पर्यवेक्षक पैटर्न:

  • बहुत लचीला - n> 1 पर्यवेक्षकों को जोड़ना डिजाइन द्वारा अपेक्षित है
  • एक संदेश भेजने में पर्यवेक्षकों की संख्या से निहित लागत होती है, O (n), यानी n पर्यवेक्षक n समय और संदेश लेते हैं (कम से कम एक भोली कार्यान्वयन में)
  • आमतौर पर लचीला - पर्यवेक्षकों को आम तौर पर प्रेषक के हिस्से पर कोई काम करने की उम्मीद नहीं होती है। यदि पर्यवेक्षक अप्रभावित न हो तो भी, यह है
  • विशेष रूप से पर्यवेक्षकों को संदेश पर प्रतिक्रिया करने की उम्मीद है, जो आदेश के रूप में जटिल हो सकता है?

1

प्रतिनिधि पैटर्न, जैसा कि मैं आपको समझता हूं, अन्य भाषाओं में ईवेंट हैंडलर तंत्र के रूप में जाना जाता है, उदाहरण के लिए डेल्फी। जैसा कि यह केवल एक बड़े प्रतिबंध के साथ पर्यवेक्षक पैटर्न का कार्यान्वयन है: एक समय में केवल एक श्रोता।

घटना संचालकों या प्रतिनिधियों का नुकसान स्पष्ट है: केवल एक पर्यवेक्षक।

लाभ इतना स्पष्ट नहीं है: प्रदर्शन। एक पर्यवेक्षक पैटर्न के साथ आप कई पर्यवेक्षकों को जोड़ सकते हैं। जब एक घटना होती है कि पर्यवेक्षकों को इसके बारे में सूचित करने की आवश्यकता होती है, तो आपको पर्यवेक्षकों की गणना करने और प्रत्येक को एक अधिसूचना भेजने की आवश्यकता होगी। यह किसी भी देखे गए उदाहरण को जल्दी से काट सकता है, खासकर जब अधिसूचना की आवश्यकता वाली घटनाओं की संख्या महत्वपूर्ण है।


है ना? C # डेलीगेट केवल एक चर प्रकार (उदाहरण के लिए, int (*my_int_f)(int)C में) के रूप में एक विधि का हस्ताक्षर है । मैंने हमेशा सोचा है कि उन्होंने इसे स्ट्रक्चर / एनम की तरह काम करके समझना आसान बना दिया है। एक घटना श्रोताओं के लचीले सरणी के लिए एक हुक है, एक एकल प्रतिनिधि हस्ताक्षर का उपयोग करते हुए। आप एक घटना के बिना ऐसा कर सकते हैं (यही कारण है कि मैं ओपी का अर्थ है डेलिगेशन पैटर्न, जो बहुत अलग है), लेकिन भाषा आपके लिए इसे आसान बना रही है।
प्रध।

हम्म। सी # में अभी तक अच्छी तरह से वाकिफ नहीं हैं। मुझे समझ में आया कि डेल्फी के उदाहरण के लिए "ऑनव्हाइट्वर" ईवेंट्स के रूप में इस्तेमाल किए जाने वाले इवेंट सिग्नेचर के बराबर डेलिगेट्स हैं। तो C # घटनाओं को कई श्रोताओं द्वारा सब्सक्राइब किया जा सकता है?
मार्जन वेंमा

सामान्य क्रिया <T> एक प्रतिनिधि है। इसका घटनाओं से कोई लेना-देना नहीं है, यह एक चर है जो चारों ओर से गुजरता है। और हाँ, कई श्रोता एक घटना को सुन सकते हैं।
पीडीआर 20

ठीक है धन्यवाद, आशा है कि मैं इसे सीधे रख सकता हूं ... :-) सी # संदर्भ निकाल लिया और घटना तंत्र पर अधिक ध्यान केंद्रित किया।
मार्जन वेनमा

1

यह एक पुरानी पोस्ट है, लेकिन मैं किसी भी तरह से झंकार करने जा रहा हूं क्योंकि अन्य उत्तर किसी भी पैटर्न के उपयोग के दौरान क्या हो रहा है, इसके साथ सौदा नहीं करते हैं, वे अभ्यास की तुलना में सिद्धांत के बारे में अधिक प्रतीत होते हैं।

कैसे प्रतिनिधिमंडल और प्रेक्षक काम करते हैं

प्रतिनिधिमंडल के साथ प्रतिनिधि जो वास्तव में किसी विशेष घटना का जवाब देने जा रहा है, उसी क्षण संभावित घटना का स्रोत बन जाता है। आप इस श्रोता को एक प्रेक्षक के रूप में सोच सकते थे । ऑब्जर्वर पैटर्न के मामले में पर्यवेक्षक चुनता है कि यह जब भी इसे पसंद करता है, तब इसका निरीक्षण करता है; जब यह प्रेक्षक बनाम प्रतिनिधिमंडल की बात आती है तो निर्भरताएं उलट जाती हैं। प्रेक्षक पैटर्न के साथ एक समाचार पत्र और पर्यवेक्षकों के रूप में ग्राहकों के बारे में सोचो। जब संबंध बनते हैं तो पर्यवेक्षक नियंत्रण में होते हैं। प्रतिनिधिमंडल एक कर्मचारी और एक नियोक्ता के बारे में सोचते हैं। नियोक्ता तब नियंत्रण में होता है जब संबंध बन जाता है और वास्तव में विशिष्ट घटनाओं का प्रभारी कौन होता है। आम तौर पर कर्मचारी उन कार्यों को नहीं चुन सकते हैं जिन पर वे काम कर रहे हैं ...

कुछ तर्क प्रतिनिधि के पास एक पर्यवेक्षक हो सकता है लेकिन मुझे लगता है कि दोनों के बीच वास्तविक अंतर यह है कि इवेंट हैंडलिंग कैसे सौंपा जाता है। आप एक घटना के लिए एक प्रतिनिधि रजिस्टर कभी नहीं देखेंगे। यह तब तक कभी भी इस घटना को नहीं जान पाएगा जब तक कि ऐसा न हो जाए और प्रतिनिधि इस पर एक सार्वजनिक तरीका कहता है।

प्रत्यायोजन लाभ

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

प्रत्यायोजन दोष

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

कब प्रतिनिधि चुनें?

जब आपको सुनिश्चित करने के लिए एक विशिष्ट पर्यवेक्षक (ओं) की आवश्यकता होती है और आपके पास बदलने का कोई कारण नहीं होता है जो अवलोकन कर रहा है तो प्रतिनिधिमंडल पैटर्न का कठोर डिजाइन फायदेमंद होगा।

उदाहरण के लिए, किसी विशिष्ट त्रुटि के लिए पॉप-अप बनाने के लिए आपको एक क्लास / ऑब्जेक्ट की आवश्यकता होती है। ऐसे कई कारण नहीं हैं कि रन-टाइम पर आपको स्विच करने की आवश्यकता होगी जो एक विशिष्ट त्रुटि को हैंडल कर रहा है ताकि "आउट-ऑफ मेमोरी" त्रुटि को एक इकाई के रूप में दर्शाया जाए। संभावित हैंडलर की एक सरणी बनाना और फिर उन हैंडलर को "आउट-ऑफ मेमरी" त्रुटि के लिए पंजीकृत करना बहुत मायने नहीं रखेगा; यह इस स्थिति में पर्यवेक्षक पैटर्न का उपयोग करने का एक उदाहरण होगा। रन-टाइम में आप यह बदलना चाहते हैं कि किन तरीकों से कॉल आती है या "डेलीगेट" को वेरिएबल इवेंट्स के लिए बुलाया जाता है, लेकिन रन-टाइम में किसी इवेंट के लिए किसी इवेंट हैंडलर को स्वैप करना सामान्य नहीं है।

यह असंभव नहीं है कि आप जैसे प्रेक्षक पैटर्न में प्रतिनिधियों को स्वैप कर सकते हैं, इसकी जटिल है। वास्तविक दुनिया में शायद आप ट्रैफ़िक पुलिस को स्वैप करना चाहते हैं इसलिए एक नया प्रतिनिधि ट्रैफ़िक संभाल रहा है। कोई यह तर्क दे सकता है कि एक बेहतर डिजाइन मूल प्रतिनिधि को एक पुलिस स्टेशन बना देगा और एक भी पुलिस अधिकारी नहीं, लेकिन मैं पचा ...

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