PHP Design Patterns - Observer Pattern
Ég hef verið að lesa Head First Design Patterns undanfarið og hafa ákveðið að skrifa nokkur af mynstri sem PHP dæmi um eigin hag minn. Sá fyrsti sem ég hef ákveðið að kóða upp er Observer Pattern . Formleg skilgreining á Observer Pattern er:
Áhorfandan mynstur (hlutmengi ósamstilltur birta / subscribe mynstur ) er hugbúnaður hönnun mynstur þar sem hlut , kallast efni, viðheldur lista á framfæri sínu, sem heitir áheyrnarfulltrúa, og lætur þá sjálfkrafa hvaða ríki breytist, oftast með því að hringja ein þeirra aðferða . Það er aðallega notað til að framkvæma dreift atburður meðhöndlun kerfi.
Sem kerfi verða lauslega ásamt því að tryggja að þegar atburður gerist öll kerfi sem krefjast þekkingar á þessar uppfærslur eru upplýstir. Til dæmis, blogg, eftir vistun færslu gætum við þurft að uppfæra leitarvél (td Lucene), endurnýja sitemap okkar, tags, email áskrift notenda, etc áheyrnarfulltrúa mynstur leyfa verktaki til að bæta við frekari hlustun án þess að breyta undirliggjandi hlut þeirra . Með því að breiða sem málið (þ.e. leitarvél uppfæra áheyrnarfulltrúa, sitemap rafall, osfrv) í titil (þ.e. blogg breyta kerfi) við getum að leyfa henni að framkvæma allar nauðsynlegar uppfærslur án breytinga.
Áður en Observer mynstur var bent á venjulegum bragð væri að uppfæra undirliggjandi hlut með auka línu af kóða til að uppfæra þarf kerfið, og fjarlægja línu af kóða sem þarf. Þetta leyfir ekki auðveldlega bæta við og fjarlægja áheyrnarfulltrúa.
Efni endurnýja allt eftirlitsmönnum hennar í gegnum uppfærslu aðferð. Þessi uppfærsla aðferð kallar aðferð í hverju áheyrnarfulltrúa sem er dregið af framkvæmd tengi. Áheyrnarfulltrúar getur bætt við fjarlægja sig með aðferðum í undirliggjandi hlut.
Það er í grundvallaratriðum það! Mér finnst alltaf td að vera besta aðferðin við að læra / skilja svo hér er minn kóði upp dæmi ...
Áheyrnarfulltrúa Pattern í PHP
Í dæmi mínu ég hef búið til fréttir kerfi (NewsAggregator) sem sendir út fréttir fyrirsögn uppfærslur á minni fréttir. Hér fréttir sytem tekur í stað Subject, greinileg, etc en fréttir taka hlutverk Áheyrnarfulltrúar eða hlustun.
Þegar forgöngu um málið er að hengja og taktu sig úr efni sem þeir sjá ástæðu til. Í dæmi sem ég hef búið þrjá áheyrnarfulltrúa, þessir skanna fyrirsagnir send út af efni og "hrópa 'fréttum ef við sitt. Þriggja áheyrnarfulltrúa eru nefnd hér að neðan ásamt þeim skilmálum sem þeir leita að þegar þeir fá fréttir:
- Sport Observer: 'Rugby', 'fótbolti', 'lífrænt'
- Fréttir Observer: 'stjórnmál', 'fjármagna', 'stjórnvalda
- Slúður Observer: "orðstír", 'tónlist', 'tíska'
Eftir initalising efni Ég bæta fréttir og slúður málið og senda út fréttir uppfærslu. Eftir þetta íþrótt áhorfandans er bætt áður en fleiri fréttir uppfærslur eru send út. Loksins slúður áhorfandans er fjarlægt áður en endanleg fréttir fyrirsögn er send út.
Þremur mismunandi flokkum áheyrnarfulltrúa framkvæma í tengi Observer, þetta gefur þeim skýr tengi / aðferð þar sem þeir vilja fá uppfærslur. Tilskildu að þau innleiða Observer tengi þau verði fær um að festa sig við efnið. Þetta heldur einnig með forritun hugmyndafræði 'forrit 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 Pattern í PHP kóðanum .
Observer Script
<? PHP / ** * Þessi skrá inniheldur eftirlitsmenn * * @ Höfundur Lloyd Watkin * @ Síðan 2009/12/23 * / fræðilega greinar Subject { óhlutbundin opinbera virka addObserver (Observer $ áheyrnarfulltrúi); óhlutbundin opinbera virka removeObserver (Observer $ áheyrnarfulltrúi); óhlutbundin opinbera updateObservers virka ($ newsHeadline); } / ** * Þetta er tilefni flokki fyrir dæmið * * @ Höfundur Lloyd Watkin * @ Síðan 2009/12/23 * / bekk ArticleAggregator nær Subject { / ** * Halda skrá yfir málið okkar * * @ Var array * / varin $ _observerList = array (); / ** * Aðferð til að bæta við áheyrnarfulltrúa * * @ Var Observer $ áheyrnarfulltrúa * @ Skila ógilt * / opinbera virka addObserver (Observer $ áheyrnarfulltrúa) { $ This-> _observerList [] = $ áheyrnarfulltrúa; } / ** * Aðferð til að fjarlægja áheyrnarfulltrúi * * @ Var Observer $ áheyrnarfulltrúa * @ Skila Boolean * / opinbera virka removeObserver (Observer $ áheyrnarfulltrúa) { framhandleggur ($ this-> _observerList AS $ lykill => $ OB) { if ($ OB == $ áheyrnarfulltrúa) { afvalið ($ this-> _observerList [$ lykill]); aftur sannur; } } return false; } / ** * Aðferð til að uppfæra eftirlitsmenn * * @ Var strengur $ newsHeadline * @ Skila ógilt * / opinbera updateObservers virka ($ newsHeadline) { framhandleggur ($ this-> _observerList AS $ OB) { $ OB-> uppfært ($ newsHeadline); } } / ** * Bæta við nýrri frétt * * @ Var band: Sagan * @ Skila ógilt * / opinbera virka addNewsStory ($ saga) { if (tómur ($ saga) | |! is_string ($ saga)) { kasta nýju InvalidArgumentException ('Væntanlegur frétt! "); } $ This-> updateObservers ($ saga); } }
Subject / greinileg Script
? <PHP / ** * Þessi skrá inniheldur efni * * @ höfundur Lloyd Watkin * @ síðan 2009/12/23 * / fræðilega greinar Subject {ágrip opinbera virka addObserver (Observer $ áheyrnarfulltrúi); ágrip opinbera virka removeObserver (Observer $ áheyrnarfulltrúa ); ágrip almennings updateObservers virka ($ newsHeadline);} / ** * Þetta er háð tegund fyrir td * * @ höfundur Lloyd Watkin * @ síðan 2009/12/23 * / flokkur ArticleAggregator nær Subject {/ ** * Geymir listi áheyrnarfulltrúa * * okkar @ var array * / varið $ _observerList = array (); / ** * Aðferð til að bæta við áheyrnarfulltrúa * * @ var Observer $ áheyrnarfulltrúa * @ skila ógilt * / public virka addObserver (Observer $ áheyrnarfulltrúa) {$ this-> _observerList [] = $ áheyrnarfulltrúa;} / ** * Aðferð til að fjarlægja áheyrnarfulltrúi * * @ var Observer $ áheyrnarfulltrúa * @ skila Boolean * / public virka removeObserver (Observer $ áheyrnarfulltrúa) {framhandleggur ($ this-> _observerList AS $ lykill => $ OB) {if ($ OB == $ áheyrnarfulltrúa) {afvalið ($ this-> _observerList [$ lykill]); aftur sannur;}} return false;} / ** * Aðferð til að uppfæra eftirlitsmenn * * @ var streng $ newsHeadline * @ skila ógilt * / public updateObservers virka ($ newsHeadline) {framhandleggur ($ this-> _observerList AS $ OB) {$ OB-> uppfært ($ newsHeadline);}} / ** * Add ný frétt * * @ var band: Sagan * @ skila ógilt * / public virka addNewsStory ($ saga) {if (tómur ($ saga) | |! is_string ($ saga)) {henda nýjum InvalidArgumentException ('Væntanlegur fréttir Sagan ');!} $ this-> 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 * / Í 'observers.php'; Í 'subject.php'; if (! tómur ($ _SERVER ['HTTP_USER_AGENT'])) { echo ''; } / / Hvað eigum við að gera? echo 'Observer Pattern Dæmi í PHP. PHP_EOL; echo'================================'. PHP_EOL; / / Setja upp efni okkar $ Sæta = new ArticleAggregator (); echo '- ArticleAggregator created'. PHP_EOL; / / Bættu við eftirlitsmenn $ Háð-> addObserver (nýr NewsObserver ()); $ Háð-> addObserver ($ gossiper = new GossipObserver ()); echo '- Added NewsObverser & GossipObserver'. PHP_EOL. PHP_EOL; / / Píp, píp, píp ... Fréttir Flash! echo 'Newsflash: Celebrity rugby leikmaður elskar fjármál. PHP_EOL; echo'================================================ '. PHP_EOL; $ Háð-> addNewsStory ('orðstír rugby leikmaður elskar fjármál'); echo PHP_EOL; echo '- SportObserver hefur fundið út og vill taka þátt í hópinn!'; $ Háð-> addObserver (nýr SportObserver ()); echo PHP_EOL. PHP_EOL; / / Píp, píp, píp ... Fréttir Flash! echo 'Newsflash: Government boðberi upp aftur! " . PHP_EOL; echo'======================================='. PHP_EOL; $ Háð-> addNewsStory ('stjórnvöld boðberi upp aftur! "); echo PHP_EOL; / / Píp, píp, píp ... Fréttir Flash! echo 'Newsflash: tísku og fótbolta saman. PHP_EOL; echo'======================================='. PHP_EOL; $ Háð-> addNewsStory ('tísku og fótbolta sameina'); echo PHP_EOL; / / Píp, píp, píp ... Fréttir Flash! echo 'Newsflash: tónlist og stjórnmál, hvað næst? . PHP_EOL; echo'=========================================='. PHP_EOL; $ Háð-> 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ð * Til að hætta að hlusta, þrátt fyrir alla áhugaverðar fréttir í dag! * / echo '- GossipObserver er leiðindi og yfirgefur hópinn! . PHP_EOL. PHP_EOL; $ Háð-> removeObserver ($ gossiper); / / Píp, píp, píp ... News Flash - Update til fyrri saga! echo 'NewsUpdate: tísku og fótbolta sameina segir'. 'Stjórnvalda. PHP_EOL; echo'================================================ '. '========='. PHP_EOL; $ Háð-> addNewsStory ('tísku og fótbolta saman. "Segir ríkisstjórn '); echo PHP_EOL; if (! tómur ($ _SERVER ['HTTP_USER_AGENT'])) { echo '';
}



















































Halló,
First, My ensku er mjög slæm, þá
Geturðu sagt mér hvað er kerfið á myndinni?
Fedora 12?
Hvað er þemað?
Halló,
Geturðu sagt mér hvað er kerfið á myndinni?
Fedora 12?
Hvað er þemað?
Fedora Þess 11 með KDE beitt. Glasslooks þema sem ég trúi.