PHP תבניות עיצוב - תבנית אובזרוור

לפי ווטקין לויד סטיבן , יום שלישי 29 דצמבר 2009 22:02

קראתי הראש הראשון תבניות עיצוב לאחרונה החליטו לכתוב כמה דפוסי כדוגמאות PHP לטובת שלי. האחת, כי החלטתי קוד למעלה היא תבנית אובזרוור " . ההגדרה הרשמית של תבנית אובזרוור היא:

הדפוס הצופה (תת קבוצה של אסינכרוני לפרסם / להירשם דפוס ) היא תוכנת עיצוב דפוס שבו האובייקט , קרא את הנושא, שומר רשימה של התלויים שלה, משקיפים קרא, ומודיע להם אוטומטית של כל השינויים המדינה, בדרך כלל על ידי התקשרות אחד שלהם שיטות . הוא משמש בעיקר כדי ליישם מופץ טיפול במערכות האירוע.

כמו במערכות להיות יחד יותר רופף לוודא כי כאשר אירוע שקורה כל מערכות הדורשות ידע של עדכונים אלה הם מושכלות. לדוגמה, לכתוב בלוג, אחרי שמירת פוסט אנו עשויים לעדכן את מנוע החיפוש (למשל Lucene), לעדכן את מפת שלנו, תגיות, משתמשים מנוי דוא"ל, וכו 'דפוס הצופה מאפשר למפתחים להוסיף מאזינים נוספים ללא עריכת האובייקט הנצפה שלהם . באמצעות הזרקת משקיפים (כלומר מנוע חיפוש עדכון הצופה, גנרטור Sitemap, וכו ') לתוך הנושא (פוסט כלומר מערכת הבלוג העריכה) אנחנו יכולים לאפשר לה לבצע את כל העדכונים הדרושים ללא כל שינוי.

לפני דפוס אובזרוור זוהה את הטריק הרגיל יהיה לעדכן את האובייקט הנצפה עם שורה נוספת של קוד כדי לעדכן את המערכת הנדרשת, וכן להסיר את שורת הקוד כנדרש. זה אינו מאפשר בקלות הוספה והסרה של משקיפים.

את העדכונים בנושא כל המשקיפים שלה באמצעות שיטת העדכון. זו שיטת העדכון שיחות שיטה הצופה כל הנגזר יישום ממשק. משקיפים יכול להוסיף ולהסיר את עצמם באמצעות שיטות של האובייקט הנצפה.

זה בעצם אותו! אני תמיד מוצא דוגמא להיות השיטה הטובה ביותר של למידה / הבנה אז הנה למשל מקודד את שלי ...

Observer Pattern ב PHP

בדוגמה שלי יצרתי מערכת החדשות (NewsAggregator) אשר שולחת עדכוני חדשות הכותרת כדי קטנות חדשות רסס. כאן sytem החדשות תופסת את מקומו של הנושא, הנצפה, וכו 'ואילו החדשות הזנות לקחת את התפקיד של משקיפי או המאזינים.

לאחר משקיפים initialised יכול לצרף להתנתק מן הנושא כפי שהם רואים לנכון. בדוגמה שלי יצרתי שלושה משקיפים, אלה סריקה הכותרות נשלח על ידי הסובייקט "צועק" את החדשות ובמידת הצורך שלה. שלושה משקיפים נקראים להלן יחד עם התנאים שהם סריקה לאיתור כאשר החדשות הכותרות שקיבל:

  • ספורט אובזרוור ":" רוגבי "," כדורגל "," טניס "
  • חדשות אובזרוור ":" הפוליטיקה "," האוצר "," ממשלה "
  • Gossip אובזרוור: "סלבריטי", "מוזיקה", "אופנה"

לאחר initalising את הנושא אני מוסיף המשקיפים חדשות ורכילות ושולחים העדכון החדשות. אחרי זה הצופה ספורט נוסף לפני יותר עדכוני חדשות נשלחות. לבסוף לצופה הרכילות יוסר לפני כותרת הידיעה הסופית היא שלחה החוצה.

שלושת המעמדות הצופה שונות ליישם את הממשק Observer, זה נותן להם / ברורה שיטת ממשק שדרכו הם יקבלו עדכונים. בתנאי שהם ליישם את הממשק Observer הם יוכלו לצרף את עצמם לנושא. זה גם שומר עם הפרדיגמה של תכנות "תוכנית ממשקים לא הטמעות". המעמד NewsAggregator מרחיב את נושא המעמד המופשט, אשר מספק לנו שלוש שיטות הציבור הנדרש:

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

הקוד ניתן לראות פועל כאן, אובזרוור "דפוס פעולה PHP , ואת הקוד ניתן להוריד מכאן, אובזרוור דפוס קוד PHP .

אובזרוור סקריפט

  <? PHP
 / **
  * קובץ זה מכיל את משקיפים
  *
  @ * הסופר לויד ווטקין
  * @ מאז 2009/12/23
  * /

 ברמה המופשטת נושא
 {
	 addObserver מופשטים תפקיד ציבורי (Observer $ הצופה);
	 removeObserver מופשטים תפקיד ציבורי (Observer $ הצופה);
	 פונקציה מופשטת updateObservers הציבור ($ newsHeadline);
 }

 / **
  * זהו המעמד הנושא למשל
  *
  @ * הסופר לויד ווטקין
  * @ מאז 2009/12/23
  * /
 ArticleAggregator בכיתה מרחיב נושא
 {
	 / **
	  * מחזיק רשימה של משקיפים שלנו
	  *
	  * @ מערך var
	  * /
	 מוגן $ = מערך _observerList ();

	 / **
	  * שיטה להוסיף משקיף
	  *
	  @ * Var אובזרוור $ הצופה
	  @ * להחזיר void
	  * /
	 הפונקציה addObserver הציבור (Observer $ הצופה)
	 {
		 _observerList $ הזה-> [] = $ הצופה;
	 }

	 / **
	  * שיטה להסיר משקיף
	  *
	  @ * Var אובזרוור $ הצופה
	  @ * לחזור בוליאני
	  * /
	 הפונקציה removeObserver הציבור (Observer $ הצופה)
	 {
		 foreach ($ זו-> _observerList דולר המפתח => $ OB) {
			 אם ($ OB == $ הצופה) {
				 unset ($ זו-> _observerList [$ מפתח]);
				 התשואה האמיתית;
			 }
		 }
		 בתמורה שווא;
	 }

	 / **
	  * שיטה לעדכן משקיפים
	  *
	  @ * מחרוזת newsHeadline var $
	  @ * להחזיר void
	  * /
	 הפונקציה updateObservers הציבור ($ newsHeadline)
	 {
		 foreach ($ זו-> _observerList דולר OB) {
			 עדכון $ OB-> ($ newsHeadline);
		 }
	 }

	 / **
	  * הוסף סיפור חדשותי חדש
	  *
	  @ * מחרוזת סיפור var $
	  @ * להחזיר void
	  * /
	 הפונקציה addNewsStory הציבור ($ סיפור)
	 {
		 אם (סיפור ריקה ($) | |! is_string ($ סיפור)) {
			 לזרוק InvalidArgumentException החדש ("צפוי סיפור החדשות!");
		 }
		 זה $-> updateObservers ($ הסיפור);
	 }
 } 

נושא / הנצפה סקריפט

 ? <Php / ** * קובץ זה מכיל את * בכפוף @ המחבר לויד ווטקין * @ מאז 2009/12/23 * / מחלקה נושא מופשט {הפונקציה המופשטת addObserver הציבור (Observer $ הצופה); הפונקציה המופשטת removeObserver הציבור (Observer $ הצופה ;) מופשט updateObservers תפקיד ציבורי ($ newsHeadline);} / * ** זהו המעמד הנושא למשל * @ המחבר לויד ווטקין * @ * מאז 2009/12/23 / מחלקה ArticleAggregator מרחיב נושא {/ ** * בעל רשימה של * שלנו משקיפים * @ * מערך var / מוגן $ _observerList = מערך (); / ** * שיטה להוסיף משקיף * @ var אובזרוור * הצופה $ @ * חלל לחזור / addObserver הציבור הפונקציה (Observer $ הצופה) {_observerList $ הזה-> [] הצופה $ =;} / ** * שיטה להסיר משקיף * @ var אובזרוור הצופה $ * @ * בוליאני לחזור / removeObserver הציבור הפונקציה (Observer $ הצופה) {foreach ($ זו-> _observerList דולר המפתח => $ OB) {אם ($ OB == $ הצופה) {unset (_observerList $ הזה-> [$ מפתח]); לחזור נכון;}} לחזור שווא;} / ** * שיטה לעדכן משקיפים * @ * מחרוזת var $ * newsHeadline @ * חלל לחזור / ציבורי הפונקציה updateObservers ($ newsHeadline) {foreach ($ זו-> _observerList דולר OB) {עדכון $ OB-> ($ newsHeadline);}} / ** * הוסף חדשות חדש סיפור * @ מחרוזת var $ * הסיפור @ * חלל לחזור / addNewsStory הציבור פונקציה ($ הסיפור) {אם (סיפור ריקה ($) | |! is_string ($ סיפור)) {לזרוק InvalidArgumentException החדש ("צפויות חדשות הסיפור ");!} $ הזה-> updateObservers ($ הסיפור);}} 

בקר סקריפט

  <? PHP
 / **
  * עיצוב Observer Pattern דוגמה
  *
  @ * הסופר לויד ווטקין
  * @ מאז 2009/12/23
  @ * הקישור http://www.evilprofessor.co.uk
  * /
 כוללים 'observers.php';
 כוללים 'subject.php';

 אם (! ריקה ($ ['HTTP_USER_AGENT'] _SERVER)) {
     הד '
  ";
 }

 / / מה אנחנו עושים?
 הד 'אובזרבר תבנית דוגמא ב-PHP ".  PHP_EOL;
 הד'================================'.  PHP_EOL;
 / / הגדרת הנושא שלנו
 $ = הנושא ArticleAggregator חדש ();
 הד '- ArticleAggregator שנוצר ".  PHP_EOL;

 / / הוסף משקיפים
 $ AddObserver הנושא-> (חדש NewsObserver ());
 (רכילאי $ = חדש GossipObserver ()) $ בכפוף-> addObserver;

 הד '- מוסף NewsObverser & GossipObserver ".
	  PHP_EOL.  PHP_EOL;

 / / ביפ, ביפ, ביפ ...  מבזק חדשות!
 הד 'חדשות Flash: סלבריטי שחקן רוגבי אוהב האוצר ".  PHP_EOL;
 הד'================================================ ".  PHP_EOL;
 addNewsStory $ בכפוף-> ("שחקן רוגבי מפורסם אוהב האוצר");
 הד PHP_EOL;

 הד '- SportObserver גילה ורוצה להצטרף לקבוצה! ";
 $ AddObserver הנושא-> (חדש SportObserver ());
 הד PHP_EOL.  PHP_EOL;

 / / ביפ, ביפ, ביפ ...  מבזק חדשות!
 הד 'חדשות Flash: הממשלה מתעסקת שוב! "  .  PHP_EOL;
 הד'======================================='.  PHP_EOL;
 $ נושא> addNewsStory ("הממשלה מתעסקת שוב!");
 הד PHP_EOL;

 / / ביפ, ביפ, ביפ ...  מבזק חדשות!
 הד 'חדשות Flash: אופנה כדורגל לשלב ".  PHP_EOL;
 הד'======================================='.  PHP_EOL;
 addNewsStory $ בכפוף-> ("האופנה כדורגל לשלב");
 הד PHP_EOL;

 / / ביפ, ביפ, ביפ ...  מבזק חדשות!
 הד 'חדשות Flash: מוסיקה ופוליטיקה, מה הלאה? "  .  PHP_EOL;
 הד'=========================================='.  PHP_EOL;
 addNewsStory $ בכפוף-> ("מוסיקה ופוליטיקה, מה הלאה?");
 הד PHP_EOL;

 / **
  * Gossipers מואסים החדשות מהר מאוד החלטתי
  * להפסיק להאזין, למרות כל החדשות מעניין היום!
  * /
 הד '- GossipObserver משתעמם ועוזב את הקבוצה! "  .
      PHP_EOL.  PHP_EOL;
 removeObserver $ בכפוף-> ($ רכלן);

 / / ביפ, ביפ, ביפ ...  מבזקי חדשות - עדכון לסיפור קודמת!
 הד 'NewsUpdate: אופנה כדורגל לשלב אומר ".
      'הממשלה'.  PHP_EOL;
 הד'================================================ ".
      '========='.  PHP_EOL;
 addNewsStory $ בכפוף-> ("האופנה כדורגל לשלב".
                         "הממשלה אומרת");
 הד PHP_EOL;

 אם (! ריקה ($ ['HTTP_USER_AGENT'] _SERVER)) {
     הד ' 

";

}

3 תגובות ל "PHP תבניות עיצוב - תבנית אובזרוור"

  1. הנדר אומר:

    שלום,
    ראשית, האנגלית שלי חלשה מאוד, אז
    אתה יכול להגיד לי מה היא מערכת בתמונה?
    פדורה 12?
    מהו הנושא?

  2. הנדר אומר:

    שלום,
    אתה יכול להגיד לי מה היא מערכת בתמונה?
    פדורה 12?
    מהו הנושא?

השאירו תגובה













פנורמה לפי נושאים Themocracy

6 מבקרים מקוון עכשיו
3 אורחים, 3 בוטים, 0 חברים
מקס מבקרים היום: 10 בשעה 01:05 UTC
החודש: 26 ב 2011/07/05 12:35 UTC
השנה: 130 ב 28-03-2011 22:40 UTC
כל הזמן: 130 ב 28-03-2011 10:40 UTC