डिजाइन पैटर्न - ऑब्जर्वर पैटर्न के लिए एक त्वरित गाइड।

ऑब्जर्वर पैटर्न एक बहुत ही आमतौर पर इस्तेमाल किया जाने वाला पैटर्न है। वास्तव में, यह इतना सामान्य है कि कई प्रोग्रामिंग भाषाओं / पुस्तकालयों में मानकीकृत किया जा रहा है। जावा में, यह injava.util.Observer (जावा 9 में पदावनत) मौजूद है। पायथन में यह एपिप इंस्टॉल पैटर्न-ऑब्जर्वर के रूप में करीब है। C ++ में, हम कभी-कभी बूस्ट लाइब्रेरी का उपयोग कर सकते हैं, अधिक सटीक रूप से #include । हालांकि, यह व्यापक रूप से उद्योग में कस्टम-मेड समाधान के रूप में उपयोग किया जाता है। इसे सही ढंग से उपयोग करने और इसकी जटिलता को समझने में सक्षम होने के लिए, हमें इसमें गोता लगाने और इसे खोजने की आवश्यकता है।

ऑब्जर्वर पैटर्न को व्यवहार डिजाइन पैटर्न के बीच वर्गीकृत किया गया है। व्यवहार डिजाइन पैटर्न सबसे विशेष रूप से कक्षाओं / वस्तुओं के बीच संचार से संबंधित हैं। [डिज़ाइन पैटर्न द्वारा सरल रूप से समझाया गया]

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

चरण 1 - कीवर्ड

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

  1. विषय: इसे सूचनाओं का रक्षक माना जाता है, डेटा का या व्यावसायिक तर्क का।
  2. रजिस्टर / अटैच: ऑब्जर्वर खुद को इस विषय पर पंजीकृत करते हैं क्योंकि वे चाहते हैं कि बदलाव होने पर उन्हें सूचित किया जाए।
  3. घटना: घटनाएँ विषय में एक ट्रिगर के रूप में कार्य करती हैं जैसे कि सभी पर्यवेक्षकों को सूचित किया जाता है।
  4. सूचित करें: कार्यान्वयन के आधार पर, विषय पर्यवेक्षकों को जानकारी को "धक्का" दे सकता है, या, पर्यवेक्षकों को "पुल" हो सकता है यदि उन्हें विषय से जानकारी की आवश्यकता हो।
  5. अद्यतन: पर्यवेक्षक अन्य पर्यवेक्षकों से अपने राज्य को स्वतंत्र रूप से अपडेट करते हैं, हालांकि ट्रिगर स्थिति के आधार पर उनका राज्य बदल सकता है।

चरण 2 - आरेख

इसे थोड़ा सरल बनाने के लिए इस डिज़ाइन को विभिन्न वर्गों में विभाजित करें।

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

चरण 3 - उदाहरण के लिए कोड

मैं अपनी git रिपॉजिटरी "Andreas Poyias" या नीचे दिए गए स्निपेट से कक्षा द्वारा कोड क्लास को कॉपी करने का सुझाव दूंगा (नीचे दिए गए क्रम में) और इसे किसी भी उपलब्ध सी + + संपादकों जैसे c ++ शेल, jdoodle, onlineGDB और रन में पेस्ट करूंगा यह आउटपुट का निरीक्षण करने के लिए है। तो नीचे टिप्पणी या विवरण पढ़ें। अपना समय ले लो, इसे अच्छी तरह से पढ़ना (इसका मतलब है कि एक मिनट, कम नहीं और अधिक नहीं)।

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

  • खेल विषय है और समर्थक पर्यवेक्षक हैं।
  • सभी पर्यवेक्षक इस विषय से जुड़े / पंजीकृत हैं और उन्हें सूचित किया जाता है जब उनकी फुटबॉल टीम स्कोर (ट्रिगर-इवेंट उनकी टीम स्कोर) हो।
  • पर्यवेक्षक प्राप्त अधिसूचना के आधार पर अपने व्यवहार को अपडेट करते हैं।

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

# किंकर्तव्यविमूढ़ 
#include <वेक्टर>
नेमस्पेस एसटीडी का उपयोग करना;
वर्ग विषय {
    वेक्टर <क्लास ऑब्जर्वर *> पर्यवेक्षक;
    बूल रन बनाए; // ट्रिगर घटना
जनता:
    // रजिस्टर पर्यवेक्षकों
    शून्य संलग्न (पर्यवेक्षक * अवलोकन) {
        observers.push_back (ओ बीएस);
    }
   
   // यह ईवेंट है
   // सेट अगर रन बनाए और सभी पर्यवेक्षकों को सूचित करें
   शून्य सेट किया गया (बूल स्कोर) {
      रन = स्कोर;
      सूचित करें();
   }
बूल getScored () {
      वापसी स्कोर;
   }
   // नोटिफ़िकेशन को लागू करने में और कमी आई है
   // इतना है कि स्क्रिप्ट संकलित और चलाता है
   शून्य अधिसूचित ();
};

देखने वाला
यह वर्ग उस विषय पर निर्भर है, जिसके साथ यह पंजीकृत है। जब ठोस पर्यवेक्षकों को आरंभिक रूप दिया जाता है तो वे खुद को TheSubject से जोड़ लेते हैं। इस उदाहरण में, प्रत्येक पर्यवेक्षक की अवस्था उसका उत्साहवर्धन है।

क्लास ऑब्जर्वर
{
    विषय * उप;
    int उत्साह // राज्य
  जनता:
    ऑब्जर्वर (विषय * mod, int excLevel)
    {
        subj = mod;
        उत्साहवर्धन करना = छूटना;
        // पर्यवेक्षक स्वयं को विषय के साथ पंजीकृत / संलग्न करते हैं
        subj-> देते हैं (this);
    }
    आभासी शून्य अद्यतन () = 0;
  संरक्षित:
    विषय * getSubject () {
       उप अधीन;
    }
    शून्य setExcitementLevel (int excLevel) {
       उत्साहवर्धन करना = छूटना;
    }
    int getExcitementLevel () {
       उत्साह
    }
};

यह TheSubject :: सूचित () घोषणा है और जैसा कि हमने बताया कि इसकी नौकरी से पहले सभी पर्यवेक्षकों को अपने राज्य को अपडेट करने के लिए सूचित करना है।

शून्य विषय :: सूचना () {
  for (int i = 0; मैं  अद्यतन ();
}

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

वर्ग Old_ConcreteObserver: सार्वजनिक पर्यवेक्षक
{
   जनता:
     // विषय के साथ पंजीकरण करने के लिए मूल रचनाकार को कॉल करता है
     Old_ConcreteObserver (विषय * mod, int div)
        : ऑब्जर्वर (mod, div) {}
     // बड़े लोगों के लिए, यदि उत्तेजना का स्तर
     // 150 से अधिक वे दिल का दौरा पड़ने का खतरा है
     शून्य अद्यतन ()
     {
        बूल रन = getSubject () -> getScored ();
        setExcitementLevel (getExcitementLevel () + 1);
        अगर (स्कोर && getExcitementLevel ()> 150)
        {
          cout << "ओल्ड ऑब्जर्वर की टीम ने रन बनाए !!"
               << "उनका उत्साह स्तर है"
               << getExcitementLevel ()
               << "दिल के दौरे से बाहर देखो!" << एंडल;
        }अन्य{
          cout << "टीम ने स्कोर नहीं किया। यीहेह चिंता की कोई बात नहीं है"
               << एंडल;
        }
    } // एंड अपडेट ()
};
क्लास यंग_कोनक्रिटऑब्जर्वर: पब्लिक ऑब्जर्वर
{
   जनता:
     // विषय के साथ पंजीकरण करने के लिए मूल निर्माणकर्ता को कॉल करता है
     Young_ConcreteObserver (विषय * mod, int div)
       : ऑब्जर्वर (mod, div) {}
     // बड़े लोगों के लिए, यदि उत्तेजना का स्तर
     // 100 से अधिक वे दिल का दौरा पड़ने का खतरा है
     शून्य अद्यतन ()
     {
        बूल रन = getSubject () -> getScored ();
        setExcitementLevel (getExcitementLevel () + 1);
        अगर (स्कोर && getExcitementLevel ()> 100)
        {
          cout << "युवा पर्यवेक्षक की टीम ने रन बनाए !!"
               << "उनका उत्साह स्तर है"
               << getExcitementLevel ()
               << "ड्रिंक एंड ड्राइव न करें !!" << एंडल;
        }अन्य{
          cout << "टीम ने स्कोर नहीं किया। यी को चिंता की कोई बात नहीं है"
               << एंडल;
       }
    } // एंड अपडेट ()
};

मुख्य कार्य
ठोस पर्यवेक्षक खुद को उदाहरण उदाहरण के लिए पंजीकृत करते हैं। उनका राज्य उत्तेजना स्तर है जो दूसरा पैरामीटर है। जब घटना को "subj.setScored (true)" ट्रिगर किया जाता है, तब पंजीकृत पर्यवेक्षकों को अपडेट करने के लिए Subject :: अधिसूचित () कहा जाता है। नीचे के परिदृश्य में, हमारे पास तीन पर्यवेक्षक हैं, युवाओबस 1 आईस ओवरएक्सिटेड है और ड्रिंक एंड ड्राइव के जोखिम को चलाता है, पुराने ओ 1 एस 1 ने एक रन को एक अलग जोखिम (दिल का दौरा पड़ने का) भी ओवरटेक किया। अंत में, youngObs2 जो पहले युवा के रूप में है, उसे इस बारे में चिंता करने के लिए कुछ भी नहीं है क्योंकि वह अतिरंजित नहीं है।

यह ध्यान रखना महत्वपूर्ण है कि तीन पर्यवेक्षकों ने अपने राज्य (उत्तेजना स्तर) और उनके प्रकार (युवा या पुराने) के आधार पर स्वतंत्र रूप से अपडेट किया।
मुख्य प्रवेश बिंदु() {
   विषय अधीन;
   Young_ConcreteObserver YoungObs1 (& subj, 100);
   Old_ConcreteObserver oldObs1 (& subj, 150);
   Young_ConcreteObserver YoungObs2 (& subj, 52);
   subj.setScored (सही);
}
// आउटपुट
// यंग ऑब्जर्वर की टीम ने रन बनाए !! उनका उत्साह का स्तर 101 है
// पीने और ड्राइव न करें !!
// ओल्ड ऑब्जर्वर की टीम ने रन बनाए !! उनका उत्साह स्तर 151 वॉच है
// दिल के दौरे से बाहर! टीम स्कोर नहीं कर पाई।
// येह चिंता की कोई बात नहीं

ऑब्जर्वर पैटर्न के उपयोग के लिए कुछ लाभ हैं और इस पैटर्न को सीखने के लिए कुछ बिंदुओं पर ध्यान दिया जाना चाहिए [पाइथन डिजाइन पैटर्न सीखना]।

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

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

डिजाइन पैटर्न पर अन्य त्वरित-गाइड:

  1. डिजाइन पैटर्न - एब्सट्रैक्ट फैक्ट्री के लिए एक त्वरित गाइड।
  2. डिजाइन पैटर्न - ब्रिज पैटर्न के लिए एक त्वरित गाइड।
  3. डिजाइन पैटर्न - बिल्डर पैटर्न के लिए एक त्वरित गाइड।
  4. डिजाइन पैटर्न - सज्जाकार पैटर्न के लिए एक त्वरित गाइड।
  5. डिजाइन पैटर्न - मुखौटा पैटर्न के लिए एक त्वरित गाइड।
  6. डिजाइन पैटर्न - ऑब्जर्वर पैटर्न के लिए एक त्वरित गाइड।
  7. डिजाइन पैटर्न - सिंगलटन पैटर्न के लिए एक त्वरित गाइड।