डिझाईन नमुने - निरीक्षक पॅटर्नचा एक द्रुत मार्गदर्शक.

निरीक्षक नमुना हा एक सामान्यपणे वापरला जाणारा नमुना आहे. खरं तर, हे इतके सामान्य आहे की बर्‍याच प्रोग्रामिंग भाषा / लायब्ररीत प्रमाणित केले जात आहे. जावामध्ये, हे इंजेक्वा.उटिल.ऑब्सर्व्हर (जावा 9 मध्ये नापसंत) अस्तित्वात आहे. पायथनमध्ये ते एपीपी स्थापित नमुना-निरीक्षक इतकेच जवळ आहे. सी ++ मध्ये, आम्ही कधीकधी बूस्ट लायब्ररी वापरू शकतो, अधिक अचूकपणे # समावेश <बूस्ट / सिग्नल्स 2 एचपीपी>. तथापि, सानुकूलित द्रावण म्हणून उद्योगात याचा मोठ्या प्रमाणात वापर केला जातो. याचा योग्यप्रकारे वापर करण्यात आणि त्याची गुंतागुंत समजून घेण्यासाठी, त्यामध्ये बुडी मारून त्या शोधण्याची गरज आहे.

वर्तणूक डिझाइन नमुन्यांमध्ये निरीक्षक नमुना वर्गीकृत केला जातो. वर्तणूक डिझाइनचे नमुने विशेषत: वर्ग / वस्तूंमधील संप्रेषणाशी संबंधित आहेत. [डिझाइन पॅटर्न्स द्वारा सरळ स्पष्ट केले]

निरीक्षक नमुना म्हणजे काय? अ‍ॅनालॉग टेलिव्हिजन प्रसारित करणारे चालणा monitor्या मॉनिटरशिवाय (चित्रात जसे). पॅटर्नचे उद्दीष्ट एक ते अनेक संबंध परिभाषित करणे हे आहे की जेव्हा जेव्हा एखादी वस्तूची स्थिती बदलली जाते तेव्हा इतरांना आपोआप सूचित केले जाईल आणि अद्यतनित केले जाईल. अधिक तंतोतंत, सिस्टममध्ये घडणा informed्या घटनांविषयी माहिती व्हावी अशी आपली इच्छा आहे. कोडेचे तुकडे तीन चरणात एकत्र ठेवू या.

चरण 1 - कीवर्ड

द्रुत-मार्गदर्शकांच्या या मालिकेत कीवर्ड परिभाषित करणे ही एक गुप्त कृती आहे. या पद्धतीमुळे मला खरोखर डिझाइनचे नमुने समजून घेण्यात, त्यांच्या मनाने हार्डकोड करण्यात आणि इतर डिझाइन नमुन्यांमधील फरक समजण्यास मदत केली.

  1. विषयः हा माहिती, डेटा किंवा व्यवसायाचा तर्कशास्त्र ठेवणारा मानला जातो.
  2. नोंदणी / संलग्न करा: निरीक्षक या विषयावर स्वत: ची नोंदणी करतात कारण बदल झाल्यावर त्यांना सूचित करावेसे वाटते.
  3. कार्यक्रमः इव्हेंट्स विषयातील ट्रिगर म्हणून कार्य करतात जेणेकरून सर्व निरीक्षकांना सूचित केले जाईल.
  4. सूचना द्या: अंमलबजावणीच्या आधारे, विषय निरीक्षकास माहिती "ढकलणे" देऊ शकतो किंवा निरीक्षकांना त्यांना त्या विषयाची माहिती हवी असल्यास “खेचणे” लागू शकते.
  5. अद्यतनितः निरीक्षक त्यांचे राज्य अन्य निरीक्षकांकडून स्वतंत्रपणे अद्यतनित करतात तथापि ट्रिगर केलेल्या घटनेनुसार त्यांचे राज्य बदलू शकते.

चरण 2 - आकृती

हे थोडेसे सुलभ करण्यासाठी या डिझाइनला वेगवेगळ्या वर्गात विभागू द्या.

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

चरण 3 - उदाहरणानुसार कोड

मी माझ्या गिट रेपॉजिटरी “अँड्रियास पोयियास” किंवा खाली असलेल्या स्निपेट्सवरून वर्गवारीनुसार कोड क्लास कॉपी करण्याचा सल्ला देऊ आणि उपलब्ध असलेल्या सी ++ शेल, जूडल, ऑनलाइन जीडीबी आणि रन सारख्या कोणत्याही ऑनलाइन सी ++ संपादकात पेस्ट करा. हे आऊटपुट बघण्यासाठी. नंतर खाली टिप्पण्या किंवा वर्णन वाचा. आपला वेळ घ्या, तो नख वाचून घ्या (याचा अर्थ एक मिनिट, कमी नाही आणि जास्त नाही).

उदाहरणः फुटबॉल खेळाचा विचार करा. बरेच समर्थक हा खेळ पहात आहेत. आम्ही समर्थकांना वयाने वयाने दोन श्रेणींमध्ये विभागले. जेव्हा त्यांचा कार्यसंघ गोल करतो तेव्हा समर्थक त्यांचे वय आणि त्यांच्या उत्साहाच्या पातळीनुसार भिन्न प्रतिक्रिया देतात.
आता पर्यवेक्षकाच्या नमुन्यासाठी वापरल्या जाणार्‍या अटींसह चर्चा करूया:

  • खेळ हा विषय आहे आणि समर्थक निरीक्षक आहेत.
  • सर्व निरीक्षक या विषयाशी संलग्न / नोंदणीकृत आहेत आणि जेव्हा त्यांच्या फुटबॉल संघातील स्कोअर (त्यांच्या कार्यसंघाच्या स्कोअरचा ट्रिगर-कार्यक्रम असतो) तेव्हा त्यांना सूचित केले जाते.
  • प्राप्त सूचनांनुसार निरीक्षक त्यांचे वर्तन अद्यतनित करतात.

विषय
या वर्गासाठी आम्हाला निरीक्षकांच्या यादीत प्रवेश करणे आवश्यक आहे. जेव्हा निरीक्षक नोंदणी करणार आहेत, तेव्हा त्यांना उपलब्ध यादीमध्ये स्वत: ला जोडण्यासाठी ते टाटाच (हे) फंक्शन कॉल करतात (ही निरीक्षकाची उदाहरणे आहे). जेव्हा इव्हेंटला चालना दिली जाते तेव्हा व्हेनोटीफाई () सर्व निरीक्षकांना त्यांची स्थिती स्वतंत्रपणे अद्यतनित करा. या उदाहरणात, निरीक्षकांच्या फुटबॉल संघाने स्कोअर केल्यास ट्रिगर होते.

# आयओस्टीम> समाविष्ट करा
# अंतर्भूत <वेक्टर>
नेमस्पेस एसटीडी वापरणे;
वर्ग विषय {
    वेक्टर <वर्ग निरीक्षक *> निरीक्षक;
    बूल धावा; // ट्रिगर, कार्यक्रम
सार्वजनिक:
    // निरीक्षक नोंदणी करा
    शून्य संलग्न (निरीक्षक * obs)
        निरीक्षक.पुश_बॅक (obs);
    }
   
   // ही घटना आहे
   // असल्यास स्कोअर सेट करा आणि सर्व निरीक्षकांना सूचित करा
   शून्य सेटस्क्रॉड (बूल स्कोअर) {
      स्कोअर = स्कोअर;
      सूचित करा ();
   }
बूल गेटस्कोर्ड () {
      रिटर्न स्कोअर;
   }
   // सूचित अंमलबजावणी पुढील खाली आहे
   // जेणेकरून स्क्रिप्ट संकलित होते आणि चालू होते
   शून्य सूचना ();
};

निरीक्षक
हा वर्ग ज्या विषयावर नोंदणीकृत आहे त्यावर अवलंबून आहे. जेव्हा कंक्रीट निरीक्षक आरंभित होतात तेव्हा ते स्वत: ला सब्जेक्टशी जोडतात. या उदाहरणात, प्रत्येक निरीक्षकाची स्थिती ही त्या खेळाच्या उत्साहीतेबद्दल आहे.

वर्ग निरीक्षक
{
    विषय * सबज;
    इंट एक्साइटमेंट लेव्हल; // राज्य
  सार्वजनिक:
    निरीक्षक (विषय * मोड, इंट एक्सक्लेव्हल)
    {
        subj = मोड;
        उत्तेजित करणे / उत्तेजन देणे;
        // निरीक्षक या विषयावर स्वतःची नोंदणी / संलग्न करतात
        subj-> संलग्न (हे);
    }
    आभासी शून्य अद्यतन () = 0;
  संरक्षित:
    विषय * getSubject () {
       रिटर्न सबज;
    }
    रिकामे सेटएक्साइमेंटमेंट लीव्हल (इंट एक्सलव्हेल) {
       उत्तेजित करणे / उत्तेजन देणे;
    }
    IN getExcitementLevel () {
       परतावा उत्साह
    }
};

ही TheSubject :: notify () घोषणा आहे आणि आम्ही त्याचे कार्य करण्यापूर्वी नमूद केले आहे की सर्व निरीक्षकांना त्यांचे राज्य अद्यतनित करण्यासाठी सूचित करावे.

शून्य विषय :: सूचित () {
  (इंट i = 0; i <निरीक्षक. आकार (); i ++) साठी
    निरीक्षक [i] -> अद्यतन ();
}

काँक्रीट निरीक्षक
काँक्रीट निरीक्षकास निरीक्षक वर्गाचा वारसा मिळाला आहे आणि त्या सर्वांचे अद्ययावत कार्य केले पाहिजे. या उदाहरणात, ठोस निरीक्षक तरुण आणि वृद्ध समर्थकांमधील फरक ओळखला जातो. जर त्यांच्या उत्तेजनाची पातळी खूपच जास्त वाढली तर जुन्या समर्थकांना हृदयविकाराचा धोका असतो आणि लहानांना मद्यपान आणि ड्रायव्हिंगचा धोका असतो. त्यांचे राज्य स्वतंत्रपणे अद्यतनित होते कारण आम्ही खाली पुढील कार्येमध्ये सिद्ध करू.

वर्ग Old_ConcreteObserver: सार्वजनिक निरीक्षक
{
   सार्वजनिक:
     // विषयासह नोंदणी करण्यासाठी पालक बांधकामकर्त्यास कॉल करा
     जुने_कंक्रिटऑब्सर्व्हर (विषय * मोड, इंट डिव्ह)
        : निरीक्षक (मोड, डिव्ह)}
     // वृद्ध लोकांसाठी, खळबळजनक पातळी असेल तर
     // त्यांचे हृदयविकाराचा धोका 150 पेक्षा जास्त आहे
     शून्य अद्यतन ()
     {
        बूल स्कोअर = getSubject () -> getScored ();
        सेटएक्साइटमेंट लेव्हल (getExcitementLevel () + 1);
        जर (स्कोअर &&ExcitementLevel ()> 150)
        {
          कॉट << "ओल्ड ऑब्जर्व्हरच्या टीमने स्कोअर !!"
               << "त्याची उत्साही पातळी"
               << एक्स्टेटमेंट लीव्हल () मिळवा
               << "हृदयविकाराचा झटका पहा!" << एंडल;
        } अन्य {
          कॉट << "संघाने स्कोअर केले नाही. येईही चिंता करण्याची काहीच गरज नाही"
               << एंडल;
        }
    } // अंतिम अद्यतन ()
};
यंग_कंक्रिटऑब्सर्व्हर वर्ग: सार्वजनिक निरीक्षक
{
   सार्वजनिक:
     // विषयासह नोंदणी करण्यासाठी पालक बांधकामकर्त्यास कॉल करा
     यंग_कंक्रिटऑब्सर्व्हर (विषय * मोड, इंट डिव्ह)
       : निरीक्षक (मोड, डिव्ह)}
     // वृद्ध लोकांसाठी, खळबळजनक पातळी असेल तर
     // त्यांचे हृदयविकाराचा धोका 100 पेक्षा जास्त आहे
     शून्य अद्यतन ()
     {
        बूल स्कोअर = getSubject () -> getScored ();
        सेटएक्साइटमेंट लेव्हल (getExcitementLevel () + 1);
        जर (स्कोअर &&ExcitementLevel ()> 100)
        {
          कॉट << "यंग ऑब्झर्व्हरच्या टीमने स्कोअर !!"
               << "त्याची उत्साही पातळी"
               << एक्स्टेटमेंट लीव्हल () मिळवा
               << "मद्यपान करू नका आणि वाहन चालवू नका!" << एंडल;
        } अन्य {
          कॉट << "संघाने स्कोअर केले नाही. येई काळजी करण्याची काहीच गरज नाही"
               << एंडल;
       }
    } // अंतिम अद्यतन ()
};

मुख्य कार्य
कंक्रीट निरीक्षक स्वत: ला सब्जेक्ट घटनेवर नोंदणी करतात. त्यांचे राज्य खळबळजनक पातळी आहे जे दुसरे पॅरामीटर आहे. जेव्हा इव्हेंटला "subj.setScored (true)" ट्रिगर केले जाते, तेव्हा सबस्बेक्ट :: notify () नोंदणीकृत निरीक्षकांना अद्यतनित करण्यासाठी म्हणतात. खालील परिस्थितीत आमच्याकडे तीन निरीक्षक आहेत, यंगऑब्स 1 हे अतिरेकी आहे आणि मद्यपान आणि ड्रायव्हिंगचा धोका चालविते, ओल्डओब्स 1 नेही वेगळ्या जोखमीला (हृदयविकाराचा झटका) जास्त महत्त्व दिले आहे. अखेरीस, यंगऑब्स 2 जो पहिल्यासारखा तरुण आहे त्याला भीती वाटत नाही कारण त्याला जास्त ओझे नाही.

हे लक्षात घेणे महत्वाचे आहे की तीन निरीक्षक त्यांच्या राज्यात (खळबळ पातळी) आणि त्यांच्या प्रकारानुसार (तरुण किंवा वृद्ध) स्वतंत्रपणे अद्यतनित झाले.
इंट मेन () {
   विषय subj;
   यंग_कंक्रिटऑब्सर्व्हर यंगऑब्स 1 (& सबज, 100);
   ओल्ड_कंक्रिटऑब्सर्व्हर ओल्ड ओबीएस 1 (& सबज, 150);
   यंग_कंक्रिटऑबर्व्हर यंगऑब्स 2 (& सबज, 52);
   subj.setScored (खरे);
}
// आउटपुट
// यंग ऑब्झर्व्हरच्या टीमने गोल केले !! त्याची उत्तेजनाची पातळी 101 आहे
// मद्यपान करुन वाहन चालवू नका !!
// ओल्ड ऑब्जर्व्हरच्या टीमने केले !! त्याची उत्तेजित पातळी 151 घड्याळ आहे
// हार्ट अटॅक बाहेर! संघाने गोल केले नाही.
// येई काळजी करण्याची काहीच नाही

ऑब्झर्व्हर पॅटर्नच्या वापरासाठी काही फायदे आहेत आणि जेव्हा या पॅटर्नकडे [पायथन डिझाइन पॅटर्न्स शिकणे] येथे संपर्क साधला जाईल तेव्हा काही मुद्दे लक्षात घ्यावेत.

  • ऑब्झर्व्हर पॅटर्न एक डिझाइन प्रदान करते जिथे सब्जेक्ट आणि ऑब्झर्व्हर हळूहळू जोडलेले असतात. या विषयाला कंक्रीटऑब्झर्व्हर वर्गाबद्दल माहित असणे आवश्यक नाही. कोणतीही नवीन निरीक्षक वेळेत कोणत्याही वेळी जोडली जाऊ शकते. नवीन निरीक्षक जोडले असता विषय सुधारण्याची आवश्यकता नाही. निरीक्षक आणि विषय एकमेकाशी जोडलेले नाहीत आणि ते एकमेकांपासून स्वतंत्र आहेत, म्हणूनच विषय किंवा निरीक्षणामधील बदल एकमेकांवर परिणाम करणार नाहीत.
  • संरचनेसाठी पर्याय नाही, कारण निरीक्षक इंटरफेस इन्स्टंट केला जाऊ शकतो.
  • जर निरीक्षकाचा गैरवापर केला गेला तर तो सहजपणे गुंतागुंत वाढवू शकतो आणि कामगिरीच्या मुद्द्यांस कारणीभूत ठरू शकतो.
  • सूचना अविश्वसनीय असू शकतात आणि यामुळे वंश परिस्थिती किंवा विसंगती होऊ शकतात.

पुढील ब्लॉग ब्रिज डिझाइन पॅटर्नचा एक द्रुत मार्गदर्शक असेल. हा रचनात्मक डिझाइनचा नमुना आहे जो उद्योगात बरेच वापरला जातो. माझ्या ब्लॉग-पोस्टला आवडणे / टाळी देणे आणि माझ्या खात्याचे अनुसरण करण्यास विसरू नका. हे मी काही सहकारी विकसकांना मदत केल्याबद्दल मला समाधान देण्यास आणि लेखन सुरू ठेवण्यासाठी दबाव आणण्यासाठी आहे. आपण तेथे डिझाइनची एखादी विशिष्ट पद्धत सांगू इच्छित असाल तर मला कळवा जेणेकरून मी भविष्यात आपल्यासाठी हे प्रदान करू शकेन.

डिझाइन नमुन्यांवरील इतर द्रुत-मार्गदर्शक:

  1. डिझाईन नमुने - अ‍ॅबस्ट्रॅक्ट फॅक्टरीसाठी द्रुत मार्गदर्शक.
  2. डिझाईन नमुने - ब्रिज पॅटर्नसाठी एक द्रुत मार्गदर्शक.
  3. डिझाईन नमुने - बिल्डर पॅटर्नसाठी एक द्रुत मार्गदर्शक.
  4. डिझाईन नमुने - सजावटीच्या पॅटर्नचा एक द्रुत मार्गदर्शक.
  5. डिझाईन नमुने - दर्शनी नमुना एक द्रुत मार्गदर्शक.
  6. डिझाईन नमुने - निरीक्षक पॅटर्नसाठी एक द्रुत मार्गदर्शक.
  7. डिझाईन नमुने - एकल नमुना एक द्रुत मार्गदर्शक.