PHP τα σχεδιαστικά πρότυπα - Pattern Παρατηρητής
Έχω ανάγνωση Head First Design Patterns πρόσφατα και αποφάσισε να γράψει μερικά από τα μοτίβα όπως PHP παραδείγματα προς όφελός μου. Το πρώτο που έχω αποφασίσει να κωδικός επάνω είναι η Παρατηρητής Pattern . Ο επίσημος ορισμός των παρατηρητών Pattern είναι:
Το μοτίβο του παρατηρητή (ένα υποσύνολο της ασύγχρονης δημοσιεύσεων / συνδρομών μοτίβο ) είναι ένα λογισμικό πρότυπο σχεδιασμού στην οποία ένα αντικείμενο , που ονομάζεται το θέμα, διατηρεί μια λίστα των εξαρτωμένων του, κάλεσε τους παρατηρητές, και ενημερώνει τους αυτόματα τυχόν αλλαγές της κατάστασης, συνήθως με την κλήση ένας από τους μεθόδους . Χρησιμοποιείται κυρίως για την υλοποίηση κατανεμημένων συστημάτων χειρισμού συμβάντος.
Καθώς τα συστήματα γίνονται πιο χαλαρά συνδεδεμένες να διασφαλίσουμε ότι, όταν ένα γεγονός που συμβαίνει σε όλα τα συστήματα που απαιτούν τη γνώση αυτών των ενημερωμένων εκδόσεων είναι ενημερωμένοι. Για παράδειγμα, ένα blog post, μετά από την αποθήκευση μια θέση που μπορεί να χρειαστεί να ενημερώσετε μια μηχανή αναζήτησης (π.χ. Lucene), ενημέρωση sitemap, ετικέτες μας, e-mail εγγεγραμμένους χρήστες, κλπ. Το μοτίβο του παρατηρητή επιτρέπει στους προγραμματιστές να προσθέσουν επιπλέον ακροατές χωρίς μοντάζ παρατηρήσιμο αντικείμενο . Με την ένεση παρατηρητές (δηλαδή μια μηχανή αναζήτησης παρατηρητή ενημέρωση, μια γεννήτρια sitemap, κλπ) σε ένα θέμα (δηλ. μετά το σύστημα μοντάζ blog) μπορούμε να επιτρέψουμε τη φέρει σε πέρας όλες τις απαραίτητες ενημερώσεις χωρίς καμία αλλαγή.
Πριν από το πρότυπο Observer εντοπίστηκε το συνηθισμένο τέχνασμα θα ήταν να ενημερώσετε το παρατηρήσιμο αντικείμενο με μια πρόσθετη γραμμή κώδικα για να ενημερώσετε το απαιτούμενο σύστημα και την κατάργηση του γραμμή του κώδικα, όπως απαιτείται. Αυτό δεν επιτρέπει την εύκολη προσθήκη και την αφαίρεση των παρατηρητών.
Το θέμα ενημερώσεις όλων των παρατηρητών της, μέσω ενός μέθοδο ενημέρωσης. Η μέθοδος αυτή ενημερωμένη έκδοση απαιτεί μια μέθοδο, σε κάθε παρατηρητή, η οποία προέρχεται από την εφαρμογή μιας διεπαφής. Οι παρατηρητές μπορούν να προσθέσουν μια ίδιοι αφαίρεση μέσω μεθόδων κατά το παρατηρήσιμο αντικείμενο.
Αυτό είναι βασικά το! Πάντα βρίσκω ένα παράδειγμα να είναι η καλύτερη μέθοδος για την εκμάθηση και κατανόηση της έννοιας τόσο εδώ είναι μου κωδικοποιημένες μέχρι παράδειγμα ...
Παρατηρητής Pattern σε PHP
Στο παράδειγμά μου, έχω δημιουργήσει ένα σύστημα ειδήσεων (NewsAggregator), η οποία στέλνει headline ενημερώσεις ειδήσεων σε μικρότερα news feeds. Εδώ το sytem είδηση παίρνει τη θέση του θέματος, Παρατηρήσιμες, κλπ ενώ τα news feeds αναλάβει το ρόλο των παρατηρητών ή ακροατές.
Μόλις αρχικοποιηθεί παρατηρητές να επισυνάψετε και βγάλτε τους από το θέμα του κατά το δοκούν. Στο παράδειγμά μου έχω δημιουργήσει τρεις παρατηρητές, οι εν λόγω σαρώσει τους τίτλους που απεστάλησαν από το αντικείμενο και το «φωνάζει» την είδηση περίπτωση του. Οι τρεις παρατηρητές που κατονομάζεται κατωτέρω, μαζί με τους όρους που τομογραφία για κατά τη λήψη τίτλοι ειδήσεων:
- τένις "» ράγκμπι », Sport Παρατηρητής:« ποδόσφαιρο »,
- Νέα Παρατηρητής: «πολιτική», «χρηματοδότηση», «κυβέρνηση»
- μόδας »« διασημότητα », Gossip Παρατηρητής:« μουσική »,
Μετά initalising το θέμα μπορώ να προσθέσω τους παρατηρητές ειδήσεις και κουτσομπολιά και να στείλει μια ενημέρωση ειδήσεων. Μετά από αυτό ο παρατηρητής άθλημα προστίθεται πριν από την πιο ενημερώσεις έστειλε. Τέλος ο παρατηρητής κουτσομπολιά αφαιρείται πριν από την τελική τίτλων ειδήσεων σταλεί.
Οι τρεις διαφορετικές κατηγορίες παρατηρητή εφαρμόσει τη διασύνδεση Observer, αυτό τους δίνει μια σαφή διασύνδεση / μέθοδος μέσω της οποίας θα λαμβάνετε ενημερώσεις. Υπό τον όρο με τον οποίο εφαρμόζουν τη διασύνδεση των παρατηρητών θα είναι σε θέση να προσκολληθούν στο θέμα. Αυτό κρατά επίσης με το πρότυπο προγραμματισμό του «προγράμματος για τις διασυνδέσεις που δεν υλοποιήσεις». Η τάξη NewsAggregator επεκτείνει την αφηρημένη Θέμα τάξη, η οποία μας παρέχει τις τρεις απαιτούμενες δημόσιες μεθόδους:
- updateObservers ()
- addObserver ()
- removeObserver ()
Ο κωδικός μπορεί να δει τρέχει εδώ, Παρατηρητής Pattern στην PHP τρέξιμο , ενώ ο κωδικός μπορείτε να το κατεβάσετε από εδώ, Παρατηρητής Pattern στην PHP κώδικα .
Παρατηρητής Script
<? Php / ** * Αυτό το αρχείο περιέχει τους παρατηρητές * * @ Συγγραφέας Λόιντ Watkin * @ Δεδομένου 2009/12/23 * / Θέμα αφηρημένη τάξη { αφηρημένη δημόσια addObserver λειτουργία (Παρατηρητής $ παρατηρητής)? αφηρημένη δημόσια removeObserver λειτουργία (Παρατηρητής $ παρατηρητής)? αφηρημένη δημόσια updateObservers λειτουργία ($ newsHeadline)? } / ** * Αυτό είναι το θέμα τάξης για το παράδειγμα * * @ Συγγραφέας Λόιντ Watkin * @ Δεδομένου 2009/12/23 * / τάξη ArticleAggregator επεκτείνει Θέμα { / ** * Κατέχει κατάλογο των παρατηρητών μας * * @ Var συστοιχία * / προστατεύονται $ _observerList = array ()? / ** * Η μέθοδος για να προσθέσετε έναν παρατηρητή * * @ $ Var Παρατηρητής του παρατηρητή * Άκυρη επιστροφή @ * / δημόσια addObserver λειτουργία (Παρατηρητής $ παρατηρητής) { $ This-> _observerList [] = $ παρατηρητή? } / ** * Μέθοδος για την απομάκρυνση ενός παρατηρητή * * @ $ Var Παρατηρητής του παρατηρητή * Boolean επιστροφής @ * / δημόσια removeObserver λειτουργία (Παρατηρητής $ παρατηρητής) { foreach ($ this-> _observerList AS $ key => $ ob) { if ($ ob == $ παρατηρητή) { unset ($ this-> _observerList [$ key])? return true? } } return false? } / ** * Η μέθοδος για την ενημέρωση των παρατηρητών * * @ Var $ string newsHeadline * Άκυρη επιστροφή @ * / δημόσια updateObservers λειτουργία ($ newsHeadline) { foreach ($ this-> _observerList AS $ ob) { $ Ob-> ενημέρωσης ($ newsHeadline)? } } / ** * Προστίθεται μια νέα είδηση * * @ Var $ string ιστορία * Άκυρη επιστροφή @ * / δημόσια addNewsStory λειτουργία ($ ιστορία) { αν (κενό ($ ιστορία) | |! is_string ($ ιστορία)) { ρίξει νέο InvalidArgumentException («αναμενόμενη μια είδηση! ')? } $ This-> updateObservers ($ ιστορία)? } }
Θέμα / Παρατηρήσιμες Script
; <Php / ** * Το αρχείο αυτό περιέχει το αντικείμενο * * @ συγγραφέας Λόιντ Watkin * @ διότι 2009/12/23 * / αφηρημένη Θεματική κατηγορία {αφηρημένη δημόσια addObserver λειτουργία (Παρατηρητής $ παρατηρητής)? Αφηρημένη δημόσια removeObserver λειτουργία (Παρατηρητής $ παρατηρητή )? αφηρημένη δημόσια updateObservers λειτουργία ($ newsHeadline)?} / * ** Αυτό είναι το θέμα τάξης για το παράδειγμα * @ συγγραφέας Λόιντ Watkin * @ διότι 2009/12/23 * / κλάση ArticleAggregator επεκτείνει Θέμα {/ ** * Συγκρατεί κατάλογο των παρατηρητών * * μας @ var * array / προστατεύεται $ _observerList = array ()? / ** * Μέθοδος για την προσθήκη ενός παρατηρητή * * @ επιστροφή var Παρατηρητής $ * παρατηρητή @ * άκυρο / δημόσια addObserver λειτουργία (Παρατηρητής $ παρατηρητής) {$ this-> _observerList [] = $ παρατηρητή?} / ** * μέθοδος για την απομάκρυνση ενός παρατηρητή * * @ $ var Παρατηρητής * παρατηρητή @ επιστροφή * boolean / δημόσια removeObserver λειτουργία (Παρατηρητής $ παρατηρητής) {foreach ($ this-> _observerList AS $ key => $ ob) {if ($ ob == $ παρατηρητής) {unset ($ this-> _observerList [$ key])? επιστρέψουν αλήθεια?}} return false?} / ** * Μέθοδος για την ενημέρωση των παρατηρητών * * @ var $ string newsHeadline * @ επιστροφή * άκυρο / δημόσια updateObservers λειτουργία ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ ob-> ενημέρωσης ($ newsHeadline)?}} / ** * Προσθήκη μια νέα είδηση * * @ var $ string ιστορία * @ επιστροφή * άκυρο / δημόσια addNewsStory λειτουργία ($ ιστορία) {εάν (κενό ($ ιστορία) | |! is_string ($ ιστορία)) {ρίξει νέο InvalidArgumentException («αναμενόμενη μια είδηση ιστορία »)?!} $ this-> updateObservers ($ ιστορία)?}} Ελεγκτής Script
<? Php / ** * Σχεδιασμός Παρατηρητής Παράδειγμα Pattern * * @ Συγγραφέας Λόιντ Watkin * @ Δεδομένου 2009/12/23 * Http://www.evilprofessor.co.uk σύνδεσμο @ * / περιλαμβάνουν «observers.php»? περιλαμβάνουν «subject.php»? if (! άδειο ($ ['HTTP_USER_AGENT'] _SERVER)) { echo "»? } / / Τι κάνουμε; «Παρατηρητής Παράδειγμα μοτίβο στην PHP» ηχώ. PHP_EOL? echo'================================'. PHP_EOL? / / Ρύθμιση θέμα μας $ Subject = νέα ArticleAggregator ()? echo "- ArticleAggregator δημιούργησε». PHP_EOL? / / Προσθήκη ορισμένων παρατηρητών $ Θέμα-> addObserver (νέα NewsObserver ())? $ Θέμα-> addObserver ($ κουτσομπόλης = νέα GossipObserver ())? echo "- Προστέθηκε NewsObverser & GossipObserver». PHP_EOL. PHP_EOL? / / Μπιπ, μπιπ, μπιπ ... News Flash! echo "Newsflash: διασημότητα παίκτη ράγκμπι αγαπά τη χρηματοδότηση». PHP_EOL? echo'================================================ ». PHP_EOL? $ Θέμα-> addNewsStory («διασημότητα παίκτη ράγκμπι αγαπά τη χρηματοδότηση ')? echo PHP_EOL? echo '- SportObserver το έχουν ανακαλύψει και θέλει να ενταχθεί στην ομάδα! "? $ Θέμα-> addObserver (νέα SportObserver ())? echo PHP_EOL. PHP_EOL? / / Μπιπ, μπιπ, μπιπ ... News Flash! echo "Newsflash: κυβέρνηση των λεσχών και πάλι!" . PHP_EOL? echo'======================================='. PHP_EOL? $ Θέμα-> addNewsStory («κυβέρνηση των λεσχών και πάλι! ')? echo PHP_EOL? / / Μπιπ, μπιπ, μπιπ ... News Flash! echo "Newsflash: μόδα και ποδόσφαιρο συνδυάζουν». PHP_EOL? echo'======================================='. PHP_EOL? $ Θέμα-> addNewsStory («της μόδας και του ποδοσφαίρου συνδυάζουν ')? echo PHP_EOL? / / Μπιπ, μπιπ, μπιπ ... News Flash! echo "Newsflash: τη μουσική και την πολιτική, τι θα ακολουθήσει;" . PHP_EOL? echo'=========================================='. PHP_EOL? («Μουσική και πολιτική, τι θα ακολουθήσει;") $ θέμα-> addNewsStory? echo PHP_EOL? / ** * Κουτσομπόληδες αυξηθεί κουρασμένος των ειδήσεων πολύ γρήγορα και έχουν αποφασίσει * Να σταματήσει να ακούει, παρ 'όλες τις ενδιαφέρουσες ειδήσεις σήμερα! * / echo "- GossipObserver βαριέται και αφήνει την ομάδα!" . PHP_EOL. PHP_EOL? $ Θέμα-> removeObserver ($ κουτσομπόλης)? / / Μπιπ, μπιπ, μπιπ ... Σύντομα Νέα - Ενημέρωση σε μια προηγούμενη ιστορία! echo 'NewsUpdate: μόδα και ποδόσφαιρο συνδυάζουν λέει ». «Κυβέρνηση». PHP_EOL? echo'================================================ ». '========='. PHP_EOL? $ Θέμα-> addNewsStory («της μόδας και του ποδοσφαίρου συνδυάζουν». », Λέει η κυβέρνηση»)? echo PHP_EOL? if (! άδειο ($ ['HTTP_USER_AGENT'] _SERVER)) { echo "»?
}



















































Γεια σας,
Πρώτον, τα αγγλικά μου είναι πολύ κακή, τότε
Μπορείτε να μου πείτε ποιο είναι το σύστημα στην εικόνα;
Fedora 12;
Ποιο είναι το θέμα;
Γεια σας,
Μπορείτε να μου πείτε ποιο είναι το σύστημα στην εικόνα;
Fedora 12;
Ποιο είναι το θέμα;
fedora του 11 με το KDE εφαρμογή. Glasslooks θέμα πιστεύω.