תבנית צופה

מתוך ויקיפדיה, האנציקלופדיה החופשית

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

שימושים[עריכת קוד מקור | עריכה]

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

מבנה[עריכת קוד מקור | עריכה]

UML של תבנית צופה

יתרונות וסיכונים[עריכת קוד מקור | עריכה]

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

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

דוגמה[עריכת קוד מקור | עריכה]

להלן דוגמת בשפת Java שבה קלט המקלדת מטופל עבור כל שורה באמצעות תבנית צופה. הדוגמה מבוססת על שימוש בספריות java.util.Observer ו-java.util.Observable. כאשר ניתן קלט של מחרוזת ל-System.in, נקראת הפונקציה notifyObservers, שמיידעת את כל הצופים על האירוע (הקלט), באמצעות קריאה לפונקציית 'update' שלהם.

import java.util.Observable;
import java.util.Scanner;

class EventSource extends Observable implements Runnable {
    public void run() {
        while (true) {
            String response = new Scanner(System.in).next();
            setChanged();
            notifyObservers(response);
        }
    }
}
import java.util.Observable;
import static java.lang.System.out;

class MyApp {
    public static void main(String[] args) {
        out.println("Enter Text >");
        EventSource eventSource = new EventSource();

        eventSource.addObserver((Observable obj, Object arg) -> { 
            out.println("\nReceived response: " + arg);
        });

        new Thread(eventSource).start();
    }
}

קישורים חיצוניים[עריכת קוד מקור | עריכה]

ויקישיתוף מדיה וקבצים בנושא תבנית צופה בוויקישיתוף