Observer Design Pattern

 

Τύπος Pattern: Behavioral

Στο Observer pattern αυτό που θέλουμε να πετύχουμε είναι η ενημέρωση κάποιων αντικειμένων (observers) όταν αλλάζει η κατάσταση ενός αντικειμένου (subject).  Πιο αναλυτικά αν υποθέσουμε πως έχουμε έναν μετεωρολογικό σταθμό τον οποίο τα 7 κανάλια της τηλεόρασης συμβουλεύονται για να δείχνουν στην οθόνη τη θερμοκρασία.

Το πρόβλημα που δημιουργείται εδώ είναι πως αν θέλουν τα κανάλια να έχουν άμεση ενημέρωση θα πρέπει να είναι κάποιος σε μόνιμη επικοινωνία με τον μετεωρολογικό σταθμό και να ενημερώνει άμεσα τη θερμοκρασία που εμφανίζει η τηλεόραση. Αυτό σημαίνει πως πρέπει κάποιος να κάθετε στο τηλέφωνο 24 ώρες τη μέρα από το κανάλι.

Με το Observer ο μετεωρολογικός έχει μια λίστα με subscribers που τους ενδιαφέρει να ξέρουν πότε άλλαξε η θερμοκρασία. Όταν λοιπόν συμβεί μια αλλαγή ο σταθμός θα ενημερώσει όλα τα κανάλια που είναι subscribed με τη σχετική αλλαγή.

Για να το πετύχουμε αυτό θα πρέπει να έχουμε μια υπερκλάση Observer την οποία θα υλοποιούν όλα τα κανάλια που θέλουν να ενημερώνουν τη θερμοκρασία. Όλες λοιπόν οι υποκλάσης θα πρέπει να έχουν μια μέθοδο update.

Ο Subscriber θα μπορεί να προσθέσει ή να αφαιρέσει observers. Όταν λοιπόν γίνει η αλλαγή στη θερμοκρασία τρέχει την μέθοδο notifyObservers η οποία με τη σειρά της κάνει ένα iteration στο array με τους subscribers και για κάθε subscriber τρέχει τη μέθοδο update. Με αυτό το τρόπο γίνεται η ενημέρωση της θερμοκρασίας σε όλα τα κανάλια σχεδόν την ίδια στιγμή.



Παρακάτω ένας γενικευμένος κώδικας του observer pattern: