תבנית צופה

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

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

מבנה

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

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

דוגמה

להלן דוגמת בשפת 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();
    }
}

קישורים חיצוניים

תבניות עיצוב