Πρότυπα Σχεδίασης Design Patterns Μεταπτυχιακό Πρόγραμμα Σπουδών, Τμ. Εφ. Πληροφορικής.

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Κληρονομικότητα. Εισαγωγή  Κληρονομικότητα (Inheritance) καλείται ο μηχανισμός με τον οποίο μία νέα κλάση που ονομάζεται παράγωγη (derived class) δημιουργείται.
Advertisements

Η Πράξη συγχρηματοδοτείται από το Ευρωπαϊκό Ταμείο Ενσωμάτωσης Τρίτων Χωρών Δήμητρα Καμπέλη Ηράκλειο, Σεπτέμβριος 2012.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Συλλογές, Στοίβες και Ουρές Σε πολλές εφαρμογές μας αρκεί η αναπαράσταση ενός δυναμικού συνόλου με μια δομή δεδομένων η οποία δεν υποστηρίζει την αναζήτηση.
Στοιχειώδεις Δομές Δεδομένων TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Τύποι δεδομένων στη Java • Ακέραιοι.
Γονικός έλεγχος Κ. Ξ. Γ. «ΛΙΟΛΙΟΥ». Γονικός έλεγχος •Ακόμη κι όταν δεν κρυφοκοιτάζετε, μπορείτε να θέσετε περιορισμούς στη χρήση του υπολογιστή από τα.
Αρχές Αντικειμενοστρεφούς Σχεδίασης Object – Oriented Design Principles Μεταπτυχιακό Πρόγραμμα Σπουδών, Τμ. Εφ. Πληροφορικής.
POINTERS, AGGREGATION, COMPOSITION. POINTERS TO OBJECTS.
Copyright ©: SAMSUNG & Samsung Hope for Youth. Με επιφύλαξη κάθε νόμιμου δικαιώματος Εκπαιδευτικό υλικό Λογισμικό: Δημιουργία εφαρμογών Επίπεδο.
Διαδικασία ανάπτυξης Προσδιορισμός απαιτήσεων Αρχιτεκτονικός Σχεδιασμός Λεπτομερής Σχεδιασμός Κωδικοποίηση Έλεγχος Παράδοση Συστήματος Λειτουργία - Συντήρηση.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΕΠΙΚΟΙΝΩΝΙΑ ΑΝΘΡΩΠΟΥ – ΜΗΧΑΝΗΣ Εαρινό Εξάμηνο 2007 Παρουσίαση Εργαλείου Ανάπτυξης JBuilder Τσουρού Σταυρούλα, ΑΜ 708 Μαδεμλής Ιωάννης, ΑΜ 669.
Κεφάλαιο 6 Threads. 2 Στον παραδοσιακό προγραμματισμό όταν ένα πρόγραμμα εκτελείται ονομάζεται process (διεργασία) και οι εντολές του εκτελούνται σειριακά.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Μήτρες (templates)  Μία μήτρα είναι ένα κομμάτι κώδικα που περιέχει παραμέτρους οι οποίες δέχονται ως τιμές τύπους δεδομένων.  Είναι ένας μηχανισμός.
Σχεδίαση-Ανάπτυξη Εφαρμογών Πληροφορικής Αντώνιος Συμβώνης, ΕΜΠ, Slide 1 Εβδομάδα 2: Υπο-τύποι και πολυμορφισμός [sub-typing and polymorphism]
Σχεδίαση-Ανάπτυξη Εφαρμογών Πληροφορικής Αντώνιος Συμβώνης, ΕΜΠ, Slide 1 Week 4: Exceptions Εβδομάδα 4: Εξαιρέσεις [Exceptions]
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Σύνθεση αντικειμένων Παράδειγμα: Τμήμα πανεπιστημίου.
Αρχιτεκτονική Συστημάτων
Μεθοδολογίες Προγραμματισμού ΙΙ Σχεδιαστικά Πρότυπα (1) Παναγιώτης Σφέτσος, PhD
1 Ολυμπιάδα Πληροφορικής Μάθημα 7. 2 Στόχοι μαθήματος Δημιουργία συναρτήσεων από το χρήστη Δομή προγράμματος με συναρτήσεις Συναρτήσεις και παράμετροι.
Πρότυπα Σχεδίασης Design Patterns Μεταπτυχιακό Πρόγραμμα Σπουδών, Τμ. Εφ. Πληροφορικής.
Πρότυπα Σχεδίασης Design Patterns
HMMY Τεχνολογία Λογισμικού Διδάσκων Κώστας Κοντογιάννης Αναπλ. Καθηγητής, Ε.Μ.Π.
Εισαγωγή στον αντικειμενοστραφή προγραμματισμό Κλάσεις και αντικείμενα Κλάσεις και αντικείμενα Κατασκευαστές κλάσεων (constructors) Κατασκευαστές κλάσεων.
ΙΟΝΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΤΜΗΜΑ ΑΡΧΕΙΟΝΟΜΙΑΣ ΚΑΙ ΒΙΒΛΙΟΘΗΚΟΝΟΜΙΑΣ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΑΣ " Διοίκηση και Οργάνωση Βιβλιοθηκών.
Ποιότητα Λογισμικού Ενότητα 3: Σουίτες Ελέγχων. Διδάσκων: Γεώργιος Κακαρόντζας, Καθηγητής Εφαρμογών. Τμήμα Μηχανικών Πληροφορικής, Τεχνολογικής Εκπαίδευσης.
Ποιότητα Λογισμικού Ενότητα 2: Παραμετρικοί έλεγχοι στο JUnit. Διδάσκων: Γεώργιος Κακαρόντζας, Καθηγητής Εφαρμογών. Τμήμα Μηχανικών Πληροφορικής, Τεχνολογικής.
Περίπτωση χρήσης: Process sale Από την ΠΧ στον κώδικα.
ΜΑΘΗΜΑ: ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C++ ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ Πέμπτη, 2 Απριλίου 2015Πέμπτη, 2 Απριλίου 2015Πέμπτη, 2 Απριλίου 2015Πέμπτη, 2 Απριλίου 2015Τμ.
Templates Standard Template Library (STL) Exceptions Μεταπτυχιακό Πρόγραμμα Σπουδών, Τμήμα Εφαρμοσμένης Πληροφορικής.
ΑΝΑΚΕΦΑΛΑΙΩΣΗ 26 Οκτωβρίου Αντικειμενοστρεφής Προγραμματισμός Ένα νέο προγραμματιστικό μοντέλο (paradigm) το οποίο στηρίζεται στις κλάσεις και τα.
3 Αρχιτεκτονική Συστημάτων  Κατηγορίες χρηστών ΣΔΒΔ  Αρχιτεκτονική ANSI/SPARC  Γλώσσες ερωτημάτων  Μοντέλα δεδομένων  Λειτουργίες ΣΔΒΔ.
Αρχές Αντικειμενοστρεφούς Σχεδίασης Object – Oriented Design Principles Μεταπτυχιακό Πρόγραμμα Σπουδών, Τμ. Εφ. Πληροφορικής.
Κεφάλαιο 10 – Υποπρογράμματα
ΟΡΙΣΜΟΣ ΣΥΜΠΕΡΙΦΟΡΑΣ ΔΙΑΓΡΑΜΜΑTA ΑΛΛΗΛΕΠΙΔΡΑΣΗΣ
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Πολυμορφισμός.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Πολυμορφισμός – Αφηρημένες κλάσεις Interfaces (διεπαφές)
Τμήμα Πληροφορικής και Τηλεπικοινωνιών
Threads Στον παραδοσιακό προγραμματισμό όταν ένα πρόγραμμα εκτελείται ονομάζεται process (διεργασία) και οι εντολές του εκτελούνται σειριακά η μία μετά.
Applets Εκτελούνται από τον appletviewer και από Java enabled web browsers Εκμεταλλεύονται τo γραφικό υπόβαθρο που παρέχουν οι browsers, έχοντας έτσι τη.
1 Κεφάλαιο 2 Εισαγωγή στον αντικειμενοστραφή προγραμματισμό.
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Αντικειμενοστραφής Προγραμματισμός Ι Ενότητα 9: Κληρονομικότητα. Διδάσκων: Νικόλαος Θ Λιόλιος, Καθηγητής. Τμήμα.
Τεχνολογία ΛογισμικούSlide 1 Τεχνολογία Απαιτήσεων u Καθορίζει τι θέλει ο πελάτης από ένα σύστημα λογισμικού.
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Αντικειμενοστραφής Προγραμματισμός Ι Ενότητα 6: Πίνακες και Παράμετροι στην main. Διδάσκων: Νικόλαος Θ Λιόλιος,
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα.
Αντικειμενοστραφής Προγραμματισμός Ι
ΑΝΩΤΑΤΟ ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΣΕΡΡΩΝ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ Τμήμα Μηχανικών Πληροφορικής ΤΕ ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ Κατασκευή Ιστοσελίδας Χρηματοοικονομικού.
Μπόλαρη Αγγελικη(1451) Επιβλέπων Βολογιαννίδης Σταύρος ΑΤΕΙ ΣΕΡΡΩΝ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΕΠΙΚΟΙΝΩΝΙΩΝ Σέρρες 2013.
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Αντικειμενοστραφής Προγραμματισμός Ι Ενότητα 10: Αφηρημένες τάξεις. Διδάσκων: Νικόλαος Θ Λιόλιος, Καθηγητής.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Πολυμορφισμός – Αφηρημένες κλάσεις Interfaces (διεπαφές) Ένα μεγάλο παράδειγμα.
Γλώσσες Προγραμματισμού Μεταγλωττιστές Πίνακας Συμβόλων Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου.
ΥΠΟΛΟΓΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ ΓΙΑ ΣΥΣΤΗΜΑΤΑ ΜΕΤΑΔΟΣΗΣ ΠΛΗΡΟΦΟΡΙΑΣ Αντικειμενοστραφής προγραμματισμός Web Site: ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ.
Οντοκεντρικός Προγραμματισμός
Εργαστηριακό σεμινάριο Χειμερινό εξάμηνο
Κατανεμημένα Συστήματα
Προγραμματισμός κινητών συσκευών
Κλάσεις και αντικείμενα
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Wrapper Classes, Abstract Classes and Interfaces
Εισαγωγή στον Προγ/μό Υπολογιστών
ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης
Ειδικά Θέματα στον προγραμματισμό Υπολογιστών
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Εφαρμογή Μεθοδολογίας ICONIX
ΕΙΣΑΓΩΓΗ ΣΤΗ UML ΕΙΣΑΓΩΓΗ ΣΤΗ UML.
Εξαιρέσεις [Exceptions]
Μεταγράφημα παρουσίασης:

Πρότυπα Σχεδίασης Design Patterns Μεταπτυχιακό Πρόγραμμα Σπουδών, Τμ. Εφ. Πληροφορικής

Visitor (Επισκέπτης) Κατηγορία: Behavioral Σκοπός: Η αναπαράσταση μιας λειτουργίας που πρόκειται να πραγματοποιηθεί στα στοιχεία μιας δομής αντικειμένων. Το πρότυπο επιτρέπει τον ορισμό μιας νέας λειτουργίας χωρίς την τροποποίηση των κλάσεων των στοιχείων στα οποία επιδρά. Συνώνυμα: -

Visitor (Επισκέπτης) Πρόβλημα: απαιτείται η προσθήκη νέας μεθόδου σε μία υπάρχουσα ιεραρχία κλάσεων αλλά είναι εξαιρετικά δύσκολο να τροποποιηθούν οι ίδιες οι κλάσεις της ιεραρχίας. Ιεραρχίες από στοιχεία "ελαφρού τύπου" (κλάσεις με περιορισμένες αρμοδιότητες) Νέα λειτουργικότητα μπορεί εύκολα να προστεθεί στην αρχική ιεραρχία, χωρίς την τροποποίηση των ίδιων των κλάσεων, μόνο με τη δημιουργία μιας νέας υποκλάσης στο πρότυπο "Επισκέπτης". Πρότυπο "Επισκέπτης": Μελέτες έχουν δείξει ότι είναι από τα δυσκολότερα στην κατανόηση. Γιατί ?

Visitor (Επισκέπτης) Υλοποιεί τη λεγόμενη "διπλή αποστολή" (double dispatch ή dual dispatch). Τα μηνύματα στον OOP κατά κανόνα επιδεικνύουν συμπεριφορά που αντιστοιχεί στην "απλή αποστολή": -η λειτουργία που εκτελείται εξαρτάται: - από το όνομα της αίτησης - τον τύπο του (μοναδικού) αποδέκτη Στη "διπλή αποστολή" η λειτουργία που εκτελείται εξαρτάται: - από το όνομα της αίτησης και - τον τύπο δύο αποδεκτών (στο συγκεκριμένο πρότυπο από τον τύπο του "Επισκέπτη" και τον τύπο του στοιχείου που επισκέπτεται).

Visitor (Επισκέπτης) Παράδειγμα: εφαρμογή η οποία διαχειρίζεται το εισόδημα (Income) και τις μέρες αδείας (Vacation Days) των υπαλλήλων μιας εταιρείας donwload αρχικό κώδικα από macedonia.uom.gr

Visitor (Επισκέπτης) Νέες απαιτήσεις: Υποθέτουμε ότι η εταιρεία εφαρμόζει μία πολιτική τροποποίησης των μισθών και αδειών σε τακτά χρονικά διαστήματα. Η τροποποίηση των κλάσεων είναι υπαρκτή δυνατότητα, αλλά δεν είναι ρεαλιστική. Φιλοσοφία: προσθήκη λειτουργικότητας χωρίς την αλλαγή του κώδικα υπαρχόντων κλάσεων. Υλοποίηση: Δημιουργία μίας ιεραρχίας κλάσεων Επισκέπτη (Visitor class hierarchy) η οποία ορίζει αμιγώς υπερβατές μεθόδους visit() στην αφηρημένη κλάση βάσης. Κάθε μέθοδος visit() λαμβάνει μία μοναδική παράμετρο – έναν δείκτη ή αναφορά προς μία κλάση της αρχικής ιεραρχίας.

Visitor (Επισκέπτης) Σχεδίαση: 1ο Στάδιο: Κάθε νέα λειτουργία μοντελοποιείται ως παράγωγος κλάσης της ιεραρχίας των Επισκεπτών. Οι αφηρημένες μέθοδοι visit() υλοποιούν την επιθυμητή λειτουργικότητα για τη συγκεκριμένη κλάση που δέχονται ως παράμετρο. Πώς λαμβάνει κάθε κλάση "Επισκέπτης" το δείκτη ή την αναφορά προς το στοιχείο που καλείται να εμπλουτίσει με νέα λειτουργικότητα? 2ο Στάδιο: προσθήκη αφηρημένης μεθόδου accept () στη βασική κλάση της πρωτότυπης ιεραρχίας. Η accept () λαμβάνει έναν δείκτη προς την αφηρημένη κλάση βάσης της ιεραρχίας των Επισκεπτών. Κάθε στοιχείο της πρωτότυπης ιεραρχίας, υλοποιεί την accept() καλώντας τη μέθοδο visit() του στιγμιοτύπου των Επισκεπτών που της δόθηκε ως παράμετρος, περνώντας τον "this" pointer.

Visitor (Επισκέπτης) Εφαρμογή: όταν ο πελάτης χρειάζεται να προσθέσει μία λειτουργία: Βήμα 1ο: δημιουργεί ένα στιγμιότυπο του αντικειμένου Επισκέπτη που αφορά στη συγκεκριμένη λειτουργικότητα. Βήμα 2ο: καλεί τη μέθοδο accept() σε κάθε στοιχείο της πρωτότυπης ιεραρχίας που επιθυμεί να εμπλουτίσει περνώντας ως όρισμα το αντικείμενο Επισκέπτη. Η μέθοδος accept() μέσω της "διπλής αποστολής" καθοδηγεί τη ροή του ελέγχου στην κατάλληλη κλάση Visitor και στη συνέχεια στην εκτέλεση της λειτουργικότητας στην επιθυμητή αρχική κλάση.

Visitor (Επισκέπτης) Διάγραμμα UML:

Visitor (Επισκέπτης) Παρατήρηση: Η προσθήκη νέων μεθόδων είναι πλέον σχετικά εύκολη – αρκεί η προσθήκη μιας νέας υποκλάσης στην ιεραρχία των Επισκεπτών. Ωστόσο, αν οι κλάσεις στην αρχική ιεραρχία δεν είναι σταθερές, τότε ο συγχρονισμός μεταξύ της ιεραρχίας των Επισκεπτών και της ιεραρχίας των αρχικών κλάσεων απαιτεί μεγάλη προσπάθεια, που ίσως να μη δικαιολογεί τη χρήση του προτύπου.

Visitor (Επισκέπτης) Γενική Δομή - Εφαρμογή: Χρησιμοποιείστε το πρότυπο σχεδίασης "Επισκέπτης" : όταν θέλετε να προσθέσετε λειτουργίες στα αντικείμενα μιας ιεραρχίας αντικειμένων χωρίς να "μολύνετε" τις κλάσεις τους με αυτές τις λειτουργίες. Το πρότυπο "Επισκέπτης" σας επιτρέπει να διατηρείτε σχετιζόμενες λειτουργίες σε ένα μέρος ορίζοντας αυτές σε μία ξεχωριστή κλάση. Διάγραμμα:

Visitor (Επισκέπτης)

Observer (Παρατηρητής) Κατηγορία: Behavioral Σκοπός: Ο ορισμός μιας σχέσης εξάρτησης ένα-προς-πολλά μεταξύ αντικειμένων έτσι ώστε όταν μεταβάλλεται η κατάσταση ενός αντικειμένου, όλα τα εξαρτώμενα αντικείμενα να ενημερώνονται και να τροποποιούνται αυτόματα. Συνώνυμα: Publish - Subscribe

Observer (Παρατηρητής) Στόχος της αντικειμενοστραφούς σχεδίασης είναι η δημιουργία ενός συνόλου αλληλεπιδρώντων αντικειμένων. Συχνό πρόβλημα: η αναγκαιότητα συνεργασίας μεταξύ κλάσεων, οδηγεί σε υψηλή σύζευξη. Ορισμένα από τα πρότυπα, με χαρακτηριστικότερο το πρότυπο "Παρατηρητής", επιδιώκουν να μειώσουν τη σύζευξη μεταξύ των αντικειμένων, παρέχοντας αυξημένη δυνατότητα επαναχρησιμοποίησης και τροποποίησης του συστήματος.

Observer (Παρατηρητής) Το συγκεκριμένο πρότυπο, επιτρέπει την αυτόματη ειδοποίηση και ενημέρωση ενός συνόλου αντικειμένων τα οποία "αναμένουν" ένα γεγονός, που εκδηλώνεται ως αλλαγή στην κατάσταση ενός αντικειμένου. Ο στόχος είναι η από-σύζευξη των παρατηρητών από το παρακολουθούμενο αντικείμενο, έτσι ώστε κάθε φορά που προστίθεται ένας νέος παρατηρητής (με διαφορετική διασύνδεση ενδεχομένως), να μην απαιτούνται αλλαγές στο παρακολουθούμενο αντικείμενο Το συγκεκριμένο πρότυπο είναι από τα πλέον ευρέως χρησιμοποιούμενα και υλοποιείται με σχετική ευκολία σε διάφορες γλώσσες προγραμματισμού. Το πρότυπο "Παρατηρητής" εφαρμόζεται για χρόνια στην γνωστή αρχιτεκτονική Μοντέλου-Όψεως-Έλεγκτή (Model-View-Controller)

Observer (Παρατηρητής) Η εφαρμογή του προτύπου προϋποθέτει τον εντοπισμό των εξής δύο τμημάτων: ενός υποκειμένου και του παρατηρητή. Μεταξύ των δύο υφίσταται μία συσχέτιση ένα-προς-πολλά Το υποκείμενο διατηρεί το μοντέλο των δεδομένων και η λειτουργικότητα που αφορά στην παρατήρηση των δεδομένων κατανέμεται σε διακριτά αντικείμενα – παρατηρητές. Οι παρατηρητές αυτό-καταχωρούνται στο υποκείμενο κατά τη δημιουργία. Οποτεδήποτε το υποκείμενο αλλάζει, "ανακοινώνει" προς όλους τους καταχωρημένους παρατηρητές το γεγονός της αλλαγής. Κάθε παρατηρητής ερωτά το υποκείμενο για το υποσύνολο της κατάστασης του υποκειμένου που το ενδιαφέρει Στο ανωτέρω πρωτόκολλο επικοινωνίας η πληροφορία "αντλείται" αντί να αποστέλλεται στους παρατηρητές,

Observer (Παρατηρητής) Παράδειγμα: Κλάση Timer που υλοποιεί ένα χρονόμετρο class Timer extends Subject { private int state; public int getState() { return state; } public void setState( int in ) { state = in; Notify(); }

Observer (Παρατηρητής) Αρχή Αντιστροφής των Εξαρτήσεων: Οι παρατηρητές δεν θα πρέπει να "βλέπουν" μία συγκεκριμένη κλάση, για αυτό και η Timer κληρονομεί μία αφηρημένη κλάση βάσης class Subject { private ArrayList observers = new ArrayList(); private int totalObs = 0; public void attach( Observer o ) { observers.add(o); //καταχώρηση παρατηρητή } public void detach( Observer o) { observers.remove( o ); } public void Notify() { for (int i=0; i < observers.size(); i++) ((Observer)observers.get(i)).update(); //ανακοίνωση αλλαγών στους παρατηρητές }

Observer (Παρατηρητής) Η τιμή του χρονομέτρου εμφανίζεται στην οθόνη από διάφορους παρατηρητές Όλοι οι παρατηρητές πρέπει να έχουν την ίδια διασύνδεση. Λύση: Κληρονομούν μία αφηρημένη βασική κλάση (Observer) abstract class Observer { public abstract void update(); }

Observer (Παρατηρητής) Οι παρατηρητές καταχωρούν τον εαυτό τους καλώντας την attach του υποκειμένου ( public void attach (Observer o) ) Αν ο παρατηρητής χρειάζεται περισσότερη πληροφορία, την "αντλεί" από το υποκείμενο class HexObserver extends Observer { private Timer subj; public HexObserver( Timer s ) { subj = s; subj.attach( this ); //Οι παρατηρητές καταχωρούν τον εαυτό τους } public void update() { System.out.print(" "+Integer.toHexString(subj.getState()) ); } //Οι παρατηρητές αντλούν πληροφορία }

Observer (Παρατηρητής)

H εφαρμογή του προτύπου έχει νόημα μόνο όταν η λίστα των παρατηρητών αλλάζει δυναμικά Ειδάλλως (αν για παράδειγμα το υποκείμενο επικοινωνεί πάντοτε με ένα συγκεκριμένο παρατηρητή) η σύζευξη μεταξύ τους κωδικοποιείται ως απλή συσχέτιση