PHP Design Patterns - תבניות אובזרוור

על ידי , יום שלישי 29 דצמבר 2009 22:02

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

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

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

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

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

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

Observer Pattern ב PHP

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  <? Php
 / **
  * קובץ זה מכיל את הנושא
  *
  * @ מחבר לויד ווטקין
  * @ מאז 2009/12/23
  * /

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

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

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

	 / **
	  * שיטת להסיר משקיף
	  *
	  * @ $ Var אובזרוור הצופה
	  * @ לחזור בוליאני
	  * /
	 פונקציה removeObserver הציבור (אובזרוור $ הצופה)
	 {
		 foreach ($ זו-> _observerList AS $ key => $ 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 ';

 אם (! ריק ($ _SERVER ['HTTP_USER_AGENT'])) {
     הד '
 ";} / / מה אנחנו עושים?  הד 'תבנית אובזרוור דוגמא ב-PHP ".  PHP_EOL;'================================' הד.  PHP_EOL: / / הגדרת הנושא שלנו $ ArticleAggregator נושא חדש = (); הד '- ArticleAggregator שנוצר ".  PHP_EOL: / / הוסף כמה משקיפים $ לנושא> addObserver (חדש NewsObserver ()); $ לנושא> addObserver ($ = רכלן חדש GossipObserver ()); הד '- מוסף NewsObverser & GossipObserver ".  PHP_EOL.  PHP_EOL: / / ביפ, ביפ ביפ ...  מבזקי חדשות!  הד 'מבזק: שחקן רוגבי מפורסם אוהב האוצר ".  PHP_EOL; הד'============================================== == ".  PHP_EOL; $ לנושא> addNewsStory ("סלבריטי רוגבי שחקן אוהב לממן '); הד PHP_EOL; הד' - SportObserver גילה ורוצה להצטרף לקבוצה! '; $ לנושא> addObserver (חדש SportObserver ()); הד PHP_EOL .  PHP_EOL: / / ביפ, ביפ ביפ ...  מבזקי חדשות!  הד 'מבזקים: הממשלה מפשל שוב! "  .  PHP_EOL;'=======================================' הד.  PHP_EOL; $ לנושא> addNewsStory ("הממשלה מתעסקת שוב!"); הד PHP_EOL: / / ביפ, ביפ, ביפ ...  מבזקי חדשות!  הד 'מבזקים: אופנה לשלב כדורגל ".  PHP_EOL;'=======================================' הד.  PHP_EOL; $ לנושא> addNewsStory ("אופנה לשלב כדורגל '); הד PHP_EOL: / / ביפ, ביפ ביפ ...  מבזקי חדשות!  הד 'מבזקים: מוסיקה ופוליטיקה, מה הלאה? "  .  PHP_EOL;'==========================================' הד.  PHP_EOL; $ לנושא> addNewsStory ("מוסיקה ופוליטיקה, מה הלאה? '); הד PHP_EOL: / ** * רכלנים נמאס חדשות מהר מאוד החליטו * להפסיק להאזין, למרות כל החדשות מעניין היום!  * / הד '- GossipObserver משתעמם ועוזב את הקבוצה! "  .  PHP_EOL.  PHP_EOL; $ לנושא> removeObserver ($ רכלן); / / ביפ, ביפ ביפ ...  מבזקי חדשות - עדכון לסיפור מוקדם!  הד 'NewsUpdate: אופנה כדורגל לשלב אומר ".  "הממשלה".  PHP_EOL; הד'============================================== == ".  '========='.  PHP_EOL; $ לנושא> addNewsStory ("אופנה כדורגל לשלב 'אומר הממשלה".); הד PHP_EOL; אם (! _SERVER ($ ריקה [' HTTP_USER_AGENT '])) {echo " 

";

}

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

  1. נדר אומר:

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

  2. נדר אומר:

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

כתיבת תגובה













פנורמה Theme על ידי Themocracy

5 מבקרים מקוון עכשיו
3 אורחים, 2 בוטים, 0 חברים
מקס מבקרים היום: 11 בשעה 08:56 UTC
החודש: 47 ב 2011/03/10 02:47 UTC
השנה: 130 28-03-2011 בשעה 22:40 UTC
כל הזמן: 130 28-03-2011 בשעה 10:40 UTC