Design Patterns PHP - pattern Observer
Ho letto First Design Patterns Testa 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 modello di osservatore (un sottoinsieme di asincrono publish / subscribe modello ) è un software di design pattern in cui un oggetto , chiamato il soggetto, mantiene una lista di suoi dipendenti, chiamati osservatori, e segnala in modo automatico di eventuali cambiamenti di stato, di solito chiamando uno dei loro metodi . E 'principalmente utilizzato per implementare sistemi distribuiti gestione degli eventi.
Poiché i sistemi diventano più debolmente accoppiati fare in modo che quando un evento si verifica tutti i sistemi che richiedono la conoscenza di questi aggiornamenti sono informati. Ad esempio, un post sul blog, dopo aver salvato un post che potrebbe essere necessario aggiornare un motore di ricerca (ad esempio Lucene), l'aggiornamento nostra mappa del sito, tag, utenti di posta elettronica sottoscritto, ecc osservatore modello consente agli sviluppatori di aggiungere listener aggiuntive senza modificare il loro oggetto osservabile . Iniettando osservatori (ad esempio un motore di ricerca osservatore aggiornamento, un generatore di sitemap, ecc) in un soggetto (blog cioè sistema dopo la modifica) siamo in grado di permettere la per eseguire tutti gli aggiornamenti necessari, senza alcuna modifica.
Prima che il modello Observer è stato identificato il solito trucco sarebbe quello di aggiornare l'oggetto osservabile con una linea addizionale di codice per aggiornare il sistema richiesto e la rimozione della riga di codice come richiesto. Questo non permette facilmente aggiungere e rimuovere gli osservatori.
Gli aggiornamenti soggetto tutti i suoi osservatori attraverso un metodo di aggiornamento. Questo metodo di aggiornamento richiede un metodo in ogni osservatore che deriva dalla implementazione di un'interfaccia. Gli osservatori si può aggiungere un rimuovere con metodi nell'oggetto osservabili.
Questo è fondamentalmente! Trovo sempre un esempio per essere il miglior metodo di apprendimento / comprensione quindi ecco il mio esempio codificato fino ...
Pattern Observer in PHP
Nel mio esempio ho creato un sistema di news (NewsAggregator) che invia gli aggiornamenti titoli delle ultime notizie di feed di notizie più piccoli. Qui il sytem notizia prende il posto del Soggetto, Observable, ecc mentre il news feed prendere il ruolo degli osservatori o ascoltatori.
Una volta inizializzato osservatori possono collegare e scollegare stessi dal soggetto come meglio credono. Nel mio esempio ho creato tre osservatori, questi i titoli di scansione inviato dal soggetto e 'gridare' la notizia se il suo caso. I tre osservatori sono sotto indicata con i termini che per la scansione quando si ricevono notizie:
- Sport Observer: 'Rugby', 'calcio', 'tennis'
- Notizie Observer: 'politica', 'finanza', 'governo'
- Gossip Observer: 'celebrità', 'musica', 'moda'
Dopo initalising il soggetto aggiungo le notizie e gli osservatori pettegolezzi e inviare un aggiornamento di notizie. Dopo questo l'osservatore sport è aggiunto prima che gli aggiornamenti più notizie vengono inviati. Infine l'osservatore pettegolezzo viene rimosso prima che un titolo stampa finale viene inviato.
Le tre classi differenti osservatore implementano l'Observer interfaccia, questo dà loro un metodo chiaro interfaccia / attraverso cui si intende ricevere gli aggiornamenti. A condizione che implementano l'interfaccia Observer saranno in grado di attaccarsi al soggetto. In questo modo anche con il paradigma di programmazione di 'programma di interfacce non implementazioni'. La classe NewsAggregator estende la classe astratta Oggetto, che ci fornisce i tre metodi necessari pubblico:
- updateObservers ()
- addObserver ()
- removeObserver ()
Il codice può essere visto correre qui, pattern Observer in PHP corsa , e il codice può essere scaricato da qui, pattern Observer nel codice PHP .
Observer Script
<? Php / ** * Questo file contiene gli osservatori * * @ Author Lloyd Watkin * @ Dal 2009/12/23 * / Oggetto 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 * * @ Author Lloyd Watkin * @ Dal 2009/12/23 * / ArticleAggregator classe estende Oggetto { / ** * Contiene una lista dei nostri osservatori * * @ Array var * / protetta $ _observerList = array (); / ** * Metodo per aggiungere un osservatore * * @ Var Observer $ osservatore * @ Return void * / addObserver funzione pubblica (Osservatore $ osservatore) { $ This-> _observerList [] = $ osservatore; } / ** * Metodo per rimuovere un osservatore * * @ Var Observer $ osservatore * @ Return boolean * / removeObserver funzione pubblica (Osservatore $ osservatore) { foreach ($ this-> _observerList AS $ key => $ ob) { if ($ oggetto == $ osservatore) { unset ($ this-> _observerList [$ key]); return true; } } return false; } / ** * Metodo per l'aggiornamento degli osservatori * * @ Stringa var $ newsHeadline * @ Return void * / updateObservers funzione pubblica ($ newsHeadline) { foreach ($ this-> _observerList AS $ ob) { $ Oggetto-> update ($ newsHeadline); } } / ** * Aggiungere una nuova storia notizia * * @ Stringa var $ storia * @ Return void * / addNewsStory funzione pubblica ($ storia) { if (empty ($ storia) | |! is_string ($ storia)) { InvalidArgumentException gettare nuova ('previsto una notizia!'); } $ This-> updateObservers ($ storia); } }
Oggetto / Observable Script
? <Php / ** * Questo file contiene il soggetto * * @ author Lloyd Watkin * @ dal 2009/12/23 * / Oggetto classe astratta {abstract addObserver funzione pubblica (Osservatore $ osservatore); astratto removeObserver funzione pubblica (Osservatore $ osservatore ); astratto updateObservers funzione pubblica ($ newsHeadline);} / ** * Questa è la classe oggetto per l'esempio * * @ author Lloyd Watkin * @ dal 2009/12/23 * / ArticleAggregator classe estende Oggetto {/ ** * Contiene un elenco dei nostri osservatori * * @ var array * / protected $ _observerList = array (); / ** * Metodo per aggiungere un osservatore * * @ var Observer $ osservatore void * * @ return / addObserver funzione pubblica (Osservatore $ osservatore) {$ this-> _observerList [] = $ osservatore;} / ** * Metodo per rimuovere un osservatore * * @ var Observer $ osservatore * @ return boolean * / removeObserver funzione pubblica (Osservatore $ osservatore) {foreach ($ this-> _observerList AS $ key => $ oggetto) {if ($ oggetto == $ osservatore) {unset ($ this-> _observerList [$ key]); return true;}} return false;} / ** * Metodo per l'aggiornamento degli osservatori * * @ var string $ newsHeadline * @ void * ritorno / updateObservers funzione pubblica ($ newsHeadline) {foreach ($ this-> _observerList AS $ oggetto) {$ oggetto-> update ($ newsHeadline);}} / ** * Aggiunge una notizia nuova * * @ var string $ storia * @ return void * / addNewsStory funzione pubblica ($ storia) {if (empty ($ storia) | |! is_string ($ storia)) {throw InvalidArgumentException nuovo ('prevista una notizia storia ');!} $ this-> updateObservers ($ storia);}} Controller Script
<? Php / ** * Design Observer Esempio di pattern * * @ Author Lloyd Watkin * @ Dal 2009/12/23 * @ Link http://www.evilprofessor.co.uk * / includono 'observers.php'; includono 'subject.php'; if (empty ($ _SERVER ['HTTP_USER_AGENT'])) { echo ''; } / / Che cosa stiamo facendo? echo 'Observer Esempio di pattern in PHP'. PHP_EOL; eco'================================'. PHP_EOL; / / Imposta il nostro soggetto $ Oggetto = new ArticleAggregator (); echo '- ArticleAggregator creato'. PHP_EOL; / / Aggiunge alcuni osservatori $ Oggetto-> addObserver (nuovo NewsObserver ()); $ Oggetto-> addObserver ($ gossiper GossipObserver = new ()); echo '- Aggiunto NewsObverser & GossipObserver'. PHP_EOL. PHP_EOL; / / Bip, bip, bip ... Notizie Flash! echo 'NewsFlash: celebrity giocatore di rugby 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!'; $ Oggetto-> addObserver (nuovo SportObserver ()); eco PHP_EOL. PHP_EOL; / / Bip, bip, bip ... Notizie Flash! 'NewsFlash: governo scombina di nuovo!' echo . PHP_EOL; eco'======================================='. PHP_EOL; $ Oggetto-> addNewsStory ('scombina governo 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 ('combinare moda e del calcio'); eco PHP_EOL; / / Bip, bip, bip ... Notizie Flash! echo 'NewsFlash: musica e politica, e adesso?' . PHP_EOL; eco'=========================================='. PHP_EOL; $ Oggetto-> addNewsStory ('musica e politica, e adesso?'); eco PHP_EOL; / ** Pettegole * stanchi di una notizia molto rapidamente e hanno deciso * Per interrompere l'ascolto, nonostante tutte le interessanti novità oggi! * / echo '- GossipObserver si annoia e lascia il gruppo!' . PHP_EOL. PHP_EOL; $ Oggetto-> removeObserver ($ gossiper); / / Bip, bip, bip ... Notizie Flash - Aggiornamento a 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'); eco PHP_EOL; if (empty ($ _SERVER ['HTTP_USER_AGENT'])) { echo '';
}



















































Ciao,
In primo luogo, il mio inglese è molto povera, allora
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?
Il suo fedora 11 con KDE applicata. Glasslooks tema credo.