PHP Design Patterns - Observer Pattern
Sem bil obravnavi Head First Design Patterns pred kratkim in se odločil napisati nekaj vzorcev kot primeri PHP za svojo korist. Prva je, da sem se odločil, da se je koda Observer Pattern . Formalne opredelitve Observer Pattern je:
Opazovalec vzorec (podmnožica asinhronih objavi / naročite vzorec ) je software design vzorec , v katerem objekt , ki se imenuje predmet, vodi seznam svojih vzdrževane družinske člane, ki se imenuje opazovalci, in o njih obvesti samodejno vsakega državnega sprememb, običajno s klicanjem eden od njihovih metod . Večinoma se uporablja za izvajanje porazdeljenih sistemov za ravnanje z dogodka.
Kot je postalo sistemi bolj ohlapno povezanih poskrbeti, da ko se dogodek zgodi, vsi sistemi, ki zahtevajo poznavanje te posodobitve obveščeni. Na primer, blog post, po varčevanju post bomo morda morali posodobiti iskalnikov (npr. Lucene), posodobitev naše kazalo, oznake, email vpisani uporabniki itd opazovalec vzorec razvijalcem omogoča dodajanje dodatnih poslušalcev, ne da bi za urejanje svojih opaznih predmet . Z vbrizgavanjem opazovalcev (tj. posodobitev iskalnik opazovalca, sitemap generator, etc) v skladu (tj. post blog sistem za urejanje) lahko omogoči, da izvaja vse potrebne posodobitve, brez sprememb.
Preden je bil vzorec Observer opredeljenih običajno trik bi bilo posodobiti opaziti predmet z dodatno linijo z oznako za posodobitev zahteva sistem, in odstranjevanje vrstico kode, kot je potrebno. To ne omogoča enostavno dodajanje in odstranjevanje opazovalci.
Predmet posodobitve vseh svojih opazovalcev preko update metodi. Ta posodobitev metoda zahteva metodo, v vsak opazovalec, ki izhaja iz izvajanja vmesnika. Opazovalci lahko dodate sami odstranite s pomočjo metod v opazovati predmet.
To je v bistvu to! Vedno sem našel primer, da je najboljši način učenja / razumevanjem, da tu je moja kodirani up primer ...
Observer vzorcev v PHP
V mojem primeru sem ustvaril novice sistem (NewsAggregator), ki pošilja posodobitve naslov novice na manjše novic. Tu novice sytem prevzame mesto Predmet, Opazljive, etc ker novic v vlogo opazovalcev ali Poslušalci.
Ko je mogoče inicializirati opazovalci pripisujejo in ločiti od katere, kot jim ustreza. V mojem primeru sem ustvaril trije opazovalci, ti scan naslovnice ki jih je poslala predmet in "kričati" novica, če njene ustrezne. Trije opazovalci so navedeni spodaj, skupaj s pogoji, ki jih išče, ko bodo prejeli naslove novic:
- Sport Observer: "rugby", "nogomet", "tenis"
- Novice Observer: "politika", "finance", "vlada"
- Gossip Observer: "celebrity", "glasba", "moda"
Po initalising predmet dodam opazovalci novice in čenče in poslati novice update. Po tem je šport opazovalec dodal, preden se več posodobitev novic poslana. Nazadnje je gossip opazovalec odstraniti, preden je končno novica naslov poslana.
Tri različne razrede opazovalca izvajanje vmesnika Observer, to jim daje jasen vmesnik / metode, s katerimi bodo prejeli posodobitve. Pod pogojem, da izvajanje vmesnik Observer bodo lahko, da se pritrdijo na to temo. To vodi tudi s programsko paradigmo "program na vmesnike ne implementacije". Razred NewsAggregator razširja abstraktni razred Zadeva, ki nam zagotavlja vse tri zahtevane javne metode:
- updateObservers ()
- addObserver ()
- removeObserver ()
Kodo je mogoče videti tukaj teče, Observer vzorcev v PHP Running , in kodo lahko prenesete iz tukaj, Observer vzorcev v PHP Code .
Observer Script
? <Php / ** * Ta datoteka vsebuje opazovalci * * @ avtor Lloyd Watkin * @ saj 2009/12/23 * / abstraktni razred Ob {abstraktno javne funkcije addObserver (Observer $ opazovalec); abstraktno javne funkcije removeObserver (Observer $ opazovalec ); abstraktno javne funkcije updateObservers ($ newsHeadline);} / ** * Ta je predmet razreda za primer * * @ avtor Lloyd Watkin * @ saj 2009/12/23 * / class ArticleAggregator razširja Ob {/ ** * Skladišča seznam naših opazovalcev * * @ var array * / $ zaščitena _observerList = array (); / ** * Metoda dodati opazovalec * * @ var Observer $ opazovalca * @ vrne neveljavne * / javne funkcije addObserver (Observer $ opazovalec) {$ to-> _observerList [] = $ opazovalec;} / ** * Metoda za odstranitev opazovalca * * @ var Observer $ opazovalca * @ vrne boolean * / javne funkcije removeObserver (Observer $ opazovalec) {foreach ($ to-> _observerList AS $ key => $ ob) {if ($ ob == $ opazovalec) {unset ($ to-> _observerList [$ kljuc]), vračanje true;}} vrne false;} / ** * Metoda za posodobitev opazovalcev * * @ var string $ newsHeadline * @ vrne neveljavne * / javne funkcije updateObservers ($ newsHeadline) {foreach ($ to-> _observerList AS $ ob) {$ ob-> update ($ newsHeadline);}} / ** * Dodaj nova zgodba Novice * * @ var string $ zgodba * @ vrne neveljavne * / javne funkcije addNewsStory ($ zgodba) {if (prazna ($ zgodba) | |! is_string ($ zgodba)) {vrgel novo InvalidArgumentException ("Pričakovana novice Zgodba ');!} $ to-> updateObservers ($ zgodba);}} Predmet / Opazljive Script
? <Php / ** * Ta datoteka vsebuje predmet * * @ avtor Lloyd Watkin * @ saj 2009/12/23 * / abstraktni razred Ob {abstraktno javne funkcije addObserver (Observer $ opazovalec); abstraktno javne funkcije removeObserver (Observer $ opazovalec ); abstraktno javne funkcije updateObservers ($ newsHeadline);} / ** * Ta je predmet razreda za primer * * @ avtor Lloyd Watkin * @ saj 2009/12/23 * / class ArticleAggregator razširja Ob {/ ** * Skladišča seznam naših opazovalcev * * @ var array * / $ zaščitena _observerList = array (); / ** * Metoda dodati opazovalec * * @ var Observer $ opazovalca * @ vrne neveljavne * / javne funkcije addObserver (Observer $ opazovalec) {$ to-> _observerList [] = $ opazovalec;} / ** * Metoda za odstranitev opazovalca * * @ var Observer $ opazovalca * @ vrne boolean * / javne funkcije removeObserver (Observer $ opazovalec) {foreach ($ to-> _observerList AS $ key => $ ob) {if ($ ob == $ opazovalec) {unset ($ to-> _observerList [$ kljuc]), vračanje true;}} vrne false;} / ** * Metoda za posodobitev opazovalcev * * @ var string $ newsHeadline * @ vrne neveljavne * / javne funkcije updateObservers ($ newsHeadline) {foreach ($ to-> _observerList AS $ ob) {$ ob-> update ($ newsHeadline);}} / ** * Dodaj nova zgodba Novice * * @ var string $ zgodba * @ vrne neveljavne * / javne funkcije addNewsStory ($ zgodba) {if (prazna ($ zgodba) | |! is_string ($ zgodba)) {vrgel novo InvalidArgumentException ("Pričakovana novice Zgodba ');!} $ to-> updateObservers ($ zgodba);}} Controller Script
<? Php / ** * Observer Design Pattern Primer * * @ Avtor Lloyd Watkin * @ Saj 2009/12/23 * @ Link http://www.evilprofessor.co.uk * / vključujejo "observers.php"; vključujejo "subject.php"; if (! prazen ($ ['HTTP_USER_AGENT'] _SERVER)) { echo ""; } / / Kaj delamo? echo 'Observer vzorcev Primer v PHP ". PHP_EOL; echo'================================'. PHP_EOL; / / Nastavi našo predmet $ Subject = novo ArticleAggregator (); echo "- ArticleAggregator ustvaril". PHP_EOL; / / Dodamo nekaj opazovalcev $ Predmeta> addObserver (novo NewsObserver ()); $ Predmeta> addObserver ($ gossiper = new GossipObserver ()); echo "- Added NewsObverser & GossipObserver". PHP_EOL. PHP_EOL; / / Pisk, pisk, piska ... News Flash! echo "NewsFlash: rugby slaven igralec ljubi finance". PHP_EOL; echo'================================================ ". PHP_EOL; $ Predmeta> addNewsStory ("celebrity rugby igralec ljubi finance '); echo PHP_EOL; echo "- SportObserver je bilo ugotovljeno, in želi, da se pridružite skupini! '; $ Predmeta> addObserver (novo SportObserver ()); echo PHP_EOL. PHP_EOL; / / Pisk, pisk, piska ... News Flash! echo "NewsFlash: Vlada sel ki gre gor še enkrat!" . PHP_EOL; echo'======================================='. PHP_EOL; $ Predmeta> addNewsStory ("vlada sel ki gre gor še enkrat! '); echo PHP_EOL; / / Pisk, pisk, piska ... News Flash! echo "NewsFlash: moda in nogomet združuje". PHP_EOL; echo'======================================='. PHP_EOL; $ Predmeta> addNewsStory ("mode in nogometa združiti '); echo PHP_EOL; / / Pisk, pisk, piska ... News Flash! echo "NewsFlash: glasba in politika, kaj zdaj? ' . PHP_EOL; echo'=========================================='. PHP_EOL; $ Predmeta> addNewsStory ("glasba in politika, kaj zdaj? '); echo PHP_EOL; / ** * Raste opravljivci utrujeni novice zelo hitro in so se odločili, * Ustaviti poslušanje, kljub vsem zanimivo novice danes! * / echo "- GossipObserver je dolgčas in zapusti skupino! ' . PHP_EOL. PHP_EOL; $ Predmeta> removeObserver ($ gossiper); / / Pisk, pisk, piska ... News Flash - Update na prejšnjo zgodbo! echo "NewsUpdate: moda in nogomet združuje pravi". "Vlada". PHP_EOL; echo'================================================ ". '========='. PHP_EOL; $ Predmeta> addNewsStory ("mode in nogometa združiti". "Pravi vlada"); echo PHP_EOL; if (! prazen ($ ['HTTP_USER_AGENT'] _SERVER)) { echo "";
}



















































Pozdravljeni,
Prvič, Moja angleščina je zelo slaba, nato pa
Ali mi lahko poveste, kaj je sistem na sliki?
Fedora 12?
Kaj je tema?
Pozdravljeni,
Ali mi lahko poveste, kaj je sistem na sliki?
Fedora 12?
Kaj je tema?
Njena fedora 11 s KDE uporablja. Glasslooks temo verjamem.