PHP Design Patterns - Observer Pattern
Ma olen lugemise pea esimese Design Patterns hiljuti ja on otsustanud kirjutada mõned mustrid PHP näiteid minu enda huvides. Esimene, et ma olen otsustanud kood up on Observer Pattern . Ametliku määratluse Observer Pattern on:
Vaatleja muster (alagrupis asünkroonne avaldab / tellida muster ) on tarkvara disain muster , kus objekt ehk teema, säilitab nimekirja tema ülalpeetavate, mida nimetatakse vaatlejad ning teavitab neid automaatselt iga seisund muutub, tavaliselt helistaja üks nende meetodeid . Seda kasutatakse peamiselt rakendada jagatud sündmus käitlemise süsteeme.
Kuna süsteem muutub nõrgalt sidestatud tagada, et kui sündmus juhtub kõik süsteemid, mis nõuavad teadmisi need uuendused on informeeritud. Näiteks blogi, pärast salvestamist post võib meil tekkida vajadus uuendada otsingumootor (nt Lucene) uuendada meie sitemap, sildid, e tellinud kasutajatele jne vaatleja muster võimaldab arendajatel lisada täiendavaid kuulajad ilma redigeerimise oma jälgitav objekt . Süstides vaatlejad (st otsingumootor uuendada vaatlejana sitemap generaator jne) arvesse teema (st blogi redigeerimise süsteemi) saame võimaldada tal täita kõik vajalikud uuendused ilma mingeid muudatusi.
Enne vaatleja muster tuvastati tavaline trikk oleks uuendada jälgitav objekt täiendavat koodirida uuendamiseks vajaliku süsteemi, ja kõrvaldades rida koodi kui vaja. See ei võimalda kergesti lisades ja eemaldades vaatlejatena.
Teema uuendused kõik oma vaatlejate kaudu uuendada meetod. See värskendus meetod nõuab meetod iga vaatleja, mis on saadud rakendada liides. Vaatlejad saavad lisada taanduma meetoditega vaadeldavas objekti.
See on lühidalt kõik! Ma leian alati eeskujuks olla parim meetod õppimise / mõistmine nii siin on minu kodeeritud üles näiteks ...
Observer Muster PHP
Minu näiteks lõin uudised süsteemi (NewsAggregator), mis saadab välja uudis pealkiri uuendused väiksem uudiste. Siin uudiste sytem võtab koha Teema jälgitav, jne arvestades uudiste võtta osa vaatlejatena või kuulajaid.
Kui initsialiseeritakse vaatlejad on võimalik lisada ja eemaldada ennast teema nagu neile sobib. Minu näiteks olen loonud kolm vaatlejat, need skaneerida pealkirju poolt saadetud teema ja "karjuda" uudis, kui selle on asjakohane. Kolm vaatlejat on nimetatud allpool koos poolest nad skannida, kui nad saavad uudiste pealkirju:
- Sport Observer: "rugby", "jalgpall", "Tennis"
- Uudised Observer: "poliitika", "rahandus", "valitsus"
- Gossip Observer: "kuulsus", "muusika", "mood"
Pärast initalising teema lisan uudiseid ja kuulujutte vaatlejad ja saata välja uudised. Pärast seda sport vaatleja lisatakse enne rohkem uudiseid värskendused on välja saadetud. Lõpuks gossip vaatleja eemaldatud enne lõplikku uudiste pealkiri on välja saadetud.
Kolme erineva vaatleja klasside rakendada liides Observer, see annab neile selge kasutajaliides / meetod, mille kaudu nad saavad uuendused. Tingimusel, et nad rakendavad Observer interface on neil võimalik end kinnitada Teema. See hoiab programmeerimine paradigma "programmi liidesed ei rakendused". NewsAggregator klassi laiendab abstraktset klassi teema, mis annab meile kolm nõutavat avalik meetodid:
- updateObservers ()
- addObserver ()
- removeObserver ()
Koodi saab näha töötab siin Observer Muster PHP Running , koodi saab alla laadida siit Observer Muster PHP kood .
Observer Script
<? Php / ** * See fail sisaldab vaatlejad * * @ Author Lloyd Watkin * @ Alates 2009/12/23 * / abstraktse klassi Teema { abstraktne avaliku funktsiooni addObserver (Observer $ vaatleja); abstraktne avaliku funktsiooni removeObserver (Observer $ vaatleja); abstraktne avaliku funktsiooni updateObservers ($ newsHeadline); } / ** * See on teema klassis näiteks * * @ Author Lloyd Watkin * @ Alates 2009/12/23 * / klassi ArticleAggregator ulatub Teema { / ** * Hoiab nimekiri meie vaatlejad * * @ Var array * / kaitstud $ _observerList = array (); / ** * Meetod lisada vaatleja * * @ Var Observer $ vaatleja * @ Return void * / avaliku funktsiooni addObserver (Observer $ vaatleja) { $ This-> _observerList [] = $ vaatleja; } / ** * Meetod eemaldada vaatleja * * @ Var Observer $ vaatleja * @ Return boolean * / avaliku funktsiooni removeObserver (Observer $ vaatleja) { foreach ($ this-> _observerList kui $ key => $ ob) { if ($ ob == $ vaatleja) { väljalülitatud ($ this-> _observerList [$ võti]); tagasi true; } } tagasi false; } / ** * Meetod uuendada vaatlejad * * @ Var string $ newsHeadline * @ Return void * / avaliku funktsiooni updateObservers ($ newsHeadline) { foreach ($ this-> _observerList AS $ ob) { $ Ob-> Värskenda ($ newsHeadline); } } / ** * Lisa uus uudis * * @ Var string $ lugu * @ Return void * / avaliku funktsiooni addNewsStory ($ lugu) { if (tühi ($ lugu) | |! is_string ($ lugu)) { viska uus InvalidArgumentException ("Oodatud uudis! '); } $ This-> updateObservers ($ lugu); } }
Teema / jälgitav Script
<? Php / ** * See fail sisaldab teema * * @ author Lloyd Watkin * @ alates 2009/12/23 * / abstraktne klass Teema {abstract avaliku funktsiooni addObserver (Observer $ vaatleja); abstraktne avaliku funktsiooni removeObserver (Observer $ vaatleja ); abstraktne avaliku funktsiooni updateObservers ($ newsHeadline);} / ** * See on teema klassis näiteks * @ author Lloyd Watkin * @ alates 2009/12/23 * / class ArticleAggregator ulatub Teema {/ ** * Hoiab nimekiri meie vaatlejad * @ var massiiv * / kaitstud $ _observerList = array (); / ** * Meetod lisada vaatleja * @ var Observer $ vaatleja * @ return void * / public function addObserver (Observer $ vaatleja) {$ this-> _observerList [] = $ vaatleja;} / ** * Meetod eemaldada vaatleja * @ var Observer $ vaatleja * @ return boolean * / public function removeObserver (Observer $ vaatleja) {foreach ($ this-> _observerList kui $ key => $ ob) {if ($ ob == $ vaatleja) {väljalülitatud ($ this-> _observerList [$ võti]); tagasi true;}} tagasi false;} / ** * Meetod uuendada vaatlejad * * @ var string $ newsHeadline * @ return void * / public function updateObservers ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ ob-> Värskenda ($ newsHeadline);}} / ** * Lisa uus uudis * @ var string $ lugu * @ return void * / public function addNewsStory ($ lugu) {if (tühi ($ lugu) | |! is_string ($ lugu)) {heita InvalidArgumentException ("Oodatud uudised lugu! ');} $ this-> updateObservers ($ lugu);}} Controller Script
<? Php / ** * Observer Design Pattern Näide * * @ Author Lloyd Watkin * @ Alates 2009/12/23 * @ Link http://www.evilprofessor.co.uk * / hõlmavad "observers.php"; hõlmavad "subject.php"; if (! tühi ($ _SERVER ['HTTP_USER_AGENT'])) { echo '"; } / / Mida me teeme? echo 'Observer Muster näide PHP ". PHP_EOL; echo'================================'. PHP_EOL; / / Set up meie teema $ Teema = new ArticleAggregator (); echo "- ArticleAggregator loodud". PHP_EOL; / / Lisa mõned vaatlejad $ Teema-> addObserver (uus NewsObserver ()); $ Teema-> addObserver ($ lobiseja = new GossipObserver ()); echo '- Lisatud NewsObverser & GossipObserver ". PHP_EOL. PHP_EOL; / / Piiks, piiks, piiks ... Uudised Flash! echo 'uudis: kuulsus ragbi mängija armastab rahastada. " PHP_EOL; echo'================================================ ". PHP_EOL; $ Teema-> addNewsStory ("kuulsus ragbi mängija armastab rahastada '); echo PHP_EOL; echo "- SportObserver on teada ja tahab liituda '; $ Teema-> addObserver (uus SportObserver ()); echo PHP_EOL. PHP_EOL; / / Piiks, piiks, piiks ... Uudised Flash! echo 'uudis: valitsus sööklad jälle! " . PHP_EOL; echo'======================================='. PHP_EOL; $ Teema-> addNewsStory ("valitsuse messide up jälle! '); echo PHP_EOL; / / Piiks, piiks, piiks ... Uudised Flash! echo 'uudis: mood ja jalgpalli kombineerida. " PHP_EOL; echo'======================================='. PHP_EOL; $ Teema-> addNewsStory ("moe-ja jalgpalli kombineerida '); echo PHP_EOL; / / Piiks, piiks, piiks ... Uudised Flash! echo 'uudis: muusika ja poliitika, mis edasi? " . PHP_EOL; echo'=========================================='. PHP_EOL; $ Teema-> addNewsStory (muusika ja poliitika, mis edasi? '); echo PHP_EOL; / ** * Gossipers kasvada väsinud uudiseid väga kiiresti ja on otsustanud * Kuni kuulamine vaatamata kõigile huvitav uudis täna! * / echo "- GossipObserver on igav ja jätab gruppi! . PHP_EOL. PHP_EOL; $ Teema-> removeObserver ($ lobiseja); / / Piiks, piiks, piiks ... Uudised Flash - Update varasem lugu! echo 'NewsUpdate: mood ja jalgpalli ühendada ütleb. " "Valitsemissektor". PHP_EOL; echo'================================================ ". '========='. PHP_EOL; $ Teema-> addNewsStory ("moe-ja jalgpalli kombineerida." "Ütleb valitsus '); echo PHP_EOL; if (! tühi ($ _SERVER ['HTTP_USER_AGENT'])) { echo '";
}


















































Tere,
Esiteks, mu inglise keel on väga halb, siis
Kas oskate öelda, milline on süsteemi pildil?
Fedora 12?
Mis teema on?
Tere,
Kas oskate öelda, milline on süsteemi pildil?
Fedora 12?
Mis teema on?
Tema Fedora 11 KDE kohaldada. Glasslooks teema ma usun.