Design Patterns PHP - Pattern Observer
Ho letto Head First Design Patterns di recente e hanno deciso di scrivere alcuni dei modelli come esempi PHP per il mio vantaggio. Il primo che ho deciso di codice up è il pattern Observer . La definizione formale del pattern Observer è:
Il pattern Observer (un sottoinsieme del asincrona publish / subscribe pattern ) è un software modello di progettazione in cui un oggetto , denominato in materia, mantiene una lista di suoi dipendenti, gli osservatori chiamati, e segnala in modo automatico di eventuali cambiamenti di stato, di solito chiamando uno dei loro metodi . E 'principalmente utilizzato per implementare sistemi distribuiti di gestione degli eventi.
Poiché i sistemi diventano più debolmente accoppiati facendo in modo che quando un evento si verifica tutti i sistemi che richiedono la conoscenza di questi aggiornamenti siano informati. Ad esempio, un post sul blog, dopo aver salvato un post che potrebbe essere necessario aggiornare un motore di ricerca (ad esempio, Lucene), aggiornare la nostra mappa del sito, i tag, e-mail gli utenti iscritti, ecc il pattern Observer permette agli sviluppatori di aggiungere ulteriori ascoltatori senza modificare il loro oggetto osservabile . Con l'apporto di osservatori (cioè un motore di ricerca aggiornare osservatore, un generatore di sitemap, ecc) in un soggetto (cioè un sistema di editing post di un blog) si può permettere di svolgere il tutti gli aggiornamenti necessari, senza alcuna modifica.
Prima che il pattern Observer è stato individuato il solito trucco sarebbe quello di aggiornare l'oggetto osservabile con una riga di codice aggiuntivo per aggiornare il sistema richiesto, e rimuovendo la riga di codice come richiesto. Questo non permette facilmente di aggiungere e rimuovere gli osservatori.
Gli aggiornamenti di sottoporre tutti i suoi osservatori attraverso un metodo di aggiornamento. Questo metodo di aggiornamento chiama un metodo in ogni osservatore che è derivata da implementazione di un'interfaccia. Gli osservatori possono aggiungere un rimuovere se stessi attraverso metodi nell'oggetto osservabile.
Questo è fondamentalmente lo! Trovo sempre un esempio per essere il miglior metodo di apprendimento / comprensione ecco il mio esempio codificato su ...
Pattern Observer in PHP
Nel mio esempio ho creato un sistema di news (NewsAggregator), che invia gli aggiornamenti titoli delle ultime notizie ai più piccoli feed di notizie. Qui il sytem notizia prende il posto del soggetto, osservabile, ecc mentre il news feed prendere il ruolo degli osservatori o ascoltatori.
Una volta che gli osservatori possono allegare inizializzato e staccarsi dal soggetto come meglio credono. Nel mio esempio ho creato tre osservatori, questi i titoli di scansione inviato dal soggetto e 'messaggio' la notizia se il suo caso. I tre osservatori sono sotto indicata con i termini che per la scansione, quando i titoli delle notizie di ricezione:
- tennis '' 'rugby', Sport Observer: 'calcio',
- News Observer: 'politica', 'finanza', 'governo'
- moda '' 'celebrità', Gossip Observer: 'musica',
Dopo initalising il soggetto che aggiungere gli osservatori notizie e gossip e inviare un aggiornamento di news. Dopo questo l'osservatore sport è aggiunto prima gli aggiornamenti di notizie più vengono inviati. Infine l'osservatore gossip viene rimosso prima un titolo finale di notizie viene mandato fuori.
Le tre classi diverse osservatore implementano l'interfaccia Observer, questo dà loro una chiara interfaccia / metodo attraverso il quale riceveranno gli aggiornamenti. A condizione che implementano l'interfaccia Observer essi saranno in grado di attaccarsi al soggetto. Questo evita anche che con il paradigma di programmazione di 'programma per le interfacce non implementazioni'. La classe NewsAggregator estende la classe soggetto astratto, che ci fornisce i tre metodi pubblici necessari:
- updateObservers ()
- addObserver ()
- removeObserver ()
Il codice può essere visto correre qui, Observer Pattern in PHP che girano , e il codice può essere scaricato da qui, Observer Pattern in codice PHP .
Observer Script
<? Php / ** * Questo file contiene gli osservatori * * @ Autore Lloyd Watkin * @ Dal 2009/12/23 * / Oggetto di classe astratta { astratto addObserver funzione pubblica (Osservatore $ osservatore); astratto removeObserver funzione pubblica (Osservatore $ osservatore); astratto updateObservers funzione pubblica ($ newsHeadline); } / ** * Questa è la classe oggetto per l'esempio * * @ Autore Lloyd Watkin * @ Dal 2009/12/23 * / classe ArticleAggregator estende Oggetto { / ** * Contiene una lista dei nostri osservatori * * @ Array var * / protected $ _observerList = array (); / ** * Metodo per aggiungere un osservatore * * @ Var Observer $ osservatore * @ return void * / addObserver funzione pubblica (Observer $ osservatore) { _observerList $ this-> [] = $ osservatore; } / ** * Metodo per rimuovere un osservatore * * @ Var Observer $ osservatore * @ return boolean * / removeObserver funzione pubblica (Observer $ osservatore) { foreach ($ this-> _observerList AS $ chiave => $ oggetto) { if ($ oggetto == $ osservatore) { unset ($ this-> _observerList [$ key]); return true; } } return false; } / ** * Metodo per aggiornare gli osservatori * * @ Stringa var $ newsHeadline * @ return void * / updateObservers funzione pubblica ($ newsHeadline) { foreach ($ this-> _observerList AS $ oggetto) { update $ ob-> ($ newsHeadline); } } / ** * Aggiungere una nuova storia notizie * * @ Stringa var $ storia * @ return void * / addNewsStory funzione pubblica ($ storia) { if (empty ($ storia) | |! is_string ($ storia)) { gettare InvalidArgumentException nuovo ('prevista una notizia!'); } $ This-> updateObservers ($ storia); } }
Soggetto / Script Observable
? <Php / ** * Questo file contiene il soggetto * * @ author Lloyd Watkin * @ dal 2009/12/23 * / class soggetto astratto {abstract addObserver funzione pubblica (Observer $ osservatore); astratto removeObserver funzione pubblica (Observer $ osservatore ); astratto updateObservers funzione pubblica ($ newsHeadline);} / ** * Questa è la classe oggetto per l'esempio * @ * autore Lloyd Watkin * @ dal 2009/12/23 * / class ArticleAggregator estende Oggetto {/ ** * Tiene un elenco dei nostri osservatori * * @ * array var / protected $ _observerList = array (); / ** * Metodo per aggiungere un osservatore * * @ * osservatore var Observer $ @ return void * / public addObserver funzione (Osservatore $ osservatore) _observerList {$ this-> [] = $ osservatore;} / ** * metodo per rimuovere un osservatore * * @ * var Observer osservatore $ @ boolean * ritorno / removeObserver funzione pubblica (Osservatore $ osservatore) {foreach ($ this-> chiave _observerList AS $ => $ ob) {if ($ oggetto == $ osservatore) {unset (_observerList $ this-> [$ key]); return true;}} return false;} / ** * Metodo per l'aggiornamento degli osservatori * @ * var $ stringa * newsHeadline @ return void * / function updateObservers pubblici ($ newsHeadline) {foreach ($ this-> _observerList AS $ oggetto) {$ aggiornamento ob-> ($ newsHeadline);}} / ** * Aggiungi una nuova storia * News * @ var $ stringa * @ return storia void * / public addNewsStory funzione ($ storia) {if (empty ($ storia) | |! is_string ($ storia)) {gettare InvalidArgumentException nuovo ('prevista una notizia storia ');!} $ this-> updateObservers ($ storia);}} Controller Script
<? Php / ** * Esempio di progetto Observer Pattern * * @ Autore Lloyd Watkin * @ Dal 2009/12/23 link * @ http://www.evilprofessor.co.uk * / include 'observers.php'; include 'subject.php'; if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) { echo '';} / / Che cosa stiamo facendo? echo 'Observer Esempio Pattern in PHP'. PHP_EOL; eco'================================'. PHP_EOL; / / Imposta ArticleAggregator nostro soggetto $ oggetto = new (); echo '- ArticleAggregator creato'. PHP_EOL; / / Aggiungi addObserver alcuni osservatori $ oggetto-> (nuova NewsObserver ()); addObserver $ oggetto-> ($ gossiper GossipObserver = new ()); echo '- Aggiunto NewsObverser & GossipObserver'. PHP_EOL. PHP_EOL; / / Bip, bip, bip ... Notizie Flash! echo 'NewsFlash: rugby celebrità giocatore ama la finanza'. PHP_EOL; eco'============================================== == '. PHP_EOL; $ oggetto-> addNewsStory ('giocatore di rugby celebrità amori finanza'); eco PHP_EOL; echo '- SportObserver ha scoperto e vuole unirsi al gruppo!'; AddObserver $ oggetto-> (nuova SportObserver ()); eco PHP_EOL . PHP_EOL; / / Bip, bip, bip ... Notizie Flash! echo 'NewsFlash: il governo mette in disordine di nuovo!' . PHP_EOL; eco'======================================='. PHP_EOL; $ oggetto-> addNewsStory ('governo scombina di nuovo!'); Eco PHP_EOL / / Bip, bip, bip ... Notizie Flash! echo 'NewsFlash: la moda e il calcio si combinano'. PHP_EOL; eco'======================================='. PHP_EOL; $ oggetto-> addNewsStory ('la moda e il calcio si combinano'); eco PHP_EOL / / Bip, bip, bip ... Notizie Flash! echo 'NewsFlash: musica e politica, e poi?' . PHP_EOL; eco'=========================================='. ('Musica e politica, cosa succederà?') $ Oggetto-> addNewsStory;; PHP_EOL eco PHP_EOL; / ** * pettegoli si stanca di notizie molto rapidamente e hanno deciso * per interrompere l'ascolto, nonostante tutte le notizie interessanti oggi! * / Echo '- GossipObserver si annoia e lascia il gruppo!' . PHP_EOL. PHP_EOL; $ oggetto-> removeObserver ($ chiacchierone); / / Bip, bip, bip ... News Flash - Aggiornamento per una storia precedente! echo 'NewsUpdate: la moda e il calcio si combinano dice'. 'Governo'. PHP_EOL; eco'============================================== == '. '========='. PHP_EOL; $ oggetto-> addNewsStory ('la moda e il calcio si combinano' ', dice il governo'.) Echo PHP_EOL if (! Empty ($ _SERVER ['HTTP_USER_AGENT'])) {echo '';
}



















































Ciao,
In primo luogo, il mio inglese è molto povera, quindi
Potete dirmi qual è il sistema nella foto?
Fedora 12?
Qual è il tema?
Ciao,
Potete dirmi qual è il sistema nella foto?
Fedora 12?
Qual è il tema?
La sua Fedora 11 con KDE applicata. tema Glasslooks credo.