प्रेक्षक पैटर्न

सॉफ्टवेर प्रारूप और सॉफ्टवेयर रचना में प्रेक्षक प्रारूप एक सॉफ्टवेयर प्रारूप है जिसमें उद्देश्य उन्मुख कार्यक्रम में एक उद्देश्य कंप्यूटर विज्ञान होता है जिसे कम्प्यूटर विषय कहा जाता है जिसमें कम्प्यूटर अपने आश्रितों की एक सूची रखता है जिन्हें पर्यवेक्षक कहा जाता है और उन्हें स्वचालित रूप से सूचित करता है कि कोई भी घटना की गणना करने पर उनकी किसी विधि को कंप्यूटर विज्ञान के नाम से जाना जाता है।

इसका उपयोग अधिकतर घटना संचालित कार्यक्रम में घटना संचालित सॉफ्टवेयर में वितरित घटना से निपटना घटना सम्भालने की प्रणाली को लागू किया जाता है ऐसी प्रणालियों में विषय को आमतौर पर घटनाओं की धारा या घटनाओं को धारा स्रोत का नाम दिया जाता है जबकि पर्यवेक्षकों को घटनाओं का सिंक कहा जाता है धारा नामकरण एक भौतिक उत्पन्न की ओर संकेत करता है जिसमें पर्यवेक्षक भौतिक रूप से अलग हो जाते हैं और विषय/धारा स्रोत से उत्सर्जित घटनाओं पर उनका कोई नियंत्रण नहीं होता है यह प्रारूप इस प्रकार किसी भी प्रक्रिया के लिए उपयुक्त है जिसके द्वारा डेटा कुछ इनपुट से आता है जो बूटिंग पर CPU के लिए उपलब्ध नहीं है बल्कि इसके जगह यादृच्छिक रूप से यह आता है जैसे HTTP अनुरोध GPIO डेटा बाह्य उपकरणों से उपयोगकर्ता इनपुट वितरित डेटाबेस और ब्लॉकचेन, आदि।

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

अवलोकन
प्रेक्षक बनावट प्रारूप 23 प्रसिद्ध बनावट प्रारूप के बीच सूचीबद्ध एक व्यवहारिक प्रारूप है गैंग ऑफ़ फोर बनावट प्रारूप जो लचीले और पुन: प्रयोज्य प्रेक्षक उन्मुख सॉफ्टवेयर को प्रारूप में बदलने के लिए आवर्ती प्रारूप चुनौतियों का समाधान करते हैं ऐसा प्रेक्षक प्रदान करते हैं जिन्हें लागू करना, बदलना, परीक्षण करना और पुन: उपयोग करना आसान होता है।

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

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

प्रेक्षक बनावट प्रारूप किस समाधान का वर्णन करता है

 * परिभाषित करना वस्तु और प्रेक्षक वस्तुएं
 * जब कोई विषय स्थिति बदलता है तो सभी पंजीकृत पर्यवेक्षकों को स्वचालित रूप से और संभवतः अतुल्यकालिक रूप से सूचित और नवीनीकरण किया जाता है।

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

मजबूत बनाम कमजोर संदर्भ
पर्यवेक्षक पैटर्न स्मृति रिसाव का कारण बन सकता है जिसे व्यपगत श्रोता समस्या के रूप में जाना जाता है बुनियादी कार्यान्वयन में इसे निपटान चिन्ह की तरह स्पष्ट पंजीकरण और स्पष्ट डी पंजीकरण दोनों की आवश्यकता होती है क्योंकि विषय पर्यवेक्षकों को संदर्भ में रखता है तथा उन्हें जीवित रखता है यदि विषय पर्यवेक्षकों के प्रति कमजोर संदर्भ रखता है तो इसे रोका जा सकता है।

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

संबंधित पैटर्न में प्रकाशित-सदस्यता, मध्यस्थ पैटर्न और सिंगलटन पैटर्न शामिल हैं।

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

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

एकीकृत मॉडलिंग भाषा अनुक्रम आरेख रनटाइम इंटरैक्शन दिखाता है:  ई> और   ऑब्जेक्ट कॉल करते हैं   पर   खुद को पंजीकृत करने के लिए. यह मानते हुए कि स्थिति  परिवर्तन,   कॉल   अपने आप पर. कॉल  पंजीकृत पर   और  ऑब्जेक्ट, जो परिवर्तित डेटा का अनुरोध करते हैं  से   उनकी स्थिति को अद्यतन (सिंक्रनाइज़) करने के लिए।

उदाहरण
जबकि लाइब्रेरी कक्षाएं और  मौजूद हैं, उन्हें जावा 9 में बहिष्कृत कर दिया गया है क्योंकि लागू किया गया मॉडल काफी सीमित था।

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

सी++
यह C++11 कार्यान्वयन है. 
 * 1) शामिल <कार्यात्मक>
 * 2) शामिल करें
 * 3) शामिल <सूची>

कक्षा विषय; //ऑब्जर्वर में उपयोग के लिए अग्रेषित घोषणा

कक्षा पर्यवेक्षक { जनता: स्पष्ट पर्यवेक्षक(विषय एवं विषय); आभासी ~पर्यवेक्षक; ऑब्जर्वर(कॉन्स्ट ऑब्जर्वर&)=डिलीट; // तीन का नियम प्रेक्षक एवं ऑपरेटर=(स्थिरांक पर्यवेक्षक&) = हटाएं;

आभासी शून्य अद्यतन(विषय&s) स्थिरांक = 0; निजी: // डिस्ट्रक्टर में अलग करने के लिए विषय वस्तु का संदर्भ विषयवस्तु; };

//विषय घटना निर्माण के लिए आधार वर्ग है कक्षा विषय { जनता: RefObserver = std::reference_wrapper का उपयोग करना; // सभी संलग्न पर्यवेक्षकों को सूचित करें शून्य सूचना {       (const auto& x: पर्यवेक्षकों) के लिए {           x.get.update(*this); }   }    // एक पर्यवेक्षक जोड़ें शून्य संलग्न (स्थिरांक पर्यवेक्षक और पर्यवेक्षक) {       पर्यवेक्षक.push_front(पर्यवेक्षक); }   // एक पर्यवेक्षक को हटा दें शून्य पृथक्करण (पर्यवेक्षक एवं प्रेक्षक) {       पर्यवेक्षकों.remove_if( [&पर्यवेक्षक ](स्थिरांक RefObserver& obj)        {            वापसी &obj.get==&पर्यवेक्षक;        }); } निजी: एसटीडी::सूचीपर्यवेक्षक; };

पर्यवेक्षक::पर्यवेक्षक(विषय और विषय): विषय(विषय) {   विषय.संलग्न करें(*यह); }

प्रेक्षक::~पर्यवेक्षक {   विषय.डिटैच(*यह); }

// उपयोग का उदाहरण क्लास कंक्रीट ऑब्जर्वर: सार्वजनिक ऑब्जर्वर { जनता: कंक्रीटऑब्जर्वर(विषय एवं विषय) : पर्यवेक्षक(विषय) {} // अधिसूचना पाएं शून्य अद्यतन(विषय&) स्थिरांक ओवरराइड {       std::cout << एक सूचना मिली << std::endl; } };

मुख्य प्रवेश बिंदु {   विषय सीएस; कंक्रीटऑब्जर्वर co1(cs); कंक्रीटऑब्जर्वर CO2(cs); सीएस.सूचित करें; }  प्रोग्राम आउटपुट इस प्रकार है

 एक सूचना मिली एक सूचना मिली 

डेल्फ़ी
उत्पादन  श्रोता पति को सूचना मिली: कोई दरवाज़ा खटखटा रहा है श्रोता पत्नी को सूचना मिली: कोई दरवाज़ा खटखटा रहा है 

पायथन
Python_(प्रोग्रामिंग_भाषा) में एक समान उदाहरण:

जावास्क्रिप्ट
जावास्क्रिप्ट को बहिष्कृत कर दिया गया है Object.observe फ़ंक्शन जो पर्यवेक्षक पैटर्न का अधिक सटीक कार्यान्वयन था। यह प्रेक्षित वस्तु में परिवर्तन होने पर घटनाओं को सक्रिय कर देगा। पदावनत किये बिना Object.observe फ़ंक्शन, पैटर्न को अधिक स्पष्ट कोड के साथ कार्यान्वित किया जा सकता है:

यह भी देखें

 * निहित आह्वान
 * क्लाइंट-सर्वर मॉडल
 * पर्यवेक्षक पैटर्न का उपयोग अक्सर इकाई-घटक-सिस्टम पैटर्न में किया जाता है