PHP designmönster - Observer Pattern
Jag har läst Head First Design Patterns nyligen och har beslutat att skriva några av de mönster som PHP-exempel för min egen skull. Den första som jag har bestämt att koda upp är Observer Pattern . Den formella definitionen av Observer-mönstret är:
Observatören mönster (en delmängd av den asynkrona publicera / prenumerera mönster ) är en programvara designmönster som ett objekt , som kallas ämnet, upprätthåller en förteckning över sina anhöriga, som kallas observatörer, och meddelar dem automatiskt i någon stat förändringar, vanligtvis genom att ringa en av deras metoder . Det är främst används för att implementera distribuerade system händelsehantering.
Eftersom system blir mer löst kopplade och se till att när en händelse inträffar alla system som kräver kunskap om dessa uppdateringar är informerade. Till exempel, ett blogginlägg, efter att ha sparat ett inlägg vi kan behöva uppdatera en sökmotor (t.ex. Lucene), uppdatera vår sitemap, etiketter, e-post tecknas användare etc. Observer-mönstret kan utvecklare att lägga till ytterligare lyssnare utan att redigera sina observerbara objekt . Genom att injicera observatörer (dvs en sökmotor uppdatering observatör, en webbplatskarta, etc) i ett ämne (dvs. blogginlägg redigering av systemet) kan vi låta det att utföra alla nödvändiga uppdateringar utan några förändringar.
Innan Observer mönstret identifierades de vanliga tricken skulle vara att uppdatera observerbara objekt med en extra kodrad för att uppdatera systemfiler, och ta bort kodraden som krävs. Detta tillåter inte för att enkelt lägga till och ta bort observatörer.
Ämnet uppdaterar alla sina observatörer via en uppdatering metod. Denna uppdatering metodanrop en metod i varje observatör som härrör från att genomföra ett gränssnitt. Observatörer kan lägga till ett ta bort sig genom metoder i observerbara objekt.
Det är i princip det! Jag tycker alltid ett exempel att vara den bästa metoden för lärande / förståelse så här är min kodade upp exempel ...
Observer Pattern i PHP
I mitt exempel har jag skapat ett nytt system (NewsAggregator) som skickar ut uppdateringar av nyheter rubriken till mindre nyhetsflöden. Här nyheterna sytem tar plats i ämnet, observerbara, etc medan nyhetsflöden ta rollen som observatörer eller lyssnare.
När initieras observatörer kan fästa och lösgöra sig från ämnet som de finner lämpligt. I mitt exempel har jag skapat tre observatörer, dessa skanna rubriker som skickas ut av ämnet och "ropa" nyheten om dess behov. De tre observatörerna är namngivna nedan tillsammans med de villkor som de söker efter när de tar emot nyhetsrubriker:
- Sport Observer: "rugby", "fotboll", "tennis"
- Nyheter Observer: "politiken", "finans", "regeringen"
- Gossip Observer: "kändis", "musik", "mode"
Efter initalising ämnet jag lägga till nyheter och observatörer skvaller och skicka ut en nyhet uppdatering. Efter detta sporten observatören läggas innan mer nyheter sänds ut. Slutligen skvaller observatören bort innan en slutlig nyhetsrubrik skickas ut.
De tre olika observatören klasser implementera gränssnittet Observer, ger dem en tydlig gränssnitt / metod genom vilken de kommer att få uppdateringar. Förutsatt att de implementera Observer gränssnittet kommer de att kunna ansluta sig till ämnet. Detta håller också med programmering paradigm "för att gränssnitt inte implementeringar. Den NewsAggregator klassen utökar abstrakt klass ämne, som ger oss de tre begärda allmänna metoder:
- updateObservers ()
- addObserver ()
- removeObserver ()
Koden kan ses som kör här, Observer Mönster i PHP som körs , och koden kan laddas ner härifrån, Observer Mönster i PHP-kod .
Observer Script
<? Php / ** * Denna fil innehåller observatörerna * * @ Author Lloyd Watkin * @ Sedan 2009/12/23 * / abstrakt klass Ämne { abstrakt public function addObserver (observatör $ observatör); abstrakt public function removeObserver (observatör $ observatör); abstrakt offentlig funktion updateObservers ($ newsHeadline); } / ** * Detta är ämnet klass för exempelvis * * @ Author Lloyd Watkin * @ Sedan 2009/12/23 * / klass ArticleAggregator utökar Ämne { / ** * Innehåller en lista över våra observatörer * * @ Var array * / skyddade $ _observerList = array (); / ** * Metod för att lägga till en observatör * * @ Var Observer $ observatör * @ Return ogiltig * / public function addObserver (observatör $ observatör) { $ This-> _observerList [] = $ observatör; } / ** * Metoden för att avlägsna en observatör * * @ Var Observer $ observatör * @ Return boolean * / public function removeObserver (observatör $ observatör) { foreach ($ this-> _observerList som $ key => $ ob) { if ($ ob == $ observatör) { unset ($ this-> _observerList [$ key]); return true; } } return false; } / ** * Metod att uppdatera observatörer * * @ Var string $ newsHeadline * @ Return ogiltig * / offentlig funktion updateObservers ($ newsHeadline) { foreach ($ this-> _observerList som $ ob) { $ Ob-> uppdatera ($ newsHeadline); } } / ** * Lägg till en ny nyhet * * @ Var string $ berättelse * @ Return ogiltig * / offentlig funktion addNewsStory ($ berättelse) { if (empty ($ story) | |! is_string ($ story)) { kasta nytt InvalidArgumentException ("Förväntade en nyhet! '); } $ This-> updateObservers ($ berättelse); } }
Ämne / Observerbara Script
<? Php / ** * Denna fil innehåller ämnet * * @ Author Lloyd Watkin * @ Sedan 2009/12/23 * / abstrakt klass Ämne { abstrakt public function addObserver (observatör $ observatör); abstrakt public function removeObserver (observatör $ observatör); abstrakt offentlig funktion updateObservers ($ newsHeadline); } / ** * Detta är ämnet klass för exempelvis * * @ Author Lloyd Watkin * @ Sedan 2009/12/23 * / klass ArticleAggregator utökar Ämne { / ** * Innehåller en lista över våra observatörer * * @ Var array * / skyddade $ _observerList = array (); / ** * Metod för att lägga till en observatör * * @ Var Observer $ observatör * @ Return ogiltig * / public function addObserver (observatör $ observatör) { $ This-> _observerList [] = $ observatör; } / ** * Metoden för att avlägsna en observatör * * @ Var Observer $ observatör * @ Return boolean * / public function removeObserver (observatör $ observatör) { foreach ($ this-> _observerList som $ key => $ ob) { if ($ ob == $ observatör) { unset ($ this-> _observerList [$ key]); return true; } } return false; } / ** * Metod att uppdatera observatörer * * @ Var string $ newsHeadline * @ Return ogiltig * / offentlig funktion updateObservers ($ newsHeadline) { foreach ($ this-> _observerList som $ ob) { $ Ob-> uppdatera ($ newsHeadline); } } / ** * Lägg till en ny nyhet * * @ Var string $ berättelse * @ Return ogiltig * / offentlig funktion addNewsStory ($ berättelse) { if (empty ($ story) | |! is_string ($ story)) { kasta nytt InvalidArgumentException ("Förväntade en nyhet! '); } $ This-> updateObservers ($ berättelse); } }
Controller Script
<? Php / ** * Observer Design Pattern Exempel * * @ Author Lloyd Watkin * @ Sedan 2009/12/23 * @ Länk http://www.evilprofessor.co.uk * / inkluderar "observers.php '; inkluderar "subject.php '; if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) { echo '';} / / Vad gör vi? echo "Observer Pattern Exempel i PHP". PHP_EOL, eko'================================'. PHP_EOL, / / Ställ in vårt ämne $ subject = new ArticleAggregator (); echo '- ArticleAggregator skapat ". PHP_EOL, / / Lägg till några observatörer $ subject-> addObserver (nytt NewsObserver ()); $ subject-> addObserver ($ gossiper = new GossipObserver ()); echo "- Tillagd NewsObverser & GossipObserver". PHP_EOL. PHP_EOL, / / Pip, pip, pip ... News Flash! echo "Newsflash: kändis rugbyspelare älskar finansiering". PHP_EOL; eko'============================================== == ". PHP_EOL, $ subject-> addNewsStory ("kändis rugbyspelare älskar finanser '); echo PHP_EOL, echo' - SportObserver har fått reda på och vill gå med i gruppen!", $ Subject-> addObserver (nytt SportObserver ()); echo PHP_EOL . PHP_EOL, / / Pip, pip, pip ... News Flash! echo "Nyhet: Regeringen mässar upp igen!" . PHP_EOL, eko'======================================='. PHP_EOL, $ subject-> addNewsStory ("regering mässar upp igen! '); Echo PHP_EOL, / / Pip, pip, pip ... News Flash! echo "Newsflash: mode och fotboll ihop". PHP_EOL, eko'======================================='. PHP_EOL, $ subject-> addNewsStory ("mode och fotboll kombinera '); echo PHP_EOL, / / Pip, pip, pip ... News Flash! echo "Newsflash: musik och politik, vad händer sen?" . PHP_EOL, eko'=========================================='. PHP_EOL, $ subject-> addNewsStory ("musik och politik, vad händer sen? '); Echo PHP_EOL; / ** * Gossipers tröttna på nyheterna mycket snabbt och har beslutat * för att sluta lyssna, trots alla intressanta nyheter idag! * / Echo "- är GossipObserver uttråkad och lämnar gruppen!" . PHP_EOL. PHP_EOL, $ subject-> removeObserver ($ gossiper), / / Pip, pip, pip ... News Flash - Uppdatering av en tidigare historia! echo 'NewsUpdate: mode och fotboll kombinera säger ". "Regering". PHP_EOL; eko'============================================== == ". '========='. PHP_EOL, $ subject-> addNewsStory ("mode och fotboll kombinera" säger regeringen ".) Echo PHP_EOL, if (! Empty ($ _SERVER ['HTTP_USER_AGENT'])) {echo '';
}


















































Hej,
För det första är min engelska väldigt dålig, då
Kan du berätta för mig vad är det system på bilden?
Fedora 12?
Vad är temat?
Hej,
Kan du berätta för mig vad är det system på bilden?
Fedora 12?
Vad är temat?
Dess Fedora 11 med KDE tillämpas. Glasslooks tema tror jag.