PHP Design Patterns - model Observer
Am fost de lectură Şeful Prima Design Modele recent, şi au decis să scrie unele dintre modele ca exemple PHP pentru propriul meu interes. Primul care l-am decis să cod up este model Observer . Definiţia formală a Pattern Observer este:
Modelul observator (un subset al asincron publica / abonaţi model ) este un software de design model în care un obiect , numit subiectul, păstrează o listă cu persoanele aflate în întreţinerea acestuia, numite observatori, şi le anunţă în mod automat de orice modificări de stat, de obicei, prin apel la una dintre lor metode . Este folosită în principal pentru punerea în aplicare a sistemelor distribuite eveniment de manipulare.
Pe măsură ce sistemele devin mai slab cuplate asigurându-vă că atunci când un eveniment se intampla tuturor sistemelor care necesită cunoştinţe de aceste actualizări sunt informate. De exemplu, un post de blog, după salvarea unui post am putea avea nevoie pentru a actualiza un motor de căutare (de exemplu Lucene), actualizare sitemap noastre, tag-uri, utilizatorii de e-mail subscris, etc model observator permite dezvoltatorilor să adauge ascultători suplimentare fără obiect editarea lor observabile . Prin injectarea de observatori (de exemplu, o actualizare a unui motor de căutare observator, un generator de sitemap, etc) într-un subiect (de exemplu, sistem de blog-ul de editare post) ne putem permite să îşi îndeplinească toate actualizările necesare, fără nici o schimbare.
Înainte de modelul Observer a fost identificat de obicei truc ar fi să actualizeze obiectul observabil cu o linie de cod suplimentar pentru a actualiza sistemul de necesare, precum şi eliminarea linie de cod, după caz. Acest lucru nu permite uşor adăugarea şi eliminarea de observatori.
Actualizările obiectul tuturor observatorilor sale prin intermediul unei metodă de actualizare. Această metodă de actualizare solicită o metodă în fiecare observator care este derivat de la o interfaţă de punere în aplicare. Observatorii se poate adăuga o elimina prin metode în obiectul observabile.
Asta e practic ea! Am găsi întotdeauna un exemplu a fi cea mai bună metodă de învăţare / înţelegere atât de aici e mea exemplu codat-te ...
Model Observer în PHP
În exemplul meu am creat un sistem de ştiri (NewsAggregator), care transmite titlu actualizări de ştiri la feed-uri de ştiri mai mici. Aici sytem ştiri ia locul Subiect, observabile, etc în timp ce fluxurile de ştiri să ia rolul de observatori sau ascultători.
Odată ce observatorii iniţializare poate ataşa şi se desprinde de la subiect cum consideră de cuviinţă. În exemplul meu am creat trei observatori, aceste scanare titluri trimis de subiect şi "strigă", ştiri, dacă este cazul său. Trei observatori sunt numite mai jos, împreună cu termenii de scanare pentru care atunci când primesc titluri de ştiri:
- Sport Observer: "Rugby", "fotbal", "tenis"
- Ştiri Observer: "politica", "finanţare", "guvern"
- Gossip Observer: "celebritate", "muzica", "moda"
După initalising obiectul adaug observatori ştiri şi bârfă şi trimite o actualizare de ştiri. După această observator sport se adaugă înainte de mai multe actualizări de ştiri sunt trimise. În sfârşit observator bârfă este înlăturat înainte de un titlu de ştiri final este trimis.
Cele trei clase diferite observator sa implementeze interfata Observer, acest lucru le oferă o interfaţă clară / metoda prin care vor primi actualizări. Cu condiţia ca acestea sa implementeze interfata Observer ei vor fi capabili să se ataşeze la Subiect. Acest lucru, de asemenea, păstrează cu paradigma de programare "program la interfeţele nu implementari". Clasa de NewsAggregator extinde Subiect clasă abstractă, care ne oferă cu cele trei publice metodele necesare:
- updateObservers ()
- addObserver ()
- removeObserver ()
Codul poate fi vazut aici difuzate, Observer Pattern în PHP Running , iar codul poate fi descărcat de aici, Observer Pattern în PHP Code .
Observator Script
? <Php / ** * Acest fisier contine * * observatori @ autor Lloyd Watkin * @ deoarece 2009/12/23 * / Subiect clasă abstractă {addObserver abstract funcţia publică (Observer $ observator); removeObserver abstract funcţia publică (Observer $ observator ); abstract updateObservers a functiei publice ($ newsHeadline);} / ** * Aceasta este clasa obiectul de exemplu * @ * Autorul Lloyd Watkin * @ deoarece 2009/12/23 * / clasa ArticleAggregator extinde Sub rezerva {/ ** * Susţine o listă de observatori * noastre * @ * array var / protejate $ _observerList = array (); / ** * Metoda pentru a adăuga un observator * * @ var Observer observator $ * @ return void * / addObserver funcţia publică (Observer $ observator) {_observerList $ this-> [] = $ observator;} / ** * Metoda pentru a elimina un observator * * @ var Observer $ observator * @ return * boolean / removeObserver funcţia publică (Observer $ observator) {foreach ($ this-> cheie _observerList AS $ => $ ob) {if ($ ob == $ observator) {unset (_observerList $ this-> [$ cheie]); return true;}} return false;} / ** * Metoda de actualizare a observatorilor * * @ var string $ newsHeadline * @ return void * / updateObservers a functiei publice ($ newsHeadline) {foreach ($ this-> _observerList AS ob $) {$ actualizare ob-> ($ newsHeadline);}} / ** * Adauga o nouă poveste de ştiri * * @ var string $ * @ return poveste void * / addNewsStory funcţia publică ($ poveste) {if (empty ($ poveste) | |! is_string ($ poveste)) {aruncare InvalidArgumentException noi ("se aştepta la o ştiri poveste ');!} $ this-> updateObservers ($ poveste);}} Subiect / observabile Script
? <Php / ** * Acest fisier contine * * obiectul @ autor Lloyd Watkin * @ deoarece 2009/12/23 * / Subiect clasă abstractă {addObserver abstract funcţia publică (Observer $ observator); removeObserver abstract funcţia publică (Observer $ observator ); abstract updateObservers a functiei publice ($ newsHeadline);} / ** * Aceasta este clasa obiectul de exemplu * @ * Autorul Lloyd Watkin * @ deoarece 2009/12/23 * / clasa ArticleAggregator extinde Sub rezerva {/ ** * Susţine o listă de observatori * noastre * @ * array var / protejate $ _observerList = array (); / ** * Metoda pentru a adăuga un observator * * @ var Observer observator $ * @ return void * / addObserver funcţia publică (Observer $ observator) {_observerList $ this-> [] = $ observator;} / ** * Metoda pentru a elimina un observator * * @ var Observer $ observator * @ return * boolean / removeObserver funcţia publică (Observer $ observator) {foreach ($ this-> cheie _observerList AS $ => $ ob) {if ($ ob == $ observator) {unset (_observerList $ this-> [$ cheie]); return true;}} return false;} / ** * Metoda de actualizare a observatorilor * * @ var string $ newsHeadline * @ return void * / updateObservers a functiei publice ($ newsHeadline) {foreach ($ this-> _observerList AS ob $) {$ actualizare ob-> ($ newsHeadline);}} / ** * Adauga o nouă poveste de ştiri * * @ var string $ * @ return poveste void * / addNewsStory funcţia publică ($ poveste) {if (empty ($ poveste) | |! is_string ($ poveste)) {aruncare InvalidArgumentException noi ("se aştepta la o ştiri poveste ');!} $ this-> updateObservers ($ poveste);}} Controller Script
<? Php / ** * Design Observer Pattern Exemplu * * @ Autor Lloyd Watkin * @ Deoarece 2009/12/23 * @ Link http://www.evilprofessor.co.uk * / include "observers.php"; include "subject.php"; if (empty ($ _SERVER ['HTTP_USER_AGENT'])!) { echo ""; } / / Ce facem? echo "Observator Exemplu de model în PHP". PHP_EOL; echo'================================'. PHP_EOL; / / Configuraţi subiectul nostru $ Subiect = ArticleAggregator noi (); echo '- ArticleAggregator creat ". PHP_EOL; / / Adauga unii observatori $ AddObserver subiect-> (nou NewsObserver ()); (Pălăvrăgiu $ = new GossipObserver ()) $ subiect-> addObserver; echo '- Adăugat NewsObverser & GossipObserver ". PHP_EOL. PHP_EOL; / / Beep, beep, beep ... Flash News! echo "Ultima oră: celebritate jucător de rugby iubeşte finanţare". PHP_EOL; ecou'================================================ ". PHP_EOL; addNewsStory $ subiect-> ("jucator de rugby celebritate iubeşte finanţare"); echo PHP_EOL; echo '- SportObserver a aflat şi vrea să se alăture grupului! "; $ AddObserver subiect-> (nou SportObserver ()); echo PHP_EOL. PHP_EOL; / / Beep, beep, beep ... Flash News! echo "Ultima oră: Guvernul de oaie din nou!" . PHP_EOL; echo'======================================='. PHP_EOL; $ Subiect-> addNewsStory ("guvern de oaie din nou! '); echo PHP_EOL; / / Beep, beep, beep ... Flash News! echo "Ultima oră: moda si fotbal combina". PHP_EOL; echo'======================================='. PHP_EOL; addNewsStory $ subiect-> ("moda şi fotbal combina '); echo PHP_EOL; / / Beep, beep, beep ... Flash News! echo "Ultima oră: muzica si politica, ce urmeaza?" . PHP_EOL; echo'=========================================='. PHP_EOL; addNewsStory $ subiect-> ("muzică şi politică, ce urmeaza?"); echo PHP_EOL; / ** * Gossipers crească obosit de ştiri foarte repede şi au decis * Pentru a opri ascultare, în ciuda tuturor ştiri interesante de azi! * / echo '- GossipObserver este plictisit şi lasă grup! " . PHP_EOL. PHP_EOL; removeObserver $ subiect-> ($ pălăvrăgiu); / / Beep, beep, beep ... Flash News - Update la o poveste mai devreme! echo 'NewsUpdate: moda si fotbal combina spune ". "Guvern". PHP_EOL; ecou'================================================ ". '========='. PHP_EOL; addNewsStory $ subiect-> ("moda şi fotbal combina". ", Spune Guvernul"); echo PHP_EOL; if (empty ($ _SERVER ['HTTP_USER_AGENT'])!) { echo "";
}



















































Bună ziua,
În primul rând, My în limba engleză este foarte slab, apoi
Pot sa-mi spui ce este în sistemul de imagine?
Fedora 12?
Care este tema?
Bună ziua,
Pot sa-mi spui ce este în sistemul de imagine?
Fedora 12?
Care este tema?
Fedora 11 cu KDE sa aplicat. Tema Glasslooks cred.