תבנית הצופה בג'אווה

1. סקירה כללית

במאמר זה, אנו מתארים את דפוס ה- Observer ונבדוק כמה חלופות ליישום Java.

2. מהו דפוס הצופה?

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

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

בואו נראה איך נוכל ליישם את זה בעצמנו.

ראשית, בואו נגדיר את סוכנות ידיעות מעמד:

מעמד ציבורי NewsAgency {חדשות מחרוזות פרטיות; ערוצי רשימה פרטיים = ArrayList חדש (); addobbserver ציבורי ריק (ערוץ ערוץ) {this.channels.add (ערוץ); } בטל ציבורי removeObserver (ערוץ ערוץ) {this.channels.remove (ערוץ); } חלל ציבורי setNews (חדשות מחרוזת) {this.news = חדשות; עבור (ערוץ ערוץ: this.channels) {channel.update (this.news); }}}

סוכנות ידיעות הוא נצפה, ומתי חֲדָשׁוֹת מתעדכן, המצב של סוכנות ידיעות שינויים. כאשר השינוי קורה, סוכנות ידיעות מודיע למתבוננים על עובדה זו על ידי קריאה ל עדכון() שיטה.

כדי להיות מסוגל לעשות זאת, האובייקט הנצפה צריך לשמור הפניות למתבונניםובמקרה שלנו, זה ה ערוצים מִשְׁתַנֶה.

בוא נראה עכשיו איך המתבונן, ה עָרוּץ בכיתה, יכול להיראות כמו. זה צריך להיות עדכון() שיטה אשר מופעלת כאשר המצב של סוכנות ידיעות שינויים:

מחלקת הציבור NewsChannel מיישמת את הערוץ {חדשות מחרוזת פרטיות; @ עדכון ריקול ציבורי @ אובייקטי (חדשות אובייקט) {this.setNews ((מחרוזת) חדשות); }}

ה עָרוּץ לממשק יש רק שיטה אחת:

ממשק ציבורי ערוץ {עדכון חלל ציבורי (אובייקט o); }

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

NewsAgency נצפה = חדשות NewsAgency (); צופה ב- NewsChannel = NewsChannel חדש (); observable.addObserver (צופה); observable.setNews ("חדשות"); assertEquals (observer.getNews (), "חדשות");

יש הגדרה מראש מַשׁקִיף ממשק בספריות הליבה של Java, מה שהופך את יישום דפוס הצופה לפשוט עוד יותר. בואו נסתכל על זה.

3. יישום עם מַשׁקִיף

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

בואו נראה כיצד נוכל להשתמש בו ביישום שלנו:

הכיתה הציבורית ONewsChannel מיישמת את Observer {חדשות מחרוזות פרטיות; @ עדכון הריק הציבורי @ (תצפית, חדשות אובייקטים) {this.setNews ((מחרוזת) חדשות); }} 

כאן, הטיעון השני נובע נצפה כפי שנראה בהמשך.

להגדרת הנצפה, עלינו להאריך את Java נצפה מעמד:

מעמד ציבורי ONewsAgency מרחיב תצפית {חדשות מחרוזת פרטיות; בטל פומבי setNews (חדשות מחרוזות) {this.news = חדשות; setChanged (); הודיעו למשתתפים (חדשות); }}

שים לב שאנחנו לא צריכים להתקשר למתבונן עדכון() שיטה באופן ישיר. אנחנו פשוט מתקשרים setChanged () ו notifyObservers (), וה נצפה הכיתה עושה את השאר בשבילנו.

כמו כן, הוא מכיל רשימת משקיפים וחושף שיטות לקיים רשימה זו - addObserver () ו deleteObserver ().

כדי לבדוק את התוצאה, עלינו רק להוסיף את המשקיף לרשימה זו ולהגדיר את החדשות:

ONewsAgency נצפה = ONewsAgency חדש (); צופה ב- ONewsChannel = ONewsChannel חדש (); observable.addObserver (צופה); observable.setNews ("חדשות"); assertEquals (observer.getNews (), "חדשות");

מַשׁקִיף הממשק אינו מושלם ונגמר מאז ג'אווה 9. אחד החסרונות שלו הוא זה נצפה אינו ממשק אלא מחלקה, ולכן לא ניתן להשתמש בכיתות משנה כתצפיות.

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

בואו נסתכל על ProperyChangeListener ממשק, שמומלץ במקום להשתמש בו מַשׁקִיף.

4. יישום עם PropertyChangeListener

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

בואו נגדיר את הנצפה:

מחלקה ציבורית PCLNewsAgency {חדשות מחרוזות פרטיות; תמיכה פרטית ב- PropertyChangeSupport; ציבורי PCLNewsAgency () {support = new PropertyChangeSupport (this); } בטל ציבורי addPropertyChangeListener (PropertyChangeListener pcl) {support.addPropertyChangeListener (pcl); } חלל ציבורי removePropertyChangeListener (PropertyChangeListener pcl) {support.removePropertyChangeListener (pcl); } public void setNews (ערך מחרוזת) {support.firePropertyChange ("חדשות", this.news, value); this.news = ערך; }}

באמצעות זה תמיכה, אנו יכולים להוסיף ולהסיר משקיפים ולהודיע ​​להם כאשר מצב התצפית משתנה:

support.firePropertyChange ("חדשות", this.news, ערך);

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

על המשקיפים ליישם PropertyChangeListener:

מחלקה ציבורית PCLNewsChannel מיישמת PropertyChangeListener {חדשות מחרוזת פרטיות; public void propertyChange (PropertyChangeEvent evt) {this.setNews ((String) evt.getNewValue ()); }}

בשל PropertyChangeSupport בכיתה שעושה עבורנו את החיווט, נוכל להחזיר את ערך הנכס החדש מהאירוע.

בואו לבדוק את היישום כדי לוודא שהוא עובד גם:

PCLNewsAgency נצפה = PCLNewsAgency חדש (); PCLNewsChannel צופה = PCLNewsChannel חדש (); observable.addPropertyChangeListener (צופה); observable.setNews ("חדשות"); assertEquals (observer.getNews (), "חדשות");

5. מסקנה

במאמר זה בחנו שתי דרכים ליישום ה- מַשׁקִיף דפוס עיצוב בג'אווה, עם PropertyChangeListener גישה מועדפת.

קוד המקור של המאמר זמין באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found