PHP Design Patterns - Observer Pattern
Ik heb het lezen van Head First Design Patterns onlangs hebben besloten om een aantal van de patronen te schrijven als PHP voorbeelden voor mijn eigen voordeel. Het eerste dat ik heb besloten tot code is het Observer Pattern . De formele definitie van het Observer Pattern is:
De waarnemer patroon (een subset van de asynchrone publish / subscribe patroon ) is een software ontwerp patroon waarin een object , genaamd het onderwerp, houdt een lijst bij van de personen ten laste, genaamd waarnemers, en waarschuwt ze automatisch van een staat veranderingen, meestal door te bellen naar een van hun methoden . Het wordt voornamelijk gebruikt om gedistribueerde event handling systemen te implementeren.
Als systemen steeds meer losjes gekoppelde ervoor te zorgen dat wanneer een gebeurtenis die alle systemen vereisen kennis van deze updates op de hoogte gebeurt. Bijvoorbeeld, een blog post, na het opslaan van een post we kan nodig zijn om een zoekmachine update (bv. Lucene), werken onze sitemap, tags, e-mail ingeschreven gebruikers, enz. De waarnemer patroon stelt ontwikkelaars in staat om extra luisteraars toe te voegen zonder het bewerken van hun waarneembare object . Door het injecteren van waarnemers (dat wil zeggen een search engine-update waarnemer, een sitemap generator, etc) in een onderwerp (dat wil zeggen blog post editing systeem) kunnen we toestaan dat de aan alle noodzakelijke updates uit te voeren zonder wijzigingen.
Voordat de Observer patroon werd geïdentificeerd de gebruikelijke truc zou zijn om het waarneembare object met een extra lijn van code om het gewenste systeem te updaten bijwerken en het verwijderen van de regel code als nodig is. Dit staat niet toe dat voor het eenvoudig toevoegen en verwijderen van waarnemers.
Het onderwerp updates al zijn waarnemers via een update-methode. Deze update methode roept een methode om in elke waarnemer die is afgeleid van de implementatie van een interface. Waarnemers kunt een zelf verwijderen via methoden in de waarneembare object.
Dat is eigenlijk het! Ik heb altijd een voorbeeld voor de beste methode om te leren / begrijpen zo hier is mijn code tot voorbeeld ...
Observer Pattern in PHP
In mijn voorbeeld heb ik een nieuws systeem (NewsAggregator), die uitzendt nieuws headline updates voor kleinere news feeds. Hier het nieuws syteem neemt de plaats in van het onderwerp, waarneembare, enz. terwijl de nieuws-feeds neemt u de rol van de waarnemers of luisteraars.
Eenmaal geïnitialiseerd waarnemers kunnen hechten en zich losmaken van het onderwerp als zij dat nodig achten. In mijn voorbeeld heb ik gemaakt drie waarnemers, deze scan de krantenkoppen door het onderwerp verzonden en 'schreeuwen' het nieuws als zijn van toepassing. De drie waarnemers worden hieronder genoemd, samen met de termen die ze scannen op bij de ontvangst van nieuwsberichten:
- Sport Observer: 'rugby', 'football', 'tennis'
- News Observer: 'politiek', 'financiën', 'overheid'
- Gossip Observer: 'celebrity', 'muziek', 'mode'
Na initalising het onderwerp voeg ik het nieuws en roddels waarnemers en sturen een nieuws update. Hierna wordt de sport waarnemer wordt toegevoegd voordat er nog meer nieuws updates worden verzonden. Ten slotte de roddels waarnemer wordt verwijderd voordat een definitief nieuws headline wordt uitgezonden.
De drie verschillende klassen waarnemer implementeren van de interface Observer, dit geeft hen een duidelijke interface / methode waarmee zij zullen ontvangen updates. Mits zij de uitvoering van de Observer-interface zullen zij in staat om zich te hechten aan het onderwerp. Dit houdt ook met de programmering paradigma van de 'programma-interfaces niet implementaties'. De NewsAggregator klasse breidt de abstracte klasse onderwerp, dat ons voorziet van de drie vereiste publiek methoden:
- updateObservers ()
- addObserver ()
- removeObserver ()
De code kan hier gezien worden uitgevoerd, Observer Pattern in PHP Running , en de code kan worden gedownload van hier, Observer Pattern in PHP code .
Observer Script
<? Php / ** * Dit bestand bevat de waarnemers * * @ Author Lloyd Watkin * @ Sinds 2009/12/23 * / abstracte klasse Onderwerp { abstract publieke functie addObserver (Observer $ waarnemer); abstract publieke functie removeObserver (Observer $ waarnemer); abstract public function updateObservers ($ newsHeadline); } / ** * Dit is het onderwerp klasse voor het voorbeeld * * @ Author Lloyd Watkin * @ Sinds 2009/12/23 * / klasse ArticleAggregator breidt Onderwerp { / ** * Houdt een lijst van onze waarnemers * * @ Var array- * / beschermd $ _observerList = array (); / ** * Methode om een waarnemer toe te voegen * * @ Var Observer $ waarnemer * @ Return void * / publieke functie addObserver (Observer $ waarnemer) { $ This-> _observerList [] = $ waarnemer; } / ** * Methode om een waarnemer te verwijderen * * @ Var Observer $ waarnemer * @ Return boolean * / publieke functie removeObserver (Observer $ waarnemer) { foreach ($ this-> _observerList AS $ key => $ ob) { if ($ ob == $ waarnemer) { unset ($ this-> _observerList [$ key]); return true; } } return false; } / ** * Methode om waarnemers updaten * * @ Var string $ newsHeadline * @ Return void * / public function updateObservers ($ newsHeadline) { foreach ($ this-> _observerList AS $ ob) { $ Ob-> update ($ newsHeadline); } } / ** * Voeg een nieuw nieuwsbericht * * @ Var string $ verhaal * @ Return void * / public function addNewsStory ($ verhaal) { if (empty ($ verhaal) | |! is_string ($ verhaal)) { werpen een nieuw InvalidArgumentException ('Verwacht een nieuwsbericht!'); } $ This-> updateObservers ($ verhaal); } }
Onderwerp / Waarneembare Script
? <Php / ** * Dit bestand bevat het onderwerp * * @ author Lloyd Watkin * @ sinds 2009/12/23 * / abstracte klasse Onderwerp {abstract public function addObserver (Observer $ waarnemer); abstract public function removeObserver (Observer $ waarnemer ); abstract public function updateObservers ($ newsHeadline);} / ** * Dit is het onderwerp klasse voor het voorbeeld * * @ author Lloyd Watkin * @ sinds 2009/12/23 * / class ArticleAggregator breidt Onderwerp {/ ** * Houdt een lijst van onze waarnemers * * @ var array * / $ beschermd _observerList = array (); / ** * Methode om een waarnemer toe te voegen * * @ var Observer $ waarnemer * @ return void * / public function addObserver (Observer $ waarnemer) {$ this-> _observerList [] = $ waarnemer;} / ** * Methode om een waarnemer te verwijderen * * @ var Observer $ waarnemer * @ return boolean * / public function removeObserver (Observer $ waarnemer) {foreach ($ this-> _observerList AS $ key => $ ob) {if ($ ob == $ waarnemer) {unset ($ this-> _observerList [$ key]); return true;}} return false;} / ** * Methode om waarnemers updaten * * @ var string $ newsHeadline * @ return void * / public function updateObservers ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ ob-> update ($ newsHeadline);}} / ** * Voeg toe een nieuw nieuwsbericht * * @ var string $ verhaal * @ return void * / public function addNewsStory ($ verhaal) {if (empty ($ verhaal) | |! is_string ($ verhaal)) {throw new InvalidArgumentException ('Verwacht een nieuws verhaal ');!} $ this-> updateObservers ($ verhaal);}} Controller Script
<? Php / ** * Observer Design Pattern Voorbeeld * * @ Author Lloyd Watkin * @ Sinds 2009/12/23 * @ Link http://www.evilprofessor.co.uk * / zijn 'observers.php'; zijn 'subject.php'; if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) { echo ''; } / / Wat doen wij? echo 'Observer Pattern Voorbeeld in PHP'. PHP_EOL; echo'================================'. PHP_EOL; / / Stel ons onderwerp $ Subject = new ArticleAggregator (); echo '- ArticleAggregator gemaakt'. PHP_EOL; / / Voeg sommige waarnemers $ Subject-> addObserver (nieuw NewsObserver ()); $ Subject-> addObserver ($ gossiper = new GossipObserver ()); echo '- Toegevoegd NewsObverser & GossipObserver'. PHP_EOL. PHP_EOL; / / Piep, piep, piep ... News Flash! echo 'Newsflash: celebrity rugby speler houdt van financiën'. PHP_EOL; echo'================================================ '. PHP_EOL; $ Subject-> addNewsStory ('celebrity rugby-speler houdt van financiën'); echo PHP_EOL; echo '- SportObserver heeft ontdekt en wil toetreden tot de groep!'; $ Subject-> addObserver (nieuw SportObserver ()); echo PHP_EOL. PHP_EOL; / / Piep, piep, piep ... News Flash! echo 'Newsflash: de overheid messes weer!' . PHP_EOL; echo'======================================='. PHP_EOL; $ Subject-> addNewsStory ('government messes up weer!'); echo PHP_EOL; / / Piep, piep, piep ... News Flash! echo 'Newsflash: mode en voetbal te combineren ". PHP_EOL; echo'======================================='. PHP_EOL; $ Subject-> addNewsStory ('mode en voetbal te combineren'); echo PHP_EOL; / / Piep, piep, piep ... News Flash! echo 'Newsflash: muziek en politiek, wat nu?' . PHP_EOL; echo'=========================================='. PHP_EOL; $ Subject-> addNewsStory ('muziek en politiek, wat nu?'); echo PHP_EOL; / ** * Roddelaars moe van nieuws heel snel en hebben besloten * Om te stoppen met luisteren, ondanks alle interessante nieuws vandaag! * / echo '- GossipObserver verveelt zich en verlaat de groep!' . PHP_EOL. PHP_EOL; $ Subject-> removeObserver ($ gossiper); / / Piep, piep, piep ... Nieuwsflits - Update naar een eerder verhaal! echo 'NIEUWS: mode en voetbal te combineren zegt'. 'Overheid'. PHP_EOL; echo'================================================ '. '========='. PHP_EOL; $ Subject-> addNewsStory ('mode en voetbal te combineren ". 'Zegt de regering'); echo PHP_EOL; if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) { echo '';
}


















































Hallo,
De eerste, Mijn Engels is zeer slecht, dan
Kunt u mij vertellen wat het systeem op de foto?
Fedora 12?
Wat is het thema?
Hallo,
Kunt u mij vertellen wat het systeem op de foto?
Fedora 12?
Wat is het thema?
De Fedora 11 met KDE toegepast. Glasslooks thema geloof ik.