PHP Design Patterns - Observer Pattern
Jeg har læst Head First Design Patterns for nylig og har besluttet at skrive nogle af de mønstre som PHP eksempler for min egen fordel. Den første, som jeg har besluttet at kode op, er det Observer Pattern . Den formelle definition af Observer Pattern er:
Observatøren mønster (en delmængde af den asynkrone offentliggøre / abonnere mønster ) er en software design mønster , hvor en genstand , der kaldes emnet, vedligeholder en liste over sine pårørende, kaldet observatører, og meddeler dem automatisk i nogen stat ændringer, som regel ved at kalde en af deres metoder . Det er hovedsageligt bruges til at implementere distribuerede begivenhed håndteringssystemer.
Som bliver systemerne mere løst koblet at sikre, at når en begivenhed der sker alle systemer, der kræver viden om disse opdateringer er informeret. For eksempel, et blog-indlæg efter at spare en stilling vi kan have behov for at opdatere en søgemaskine (fx Lucene), opdatere vores sitemap, tags, e-mail tegnede brugere osv. Observatøren mønster giver udviklere mulighed for at tilføje yderligere lyttere uden at redigere deres observerbare objekt . Ved at injicere observatører (dvs. en søgemaskine opdatering observatør, en sitemap generator, osv.) i et fag (dvs. blog-indlæg redigeringssystem) kan vi give det til at udføre alle de nødvendige opdateringer uden ændringer.
Før Observer mønstret blev identificeret den sædvanlige trick ville være at opdatere observerbare objekt med en ekstra linje kode til at opdatere de nødvendige systemet, og fjerne den linje kode efter behov. Dette giver ikke mulighed for nemt at tilføje og fjerne observatører.
Emnet opdaterer alle sine observatører via en opdatering metode. Denne opdatering metode kræver en metode i hver observatør, der er afledt af gennemførelsen af en grænseflade. Observatører kan tilføje en fjerne sig selv ved hjælp af metoder i det observerbare objekt.
Det er dybest set det! Jeg har altid finde et eksempel at være den bedste metode til læring / forståelse, så her er mit kodet op eksempel ...
Observatør Mønster i PHP
I mit eksempel har jeg lavet en nyhed system (NewsAggregator), som udsender nyhedsoverskrift opdateringer til mindre nyhedskilder. Her nyheden sytem træder i stedet for Emne, Observerbare osv mens nyhedskilder tage observatørernes rolle eller lyttere.
Når initialiseres observatører kan vedhæfte og løsrive sig fra emnet, som de ønsker. I mit eksempel har jeg lavet tre observatører, disse scan overskrifterne sendt ud af emnet og "råbe" nyheden, hvis det er relevant. De tre observatører er navngivet nedenfor sammen med de vilkår, de scanne for, når de modtager nyhedsoverskrifter:
- Sport Observatør: »rugby ',' fodbold ',' tennis '
- Nyheder Observatør: »politik«, »finansiering«, »regering«
- Sladder Observatør: »celebrity ',' musik ',' mode '
Efter initalising emnet jeg tilføje nyheder og sladder observatører og sende en nyhed opdatering. Efter denne sport observatøren er tilsat før flere nyheder opdateringer er sendt ud. Endelig sladder observatør er fjernet, før en endelig nyhedsoverskrift er sendt ud.
De tre forskellige observatør klasser implementere grænsefladen Observer, hvilket giver dem en klar grænseflade / metode, hvorigennem de vil modtage opdateringer. Forudsat de gennemfører Observer grænseflade, som de vil være i stand til at knytte sig til emnet. Dette holder også med programmeringen paradigme for "program til grænseflader ikke implementeringer«. Den NewsAggregator klasse udvider den abstrakte klasse Emne, der giver os de nødvendige tre offentlige metoder:
- updateObservers ()
- addObserver ()
- removeObserver ()
Koden kan ses køre her, Observer Pattern i PHP Løb , og koden kan downloades herfra, Observer Pattern i PHP Code .
Observer Script
<? Php / ** * Denne fil indeholder de observatører * * @ Forfatter Lloyd Watkin * @ Da 2009/12/23 * / abstrakte klasse Om { abstrakt offentlig funktion addObserver (Observer $ observatør); abstrakt offentlig funktion removeObserver (Observer $ observatør); abstrakt offentlig funktion updateObservers ($ newsHeadline); } / ** * Dette er emnet klassen for eksempel * * @ Forfatter Lloyd Watkin * @ Da 2009/12/23 * / klasse ArticleAggregator udvider Emne { / ** * Holder en liste over vores observatører * * @ Var array * / beskyttet $ _observerList = array (); / ** * Metode til at tilføje en observatør * * @ Was Observer $ observatør * @ Return void * / offentlig funktion addObserver (Observer $ observatør) { $ This-> _observerList [] = $ observatør; } / ** * Metode til at fjerne en observatør * * @ Was Observer $ observatør * @ Return boolean * / offentlig funktion removeObserver (Observer $ observatør) { foreach ($ this-> _observerList AS $ key => $ ob) { if ($ ob == $ observatør) { unset ($ this-> _observerList [$ key]); returnere sandt; } } return false; } / ** * Metode til at opdatere observatører * * @ Var streng $ newsHeadline * @ Return void * / offentlig funktion updateObservers ($ newsHeadline) { foreach ($ this-> _observerList AS $ ob) { $ Ob-> update ($ newsHeadline); } } / ** * Læg en ny nyhed * * @ Var streng $ historie * @ Return void * / offentlig funktion addNewsStory ($ historie) { if (empty ($ historie) | |! is_string ($ historie)) { kaste nyt InvalidArgumentException ('Forventede en nyhedshistorie!'); } $ This-> updateObservers ($ historie); } }
Emne / Observerbare Script
? <Php / ** * Denne fil indeholder emnet * * @ author Lloyd Watkin * @ siden 2009/12/23 * / abstrakt klasse Om {abstrakt offentlig funktion addObserver (Observer $ observatør); abstrakt offentlig funktion removeObserver (Observer $ observatør ); abstrakt offentlig funktion updateObservers ($ newsHeadline);} / ** * Dette er emnet klassen for eksempel * * @ author Lloyd Watkin * @ siden 2009/12/23 * / class ArticleAggregator udvider Om {/ ** * Holder en liste over vores observatører * * @ var array * / beskyttet $ _observerList = array (); / ** * Metode til at tilføje en observatør * * @ var Observer $ observatøren * @ return void * / public funktion addObserver (Observer $ observatør) {$ this-> _observerList [] = $ observatør;} / ** * Metode til at fjerne en observatør * * @ var Observer $ observatøren * @ return boolean * / public funktion removeObserver (Observer $ observatør) {foreach ($ this-> _observerList AS $ key => $ ob) {if ($ ob == $ observatør) {unset ($ this-> _observerList [$ key]); returnere sandt;}} return false;} / ** * Metode til at opdatere observatører * * @ var streng $ newsHeadline * @ return void * / public funktion updateObservers ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ ob-> update ($ newsHeadline);}} / ** * Læg en ny nyhed * * @ var streng $ historie * @ return void * / public funktion addNewsStory ($ historie) {if (empty ($ historie) | |! is_string ($ historie)) {smide nye InvalidArgumentException ('Forventede en nyhed historie ');} $ this-> updateObservers ($ historie);}} Controller Script
<? Php / ** * Observer Design Pattern Eksempel * * @ Forfatter Lloyd Watkin * @ Da 2009/12/23 * @ Link http://www.evilprofessor.co.uk * / omfatter »observers.php«; omfatter »subject.php«; if (! tom ($ _SERVER ['HTTP_USER_AGENT'])) { echo '';} / / Hvad gør vi? echo 'Observatør Mønster Eksempel i PHP. PHP_EOL; ekko'================================'. PHP_EOL; / / Set op på vores forbehold $ subject = ny ArticleAggregator (); echo '- ArticleAggregator oprettet'. PHP_EOL / / Tilføj nogle iagttagere $ emne-> addObserver (ny NewsObserver ()); $ emne-> addObserver ($ gossiper = ny GossipObserver ()); echo '- Tilføjet NewsObverser & GossipObserver «. PHP_EOL. PHP_EOL / / Beep, beep, bip ... Nyheder Flash! echo 'Newsflash: celebrity rugby spiller elsker finansiering «. PHP_EOL; ekko'============================================== == '. PHP_EOL, $ emne-> addNewsStory ('Celebrity rugby spiller elsker finansiering'); echo PHP_EOL, echo '- SportObserver har fundet ud af og ønsker at slutte sig til gruppen!'; $ Emne-> addObserver (ny SportObserver ()); echo PHP_EOL . PHP_EOL / / Beep, beep, bip ... Nyheder Flash! echo 'Newsflash: Regeringen griseri oppe igen!' . PHP_EOL; ekko'======================================='. PHP_EOL, $ emne-> addNewsStory ('regering messer op igen!'); Echo PHP_EOL / / Beep, beep, bip ... Nyheder Flash! echo 'Newsflash: mode og fodbold kombinere «. PHP_EOL; ekko'======================================='. PHP_EOL, $ emne-> addNewsStory ('mode og fodbold kombinere'); echo PHP_EOL / / Beep, beep, bip ... Nyheder Flash! echo 'Newsflash: musik og politik, hvad nu? " . PHP_EOL; ekko'=========================================='. PHP_EOL, $ emne-> addNewsStory ('musik og politik, hvad nu?'); Echo PHP_EOL; / ** * Gossipers blive træt af nyheder meget hurtigt og har besluttet * at stoppe lytte, på trods af alle de interessante nyheder i dag! * / Echo '- GossipObserver er kede sig og forlader gruppen!' . PHP_EOL. PHP_EOL, $ emne-> removeObserver ($ gossiper) / / Beep, beep, bip ... Nyheder Flash - Opdatering til en tidligere historie! echo 'NewsUpdate: mode og fodbold kombinere siger'. »Regering«. PHP_EOL; ekko'============================================== == '. '========='. PHP_EOL, $ emne-> addNewsStory ('mode og fodbold kombinere', siger regeringen '.) Echo PHP_EOL; if (! Tom ($ _SERVER [' HTTP_USER_AGENT '])) {echo'';
}



















































Hej,
Først, mit engelsk er meget dårlig, så
Kan du fortælle mig, hvad er systemet i billedet?
Fedora 12?
Hvad er temaet?
Hej,
Kan du fortælle mig, hvad er systemet i billedet?
Fedora 12?
Hvad er temaet?
Dens Fedora 11 med KDE anvendes. Glasslooks tema tror jeg.