PHP Design Patterns - Observer Pattern
Ég hef verið að lesa Head First Patterns Design undanförnu og hefur ákveðið að skrifa nokkuð af mynstur sem PHP dæmi um eigin hag mínum. Sú fyrsta sem ég hef ákveðið að kóða upp er Observer Pattern . Formlegar skilgreiningar á Observer Pattern er:
The Observer mynstur (hlutmengi í ósamstilltur birta / áskrift mynstur ) er hugbúnaður hönnun mynstur þar sem hlut , sem heitir efni, heldur lista yfir framfæri sínu, sem heitir málið, og tilkynnir þá sjálfkrafa neins ríkis breytingar, yfirleitt með því að hringja ein þeirra aðferða . Það er aðallega notað til að hrinda í framkvæmd dreift atburði meðhöndlun kerfi.
Eins og kerfi verða lauslega saman að tryggja að þegar atburður gerist öll kerfi sem krefjast þekkingar á þessar uppfærslur eru upplýst. Til dæmis, a blog staða, eftir að vista færslu gætum við þurft að uppfæra leitarvél (td Lucene), uppfæra sitemap okkar, tags, email áskrift notendum osfrv The Observer mynstur leyfa verktaki til að bæta við fleiri hlustun án breytinga sýnileg markmiði . Með því að sprauta málið (þ.e. leitarvél uppfæra áheyrnarfulltrúa, sitemap rafall, etc) í efni (þ.e. blogg útgáfa kerfi) við getum að leyfa henni að framkvæma allar nauðsynlegar uppfærslur án þess að neinar breytingar.
Áður en Observer mynstur var bent á venjulegum bragð væri að uppfæra sýnileg mótmæla með viðbótar línu af kóða til að uppfæra þarf kerfi, og fjarlægja the lína af kóða sem krafist er. Þetta leyfir ekki auðveldlega bæta við og fjarlægja málið.
Efni endurnýja allar eftirlitsmenn hennar í gegnum uppfærslu aðferð. Þessi uppfærsla aðferð kallar aðferð í hverju áheyrnarfulltrúa sem er dregið úr framkvæmd tengi. Áheyrnarfulltrúar geta bæta við fjarlægja sig með aðferðum í virkum hlut.
Það er í grundvallaratriðum það! Mér finnst alltaf dæmi til að vera besta aðferðin við að læra / skilja svo hér dulmáli upp dæmi mínu ...
Observer Pattern í PHP
Í dæmi mínu að ég hef búið til fréttir kerfi (NewsAggregator) sem sendir út fréttir fyrirsögn uppfærslur minni fréttir. Hér tekur fréttir sytem stað Efni, mælanleg, etc en fréttir taka hlutverk áheyrnarfulltrúar eða hlustun.
Þegar forgöngu um málið geta festa og taktu sig frá efni sem þeir sjá vel á sig kominn. Í dæmi mínu sem ég hef búið þrjá málið, þessar skanna fyrirsagnir send út frá efni og "fagna" fréttir ef við hennar. Þrír áheyrnarfulltrúar eru nefnd hér að neðan ásamt skilmálum sem þeir leita að þegar þeir fá fréttir:
- Íþróttir Observer: 'Rugby', 'fótbolti', 'lífrænt'
- News Observer: "stjórnmál", "fjármál", "ríkisstjórn"
- Slúður Observer: 'orðstír', 'tónlist', 'tísku'
Eftir initalising efni ég bæta fréttir og slúður áhorfendur og senda út fréttir uppfærslu. Eftir þetta íþrótt áheyrnarfulltrúa er bætt áður en fleiri fréttir uppfærslur eru send út. Loks er slúður áheyrnarfulltrúa er fjarlægður áður en endanleg fréttir fyrirsögn er sendur út.
Hinar þrjár mismunandi flokkum áheyrnarfulltrúa innleiða tengi Observer, það gefur þeim skýr tengi / aðferð þar sem þeir vilja fá uppfærslur. Tilskildu að þau innleiða Observer tengi sem þeir vilja vera fær til festa sig við efnum. Þetta hindrar einnig með forritun hugmyndafræði "program til tengi ekki gerð. The NewsAggregator bekknum nær ágripinu bekknum Efni, sem veitir okkur með þremur krafist opinberra aðferðir:
- updateObservers ()
- addObserver ()
- removeObserver ()
Hægt er að sjá í gangi hér, Observer Pattern í PHP Running , og hægt er að nálgast hér, Observer mynstur í PHP kóðanum .
Observer Script
<? PHP / ** * Þessi skrá inniheldur áheyrnarfulltrúar * * @ Höfundur Lloyd Watkin * @ Síðan 2009/12/23 * / ágrip bekknum Efni { Ágrip opinber virka addObserver (Observer $ áheyrnarfulltrúi); Ágrip opinber virka removeObserver (Observer $ áheyrnarfulltrúi); Ágrip opinber updateObservers virka ($ newsHeadline); } / ** * Þetta er háð tegund fyrir td * * @ Höfundur Lloyd Watkin * @ Síðan 2009/12/23 * / flokki ArticleAggregator nær Efni { / ** * Halda skrá yfir málið okkar * * @ Var array * / vernduð $ _observerList = array (); / ** * Aðferð til að bæta við áheyrnarfulltrúa * * @ Var Observer $ áheyrnarfulltrúi * @ Skila ógilt * / opinber virka addObserver (Observer $ Observer) { $ Þessu-> _observerList [] = $ áheyrnarfulltrúa; } / ** * Aðferð til að fjarlægja áheyrnarfulltrúa * * @ Var Observer $ áheyrnarfulltrúi * @ Skila Boolean * / opinber virka removeObserver (Observer $ Observer) { framhandleggur ($ þessu-> _observerList AS $ lykill => $ OB) { if ($ Ob == $ Observer) { afvalið ($ þessu-> _observerList [$ lykill]); aftur true; } } return false; } / ** * Aðferð til að uppfæra áheyrnarfulltrúa * * @ Var band: newsHeadline * @ Skila ógilt * / opinber updateObservers virka ($ newsHeadline) { framhandleggur ($ þessu-> _observerList AS $ OB) { $ OB-> Update ($ newsHeadline); } } / ** * Bæta við nýjum frétt * * @ Var band: Sagan * @ Skila ógilt * / opinber virka addNewsStory ($ saga) { if (tómur ($ saga) | |! is_string ($ saga)) { kasta nýju InvalidArgumentException ('Expected frétt!'); } $ Þessu-> updateObservers ($ saga); } }
Efni / sýnileg Script
? <PHP / ** * Þessi skrá inniheldur efni * * @ Höfundur Lloyd Watkin * @ síðan 2009/12/23 * / fræðilega greinar Subject {ágrip opinber virka addObserver (Observer $ áheyrnarfulltrúi); Ágrip opinber virka removeObserver (Observer $ áheyrnarfulltrúi ); Ágrip opinber updateObservers virka ($ newsHeadline);} / ** * Þetta er háð tegund fyrir td * * @ Höfundur Lloyd Watkin * @ síðan 2009/12/23 * / bekknum ArticleAggregator nær Subject {/ ** * Geymir listi yfir málið okkar * * @ var array * / vernduð $ _observerList = array (); / ** * Aðferð til að bæta við áheyrnarfulltrúa * * @ var Observer $ áheyrnarfulltrúa * @ skila ógilt * / opinber virka addObserver (Observer $ Observer) {$ þessu-> _observerList [] = $ áheyrnarfulltrúa;} / ** * Aðferð til að fjarlægja áheyrnarfulltrúa * * @ var Observer $ áheyrnarfulltrúa * @ skila Boolean * / opinber virka removeObserver (Observer $ Observer) {framhandleggur ($ þessu-> _observerList AS $ lykill => $ Ob) {if ($ Ob == $ Observer) {afvalið ($ þessu-> _observerList [$ lykill]); aftur true;}} return false;} / ** * Aðferð til að uppfæra áheyrnarfulltrúa * * @ var band: newsHeadline * @ skila ógilt * / opinber updateObservers virka ($ newsHeadline) {framhandleggur ($ þessu-> _observerList AS $ Ob) {$ ís-> Update ($ newsHeadline);}} / ** * Add ný frétt * * @ var band: Sagan * @ skila ógilt * / opinber virka addNewsStory ($ saga) {if (tómur ($ saga) | |! is_string ($ saga)) {kasta nýju InvalidArgumentException ('Expected fréttir Sagan ');!} $ þessu-> updateObservers ($ saga);}} Controller Script
<? PHP / ** * Observer Design Pattern Dæmi * * @ Höfundur Lloyd Watkin * @ Síðan 2009/12/23 * @ Tengill http://www.evilprofessor.co.uk * / eru 'observers.php'; eru 'subject.php'; if (! tómur ($ _SERVER ['HTTP_USER_AGENT'])) { 'echo'; } / / Hvað erum við að gera? echo 'Observer Pattern Dæmi í PHP. PHP_EOL; echo'================================'. PHP_EOL; / / Setja upp efni okkar $ Sæta = new ArticleAggregator (); echo '- ArticleAggregator búið. PHP_EOL; / / Settu málið $ Fyrirvara-> addObserver (nýr NewsObserver ()); $ Fyrirvara-> addObserver ($ gossiper = new GossipObserver ()); echo '- Bætt við NewsObverser & GossipObserver'. PHP_EOL. PHP_EOL; / / Flauta, píp, píp ... Fréttir Flash! echo 'Fréttaskot: orðstír Rugby leikmaður elskar fjármál. PHP_EOL; echo'================================================ '. PHP_EOL; $ Fyrirvara-> addNewsStory ('orðstír Rugby leikmaður elskar fjármál'); echo PHP_EOL; echo '- SportObserver hefur fundið út og vill ganga í hópinn!'; $ Fyrirvara-> addObserver (nýr SportObserver ()); echo PHP_EOL. PHP_EOL; / / Flauta, píp, píp ... Fréttir Flash! echo 'Fréttaskot: Government boðberi upp aftur! " . PHP_EOL; echo'======================================='. PHP_EOL; $ Fyrirvara-> addNewsStory ('stjórnvöld boðberi upp aftur!'); echo PHP_EOL; / / Flauta, píp, píp ... Fréttir Flash! echo 'Fréttaskot: tísku og fótbolta sameina ". PHP_EOL; echo'======================================='. PHP_EOL; $ Fyrirvara-> addNewsStory ('tísku og fótbolta sameina'); echo PHP_EOL; / / Flauta, píp, píp ... Fréttir Flash! echo 'Fréttaskot: tónlist og stjórnmál, hvað næst? " . PHP_EOL; echo'=========================================='. PHP_EOL; $ Fyrirvara-> addNewsStory ('tónlist og stjórnmál, hvað næst?'); echo PHP_EOL; / ** * Gossipers vaxa þreyttur af fréttum mjög hratt og hafa ákveðið * Að hætta að hlusta, þrátt fyrir alla áhugavert fréttir í dag! * / echo "- GossipObserver er leiður og yfirgefur hópinn! . PHP_EOL. PHP_EOL; $ Fyrirvara-> removeObserver ($ gossiper); / / Flauta, píp, píp ... Fréttir Flash - Update til fyrri saga! echo 'NewsUpdate: tísku og fótbolta sameina segir. 'Stjórnvalda. PHP_EOL; echo'================================================ '. '========='. PHP_EOL; $ Fyrirvara-> addNewsStory ('tísku og fótbolta sameina ". 'Segir ríkisstjórn'); echo PHP_EOL; if (! tómur ($ _SERVER ['HTTP_USER_AGENT'])) { 'echo';
}



















































Halló,
First, ensku er mjög léleg, þá
Getur þú sagt mér hvað er kerfið á myndinni?
Fedora 12?
Hvað er þemað?
Halló,
Getur þú sagt mér hvað er kerfið á myndinni?
Fedora 12?
Hvað er þemað?
Fedora hennar 11 með KDE beitt. Glasslooks þema Ég trúi.