PHP डिजाइन पैटर्न प्रेक्षक पैटर्न -

, मंगलवार 29 दिसम्बर 2009 10:02 बजे

मैं पढ़ रहा हूँ सिर पहले डिजाइन पैटर्न और हाल ही में करने के लिए अपने स्वयं के लाभ के के लिए PHP उदाहरण के रूप में पैटर्न के कुछ लिखने का फैसला किया है. पहले एक है कि मैं कोड का फैसला किया है अप प्रेक्षक पैटर्न . प्रेक्षक पैटर्न के औपचारिक परिभाषा है:

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

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

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

एक अद्यतन विधि के माध्यम से अपने पर्यवेक्षकों के अधीन सभी अद्यतन. यह अद्यतन विधि प्रत्येक पर्यवेक्षक में एक विधि है जो एक अंतरफलक को लागू करने से व्युत्पन्न है कहता है. पर्यवेक्षकों को जोड़ सकते हैं एक स्वयं प्रत्यक्ष वस्तु में विधियों के माध्यम से निकाल.

वह मूल रूप से यह है! मैं हमेशा एक उदाहरण अधिगम / समझ का सबसे अच्छा तरीका हो सकता है तो यहाँ मेरे कोडित उदाहरण मिल ...

में प्रेक्षक पैटर्न PHP

मेरे उदाहरण में मैं एक समाचार (NewsAggregator) प्रणाली है जो बाहर भेजता है छोटे समाचार फ़ीड समाचारों को अद्यतन बनाया है. यहाँ खबर sytem के विषय की जगह, प्रत्यक्ष, आदि लेता है, जबकि समाचार फ़ीड्स प्रेक्षकों या श्रोताओं की भूमिका ले.

एक बार initialised पर्यवेक्षकों देते हैं और खुद को अलग कर सकते हैं के रूप में वे फिट देख विषय से. मेरे उदाहरण में मैं तीन पर्यवेक्षकों इन स्कैन विषय द्वारा भेजा सुर्खियों और 'चिल्लाना' अगर अपने उचित खबर बनाया है. तीन प्रेक्षकों नीचे संदर्भ वे जब खबर सुर्खियों में प्राप्त करने के लिए स्कैन के साथ नाम हैं:

  • खेल अवलोकनकर्त्ता: 'रग्बी', 'फुटबॉल', 'टेनिस'
  • समाचार अवलोकनकर्त्ता: 'राजनीति', 'वित्त', 'सरकार'
  • प्रेक्षक बातुनी: 'सेलिब्रिटी', 'संगीत', 'फैशन'

विषय initalising बाद मैं समाचार और गपशप पर्यवेक्षकों को जोड़ सकते हैं और बाहर एक खबर अद्यतन भेजने. इस के बाद खेल पर्यवेक्षक से पहले अधिक समाचार अद्यतन बाहर भेजा जाता है जोड़ा है. अन्त में गपशप पर्यवेक्षक अंतिम समाचारों से पहले बाहर भेजा जाता है हटा दिया जाता है.

तीन अलग पर्यवेक्षक वर्गों इंटरफ़ेस प्रेक्षक को लागू करने के लिए, यह उन्हें एक स्पष्ट अंतरफलक / विधि देता है, जिसके माध्यम से वे अद्यतन प्राप्त होगा. बशर्ते कि वे प्रेक्षक इंटरफ़ेस वे अपने अधीन संलग्न करने में सक्षम हो जाएगा लागू. यह भी प्रोग्रामिंग की 'कार्यक्रम कार्यान्वयन नहीं इंटरफेस' प्रतिमान के साथ रहता है. NewsAggregator वर्ग फैली अमूर्त वर्ग विषय है, जो हमें तीन आवश्यक सार्वजनिक विधियों के साथ प्रदान करता है:

  1. (updateObservers)
  2. (addObserver)
  3. (removeObserver)

कोड यहाँ देखा जा चल सकते हैं, PHP में प्रेक्षक पैटर्न रनिंग , और कोड, यहाँ से डाउनलोड किया जा सकता है PHP कोड में प्रेक्षक पैटर्न .

प्रेक्षक स्क्रिप्ट

  <Php?
 / **
  * इस फ़ाइल पर्यवेक्षकों शामिल
  *
  * लेखक @ लॉयड Watkin
  * @ 2009/12/23 के बाद
  * /

 सार वर्ग विषय
 {
	 सार सार्वजनिक समारोह addObserver (प्रेक्षक $ पर्यवेक्षक);
	 सार सार्वजनिक समारोह removeObserver (प्रेक्षक $ पर्यवेक्षक);
	 सार सार्वजनिक समारोह updateObservers (newsHeadline $);
 }

 / **
  * इस उदाहरण के लिए विषय वर्ग है
  *
  * लेखक @ लॉयड Watkin
  * @ 2009/12/23 के बाद
  * /
 वर्ग ArticleAggregator विषय फैली
 {
	 / **
	  * हमारे पर्यवेक्षकों की एक सूची होल्ड्स
	  *
	  * @ Var सरणी
	  * /
	 संरक्षित $ _observerList = सरणी ();

	 / **
	  * एक पर्यवेक्षक जोड़ने की विधि
	  *
	  * @ Var प्रेक्षक $ प्रेक्षक
	  * _AT_ वापसी शून्य
	  * /
	 सार्वजनिक समारोह addObserver (प्रेक्षक $ पर्यवेक्षक)
	 {
		 $ इस -> _observerList [] = $ पर्यवेक्षक;
	 }

	 / **
	  * एक पर्यवेक्षक हटायें विधि
	  *
	  * @ Var प्रेक्षक $ प्रेक्षक
	  * वापसी @ बूलियन
	  * /
	 सार्वजनिक समारोह removeObserver (प्रेक्षक $ पर्यवेक्षक)
	 {
		 foreach ($ इस -> _observerList के रूप में $ कुंजी = ओब> $) {
			 अगर ($ == ओब $ प्रेक्षक) {
				 unset ($ इस -> _observerList [$ कुंजी]);
				 वापसी सच;
			 }
		 }
		 वापसी झूठी;
	 }

	 / **
	  * पर्यवेक्षकों अद्यतन विधि
	  *
	  * $ _AT_ Var स्ट्रिंग newsHeadline
	  * _AT_ वापसी शून्य
	  * /
	 सार्वजनिक समारोह updateObservers (newsHeadline $)
	 {
		 foreach ($ इस -> ओब _observerList के रूप में $) {
			 $ ओब -> अद्यतन (newsHeadline $);
		 }
	 }

	 / **
	  * एक नया समाचार कहानी में जोड़ें
	  *
	  * @ Var $ स्ट्रिंग कहानी
	  * _AT_ वापसी शून्य
	  * /
	 सार्वजनिक समारोह addNewsStory ($ कहानी)
	 {
		 अगर (खाली ($ कहानी) | is_string ($ कहानी) |!) {
			 नए InvalidArgumentException ('एक समाचार कहानी की उम्मीद') फेंक;
		 }
		 $ इस -> updateObservers ($ कहानी);
	 }
 } 

विषय / प्रत्यक्ष स्क्रिप्ट

 ? </ Php ** * इस फ़ाइल विषय है * * लेखक @ लॉयड Watkin * @ 2009/12/23 के बाद * / अमूर्त वर्ग {विषय सार सार्वजनिक समारोह addObserver (प्रेक्षक पर्यवेक्षक $); पर्यवेक्षक सार सार्वजनिक समारोह (removeObserver प्रेक्षक डॉलर ); सार सार्वजनिक समारोह updateObservers (newsHeadline $); /} ** * यह उदाहरण के लिए विषय वर्ग है * * लेखक @ लॉयड Watkin * @ 2009/12/23 के बाद * / वर्ग ArticleAggregator विषय फैली {/ ** * होल्ड्स हमारे पर्यवेक्षकों की एक सूची * * @ सरणी var / संरक्षित $ _observerList = array (); / ** * विधि एक पर्यवेक्षक को जोड़ने * * @ var प्रेक्षक $ पर्यवेक्षक * @ वापसी शून्य * / सार्वजनिक समारोह addObserver (प्रेक्षक $ पर्यवेक्षक) {$ इस -> _observerList [] पर्यवेक्षक $ =;} / ** * एक पर्यवेक्षक को निकालने के विधि * * @ var प्रेक्षक $ पर्यवेक्षक * वापसी @ बूलियन * / सार्वजनिक समारोह removeObserver (प्रेक्षक पर्यवेक्षक $) {(foreach इस> $ _observerList के रूप में $ कुंजी => $) {($ == ओब $ प्रेक्षक) यदि {unset ($ इस -> _observerList [$ कुंजी]); वापसी सच;}} ओब वापसी झूठी;} / ** * विधि पर्यवेक्षकों को अद्यतन करने के लिए * * @ var स्ट्रिंग newsHeadline $ * @ वापसी शून्य * / सार्वजनिक समारोह updateObservers (newsHeadline $) {foreach ($ इस -> _observerList के रूप में $ ओब) {$ ओब-> अद्यतन (newsHeadline $);}} / ** जोड़ें * एक नई खबर कहानी * * @ var स्ट्रिंग $ कहानी * @ वापसी शून्य * / सार्वजनिक समारोह ($ कहानी addNewsStory) {अगर (खाली ($ कहानी) | | ($ कहानी) is_string) {नई InvalidArgumentException फेंक ('उम्मीद एक खबर कहानी ');} $ इस -> updateObservers ($ कहानी);}} 

नियंत्रक स्क्रिप्ट

  <Php?
 / **
  * प्रेक्षक डिजाइन पैटर्न का उदाहरण
  *
  * लेखक @ लॉयड Watkin
  * @ 2009/12/23 के बाद
  * _AT_ लिंक http://www.evilprofessor.co.uk
  * /
 'observers.php' शामिल;
 'subject.php' शामिल;

 अगर (खाली ($ _SERVER ['HTTP_USER_AGENT'])) {
     गूंज '
  ';
 }

 / / हम क्या कर रहे हैं?
 गूंज 'PHP में प्रेक्षक पैटर्न उदाहरण'.  PHP_EOL;
 '================================' गूंज.  PHP_EOL;
 / / हमारे विषय सेट
 $ विषय = नई ArticleAggregator ();
 '- बनाया ArticleAggregator' गूंज.  PHP_EOL;

 / / कुछ पर्यवेक्षकों जोड़ें
 $ विषय -> addObserver (नया NewsObserver ());
 $ विषय -> addObserver (gossiper डॉलर = नए GossipObserver ());

 गूंज - NewsObverser और GossipObserver जोड़ा '.
	  PHP_EOL.  PHP_EOL;

 / / बीप, बीप बीप ...  समाचार फ़्लैश!
 गूंज 'Newsflash: सेलिब्रिटी रग्बी खिलाड़ी वित्त प्यार करता है.  PHP_EOL;
 '================================================ गूंज '.  PHP_EOL;
 $ विषय -> addNewsStory ('सेलिब्रिटी रग्बी खिलाड़ी वित्त प्यार करता है');
 गूंज PHP_EOL;

 गूंज '! SportObserver बाहर पाया गया है और समूह में शामिल होने के लिए चाहता है';
 $ विषय -> addObserver (नया SportObserver ());
 गूंज PHP_EOL.  PHP_EOL;

 / / बीप, बीप बीप ...  समाचार फ़्लैश!
 'गूंज' newsflash: सरकार ने फिर से खराब करता है!  .  PHP_EOL;
 '=======================================' गूंज.  PHP_EOL;
 $ विषय -> addNewsStory ('सरकार ने एक बार फिर खराब करता है!');
 गूंज PHP_EOL;

 / / बीप, बीप बीप ...  समाचार फ़्लैश!
 गूंज 'Newsflash: फैशन और फुटबॉल गठबंधन'.  PHP_EOL;
 '=======================================' गूंज.  PHP_EOL;
 $ विषय -> addNewsStory ('फैशन और फुटबॉल गठबंधन');
 गूंज PHP_EOL;

 / / बीप, बीप बीप ...  समाचार फ़्लैश!
 गूंज 'Newsflash: संगीत और राजनीति, आगे क्या?  .  PHP_EOL;
 '==========================================' गूंज.  PHP_EOL;
 $ विषय -> addNewsStory ('संगीत और राजनीति, आगे क्या?');
 गूंज PHP_EOL;

 / **
  * Gossipers की खबर बहुत जल्दी थक गया हो जाना है और का फैसला
  * सुनने को रोकने के लिए आज, सभी दिलचस्प खबर के बावजूद!
  * /
 'GossipObserver ऊब और समूह पत्ते!' गूंज  .
      PHP_EOL.  PHP_EOL;
 $ विषय -> removeObserver ($ gossiper);

 / / बीप, बीप बीप ...  समाचार फ़्लैश - एक पहले की कहानी को अद्यतन!
 गूंज 'NewsUpdate: कहते हैं कि फैशन और फुटबॉल गठबंधन'.
      'सरकार'.  PHP_EOL;
 '================================================ गूंज '.
      '========='.  PHP_EOL;
 'गठबंधन फैशन और फुटबॉल' $ विषय -> addNewsStory (.
                         'सरकार का कहना है');
 गूंज PHP_EOL;

 अगर (खाली ($ _SERVER ['HTTP_USER_AGENT'])) {
     गूंज ' 

';

}

3 जवाब "PHP डिजाइन पैटर्न - प्रेक्षक पैटर्न"

  1. व्रत कहते है :

    नमस्कार,
    सबसे पहले, मेरी अंग्रेजी बहुत गरीब है तो,
    क्या आप मुझे बता सकते हैं हैं कि चित्र में क्या व्यवस्था है?
    12 fedora?
    विषय क्या है?

  2. व्रत कहते है :

    नमस्कार,
    क्या आप मुझे बता सकते हैं हैं कि चित्र में क्या व्यवस्था है?
    12 फेडोरा?
    विषय क्या है?

एक उत्तर दें छोड़ दो

आवश्यकता













पैनोरमा थीम द्वारा Themocracy

7 आगंतुकों अब ऑनलाइन
5 मेहमानों, 2 बॉट, 0 सदस्यों
16 02:02 AM UTC: मैक्स आज आगंतुकों
इस महीने: 16 UTC 2011/1/9 02:02 पर हूँ
इस वर्ष: 130 28-03-2011 10:40 बजे UTC
सभी समय: 28-03-2011 10:40 बजे UTC 130