ראשי > observer pattern > חלק שני
The Observer

המבנה הכללי:
להלן המבנה הכללי של הobserver pattern . אם אינכם זוכרים את הסימונים בדיאגרמה זה הזמן
להתרענן .

לחצו להגדלה
לחץ להגדלה - observer

למעלה
מיהם החברים בחגיגה?:
  • Subject - יודע על ה observer - ים שלו. מספר כלשהו של אובייקטים יכול לצפות ב subject . מספק ממשק להוספה והסרה של observer-ים.
  • Observer - מגדיר ממשק לעדכון ושינוי עבור אובייקטים שאמורים להיות מיודעים בשינויים ב subject ולעדכן את עצמם בהתאם.
  • ConcreteSubject - מאחסן מידע ומצב שמעניינים את ה ConcreteObserver -ים. שולח הודעות ל observer-ים שלו כאשר מצבו משתנה.
  • ConcreteObserver - מחזיק reference ל ConcreteSubject . מאחסן מצב שאמור להיות מותאם למצבו של ה subject . מממש את הממשק שמגדיר ה Observer כדי לשמור על מצבו עקבי עם זה של ה subject .
למעלה
מתי נשתמש בobserver pattern?: למעלה
יחסי העבודה: למעלה
יתרונות וחסרונות:
ה observer pattern מאפשרת לערוך שינויים ב subject וב observers באופן בלתי תלוי. היא מאפשרת לעשות reuse ב subject בנפרד, וב observers בנפרד ללא תלות או קשר ביניהם. היא מאפשרת להוסיף observer ים מבלי לשנות את ה subject או את ה observer ים הקיימים. יתרונות וחסרונות נוספים:
  • Abstract coupling בין subject ל observer - כל מה ידוע ל subject זה שהוא מצביע לרשימה של observer ים, כל אחד מהם מציית לממשק של ה observer האבסטרקטי. ה subject לא מכיר את ה concrete class של אף observer. לכן ה coupling בין subject וobserver ים הוא מינימלי (ראו גם abstract coupling).

    השלכה אחת חיובית של זה היא שמכיוון שה coupling בין ה subject וה observer ים אינו הדוק, הם יכולים להשתייך לשכבות אבסטרקציה שונות במערכת שלנו. לדוגמה, subject מרמת אבסטרקציה נמוכה (למשל: אובייקט שמחזיק נתונים בגיליון אלקטרוני) יכול לתקשר עם observer מרמת אבסטרקציה גבוהה (למשל: האובייקט שמייצג את הגרף) ועל ידי כך נשמר המבנה השכבתי של המערכת. אם ה subject וה observer לא היו מופרדים, היינו נתקלים באחת משתי אפשרויות לא רצויות לנו: או שהאובייקט המתקבל היה נפרש על שתי שכבות, ובכך מפר את ה layering , או שהוא היה מאולץ לחיות בשכבה אחת בלבד ובכך מקשה עלינו להגיע לרמת האבסטרקציה המבוקשת.
  • תמיכה ב broadcast communication - בניגוד לבקשות רגילות, בהודעה ש subject שולח אין צורך לפרט למי היא מיועדת. היא משודרת אוטומטית לכל האובייקטים שמעונינים בה ונרשמו מראש על מנת לקבלה. ל subject זה לא חשוב כמה אובייקטים מעונינים קיימים ממנו שמחכים לשמוע הודעה. הוא פשוט משדר לכל מי ש"נרשם" אצלו. זה נותן חופש להוסיף ולהוריד observer ים בכל רגע נתון. ה observer עצמו יחליט אם לטפל בבקשה או להתעלם ממנה אך השידור מתבצע לכולם.
  • שרשרת עדכונים בלתי צפויים - מכיוון שה observer ים אינם יודעים אחד על קיומו של השני אין להם ידיעה לגבי המחיר הכולל של שינוי כלשהו שהם יערכו ב subject. פעולת עדכון קטנה ולא מזיקה למראית עין יכולה לגרום לשרשרת עדכונים של כל ה observer ים וכל האובייקטים התלויים בהם, וכן הלאה...
    במקרים חמורים יותר, יחסי תלות שאינם מוגדרים או מתוחזקים היטב עלולים להוביל לשרשראות של עדכונים מיותרים שקשה להתחקות אחריהם. אחד הגורמים שמחמירים בעיה זו היא העובדה שפרוטוקול עדכון פשוט אינו מפרט מה השתנה ב subject . ללא פרוטוקול נוסף שיעזור ל observer ים לגלות מה השתנה באובייקט הם עלולים לעבוד קשה במטרה לגלות מה היה השינוי.
למעלה







 
מה בעמוד:
 
המבנה
המשתתפים
מתי נשתמש
יחסי העבודה
בעד ונגד