Πίνακας περιεχομένων:
Βίντεο: J Krishnamurti - The Real Revolution - 2. Observing ourselves 2024
Το μοτίβο σχεδίασης Observer επιτρέπει την ενημέρωση πολλών αντικειμένων παρατηρητή όταν κάποιος αντικειμενικός σκοπός αλλάζει με κάποιο τρόπο. Κάθε παρατηρητής καταχωρεί με το θέμα και όταν εμφανιστεί μια αλλαγή, το θέμα τους ειδοποιεί όλους. Κάθε ένας από τους παρατηρητές κοινοποιείται παράλληλα (δηλαδή, ταυτόχρονα).
Δημιουργία διεπαφής θέμα
Όταν εφαρμόζετε ένα μοτίβο σχεδίασης, είναι συχνά καλή ιδέα να ξεκινήσετε δημιουργώντας μια διεπαφή για να βεβαιωθείτε ότι τα αντικείμενα που δημιουργείτε θα τηρούν το μοτίβο που προσπαθείτε να χρησιμοποιήσετε - ειδικά εάν υπάρχουν πολλά αντικείμενα. Η υλοποίηση αυτής της διασύνδεσης - ο προγραμματισμός σε μια διεπαφή όπως λέγεται - διατηρεί τον κώδικα σας στη γραμμή και συνήθως διατηρεί τα πράγματα πιο ξεκάθαρα.
Όταν τοποθετείτε το πρότυπο Observer σε κώδικα, ρυθμίστε μια διεπαφή ή μια αφηρημένη κλάση για τους παρατηρητές. συνήθως θα έχετε πολλούς παρατηρητές και θα πρέπει να διατηρείτε συνεπείς τις μεθόδους που εφαρμόζουν.
Σε αυτό το παράδειγμα, πρέπει επίσης να ρυθμίσετε μια διεπαφή για το θέμα, κάτι που παρακολουθούν οι παρατηρητές. η διεπαφή Θέματος αναφέρει τις μεθόδους που πρέπει να εφαρμόσουν τα θέματα. Βάλτε εδώ μια μέθοδο RegisterSbserver έτσι ώστε το θέμα να μπορεί να παρακολουθεί τους παρατηρητές που θέλουν να εγγραφούν. Εκτός από την εγγραφή παρατηρητών, θα πρέπει να έχετε κάποιο τρόπο να απαλλαγείτε από αυτά, ώστε να προσθέσετε μια μέθοδο removalObserver. Και υπάρχει μια μέθοδος notifyObservers που θα ειδοποιήσει τους παρατηρητές για κάποια αλλαγή.
δημόσια διεπαφή Θέμα
{
δημόσιο κενό registerObserver (Observer o);
δημόσιο κενό removeObserver (Observer o);
public void notifyObservers ();
}
Αυτή η διεπαφή απαριθμεί τις μεθόδους που θα πρέπει να εφαρμόσουν τα θέματα όπως το σύστημα βάσης δεδομένων. Έπειτα επάνω: η διεπαφή για τους παρατηρητές.
Δημιουργία διεπαφής παρατηρητή
Η κατασκευή της διεπαφής Observer, την οποία εφαρμόζουν οι παρατηρητές για να τους επιτρέψει να λαμβάνουν ειδοποιήσεις, είναι απλή. Το μόνο που χρειάζεστε είναι μια μέθοδος που θα καλείται όταν είναι έτοιμη μια νέα ειδοποίηση (μπορείτε να καλέσετε αυτήν την ενημέρωση μεθόδου). Σε αυτό το παράδειγμα, περάσατε τη λειτουργία της βάσης δεδομένων που εκτελέστηκε (όπως "επεξεργασία", "διαγραφή", "δημιουργία" κ.ο.κ.) και την εγγραφή που άλλαξε ως συμβολοσειρές στη μέθοδο ενημέρωσης.
δημόσιο περιβάλλον παρατηρητή
{
δημόσια άκυρη ενημέρωση (λειτουργία στοιχειοσειράς, εγγραφή κορδονιών);
}
Όταν οι παρατηρητές εφαρμόζουν τη μέθοδο ενημέρωσης, το θέμα είναι σε θέση να τους περάσει το αρχείο που επηρεάστηκε και τη λειτουργία που εκτελέστηκε.
Εντάξει, είστε καλό να πάτε. Ήρθε η ώρα να δημιουργήσετε το θέμα της βάσης δεδομένων που θα παρακολουθεί τους παρατηρητές και θα τους ενημερώνει όταν θα υπάρξει αλλαγή.
Δημιουργία ενός θέματος
Το θέμα πρέπει να επιτρέψει στους παρατηρητές να εγγραφούν και να τις ειδοποιήσουν όταν συμβεί κάποιο γεγονός. Σύμφωνα με τη διεπαφή θέμα, οι τρεις μέθοδοι που ένα θέμα πρέπει να εφαρμόσει σε αυτά τα παραδείγματα είναι: registerObserver, removeObserver και notifyObservers. Αυτό ακριβώς κάνει η κλάση Βάσεων Δεδομένων σε αυτό το παράδειγμα.
Για να παρακολουθείτε τους παρατηρητές, χρησιμοποιήστε ένα διάνυσμα Java που ονομάζεται παρατηρητής και δημιουργήθηκε στον κατασκευαστή βάσης δεδομένων. (Ο προσδιοριστής τύπου εδώ, είναι για το Java 1. 5 ή νεότερη έκδοση και υποδεικνύει ότι κάθε αντικείμενο παρατηρητή υλοποιεί τη διεπαφή Observer · αν χρησιμοποιείτε προηγούμενη έκδοση Java, παραλείψτε τον προσδιοριστή τύπου.)
Εισαγωγή java. χρήσιμο. *;
Δημόσια τάξη υλοποιεί Βάση δεδομένων
{
ιδιωτικοί παρατηρητές Vector.
Δημόσια Βάση Δεδομένων ()
{
παρατηρητές = new Vector ();
}
.
.
.
}
Όταν χρησιμοποιείτε ένα διάνυσμα, η παρακολούθηση των παρατηρητών είναι απλή. Όταν ένας παρατηρητής θέλει να εγγραφεί, ονομάζει τη μέθοδο registerSbserver του θέματος, περνώντας τον εαυτό του ως αντικείμενο. Το θέμα - ένα αντικείμενο της κλάσης βάσης δεδομένων μας - πρέπει απλώς να προσθέσει αυτόν τον παρατηρητή στο φορέα παρατηρητών στη μέθοδο registerSbserver, χρησιμοποιώντας τη μέθοδο προσθήκης της κλάσης Vector.
εισαγωγή java. χρήσιμο. *;
Δημόσια τάξη υλοποιεί Βάση δεδομένων
{
ιδιωτικοί παρατηρητές Vector.
Δημόσια Βάση Δεδομένων ()
{
παρατηρητές = new Vector ();
}
public void registerObserver (παρατηρητής o)
{
παρατηρητές. προσθέστε (o);
}
.
.
.
}
Πώς να αφαιρέσετε έναν παρατηρητή από τον φορέα παρατηρητών; Κανένα πρόβλημα. Όταν θέλετε να καταργήσετε ένα αντικείμενο από ένα διάνυσμα, μπορείτε να χρησιμοποιήσετε τη μέθοδο αφαίρεσης του διανύσματος. εδώ είναι πώς λειτουργεί στη μέθοδο removalObserver της κλάσης βάσης δεδομένων:
εισαγωγή java. χρήσιμο. *;
Δημόσια τάξη υλοποιεί Βάση δεδομένων
{
ιδιωτικοί παρατηρητές Vector.
Δημόσια Βάση Δεδομένων ()
{
παρατηρητές = new Vector ();
}
public void registerObserver (παρατηρητής o)
{
παρατηρητές. προσθέστε (o);
}
public void removeObserver (παρατηρητής o)
{
παρατηρητές. αφαίρεση (o);
}
.
.
.
}
Όταν ο χρήστης πράγματι κάνει κάτι με τη βάση δεδομένων - διαγράφει μια εγγραφή, για παράδειγμα - ονομάζει τη μέθοδο editRecord της κλάσης βάσης δεδομένων. Για παράδειγμα, για να διαγράψετε την εγγραφή 1, μπορείτε να καλέσετε αυτή τη μέθοδο όπως αυτή: βάση δεδομένων
. editRecord ("διαγραφή", "εγγραφή 1");
Ακολουθεί το παράδειγμα της μεθόδου editRecord: Όταν καλείται αυτή η μέθοδος, θα της δώσετε τη λειτουργία της βάσης δεδομένων που θέλετε να εκτελέσετε και την εγγραφή στην οποία θέλετε να εργαστείτε, τόσο ως συμβολοσειρές σε αυτό το παράδειγμα. Αυτές οι χορδές αποθηκεύονται έτσι ώστε να μπορούν να μεταφερθούν στους παρατηρητές. Μετά την αποθήκευση των συμβολοσειρών, η μέθοδος notifyObservers, που θα εμφανιστεί στη συνέχεια, καλείται να ειδοποιήσει όλους τους παρατηρητές.
εισαγωγή java. χρήσιμο. *;
Δημόσια τάξη υλοποιεί Βάση δεδομένων
{
ιδιωτικοί παρατηρητές Vector.
ιδιωτική λειτουργία String;
ιδιωτικό αρχείο String;
Δημόσια Βάση Δεδομένων ()
{
παρατηρητές = new Vector ();
}
.
.
.
δημόσιο κενό editRecord (λειτουργία String, εγγραφή String)
{
αυτό.λειτουργία = λειτουργία;
αυτό. εγγραφή = εγγραφή;
notifyObservers ();
}
}
Εδώ είναι το κρέας του κώδικα, το μέρος που ειδοποιεί κάθε παρατηρητή ότι υπάρχει μια αλλαγή: η μέθοδος notifyObservers. Κάθε παρατηρητής εφαρμόζει τη διεπαφή Observer αυτού του παραδείγματος - που σημαίνει ότι έχει μια μέθοδο ενημέρωσης - έτσι το notifyObservers πρέπει απλώς να βγάλει πάνω από όλους τους εγγεγραμμένους παρατηρητές στον φορέα παρατηρητών, καλώντας τη μέθοδο ενημέρωσης του καθενός με τη λειτουργία της βάσης δεδομένων και την πληγείσα εγγραφή.
εισαγωγή java. χρήσιμο. *;
Δημόσια τάξη υλοποιεί Βάση δεδομένων
{
ιδιωτικοί παρατηρητές Vector.
ιδιωτική λειτουργία String;
ιδιωτικό αρχείο String;
.
.
.
public void notifyObservers ()
{ για (int loopIndex = 0; loopIndex <παρατηρητές. get (loopIndex);
παρατηρητής. ενημέρωση (λειτουργία, εγγραφή);
}
}
δημόσιο void editRecord (λειτουργία String, εγγραφή String)
{
αυτό. λειτουργία = λειτουργία;
αυτό. εγγραφή = εγγραφή;
notifyObservers ();
}
}
Αυτό είναι όλο που χρειάζεστε για βάση δεδομένων. java, το θέμα σε αυτό το παράδειγμα. Το θέμα θα επιτρέψει στους παρατηρητές να εγγραφούν οι ίδιοι, να διαγραφούν και να ενημερωθούν όταν έχει γίνει επεξεργασία μιας εγγραφής βάσης δεδομένων (που κάνετε με τη μέθοδο editRecord της κλάσης βάσης δεδομένων). Το μόνο που έχει να κάνει για να πάρει αυτή την παράσταση στο δρόμο είναι να δημιουργήσει τους ίδιους τους παρατηρητές.