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. De eerste dat ik heb besloten om de code up is de Observer Pattern . De formele definitie van het Observer patroon 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 haar nabestaanden, genaamd waarnemers, en waarschuwt ze automatisch van een staat veranderingen, meestal door te bellen een van hun methodes . Het wordt vooral gebruikt om gedistribueerde event handling systemen te implementeren.
Zoals geworden systemen meer loosely coupled ervoor te zorgen dat wanneer een gebeurtenis gebeurt alle systemen die vereisen dat de kennis van deze updates worden geïnformeerd. Bijvoorbeeld, een blog post, na het opslaan van een post moeten we wellicht een zoekmachine (bijv. Lucene) update, onze sitemap, tags, e-mail ingeschreven gebruikers, enz. De waarnemer patroon kunnen ontwikkelaars om extra luisteraars toe te voegen zonder het bewerken van hun waarneembare object . Door het injecteren van waarnemers (dwz een zoekmachine update waarnemer, een sitemap generator, enz.) in een onderwerp (dat wil zeggen blog post editing systeem) kunnen we toestaan dat de aan alle nodige updates uit te voeren zonder enige veranderingen.
Voordat de Observer patroon werd gewezen op de gebruikelijke truc zou zijn om de waarneembare object update met een extra lijn van code om de gewenste systeem te updaten en 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 te verwijderen door middel van methoden in het waarneembare object.
Dat is eigenlijk het! Ik vind altijd een voorbeeld voor de beste methode om te leren / begrijpen dus hier is mijn code tot voorbeeld kunnen zijn ...
Observer Pattern in PHP
In mijn voorbeeld heb ik een nieuws systeem (NewsAggregator), die stuurt nieuwskop updates voor kleinere nieuwsfeeds. Hier het nieuws sytem neemt de plaats van het onderwerp, waarneembare, etc terwijl het nieuws-feeds nemen de rol van de waarnemers of luisteraars.
Zodra geïnitialiseerd waarnemers kunnen hechten en zich losmaken van het subject als zij dat nodig achten. In mijn voorbeeld heb ik gemaakt drie waarnemers, deze scan de koppen uitgezonden door het onderwerp en 'Shout' het nieuws als de juiste. De drie waarnemers zijn hieronder samen met de termen die ze scan genoemd naar bij de ontvangst van nieuwsberichten:
- Sport Observer: 'rugby', 'voetbal', 'tennis'
- Nieuws Observer: 'de politiek', 'financiën', 'overheid'
- Roddel Observer: 'celebrity', 'muziek', 'mode'
Na initalising het onderwerp voeg ik het nieuws en roddels waarnemers en sturen een nieuws update. Na deze de sport waarnemer is toegevoegd voordat meer nieuws updates worden verzonden. Ten slotte de roddels waarnemer is verwijderd voordat een definitieve nieuwskop is verzonden.
De drie verschillende klassen waarnemer de uitvoering van de interface Observer, dit geeft hen een duidelijke interface / methode waardoor zij zullen ontvangen updates. Op voorwaarde dat zij de uitvoering van de Observer interface die ze in staat zullen zijn om zich te hechten aan het onderwerp. Dit houdt ook met de programmering paradigma van 'programma-interfaces niet implementaties. " De NewsAggregator klasse breidt de abstracte klasse onderwerp, dat ons voorziet van de drie vereiste publieke methoden:
- updateObservers ()
- addObserver ()
- removeObserver ()
De code kan worden gezien draait hier Observer Pattern in PHP Running , en de code kan worden gedownload vanaf hier, Observer Pattern in PHP-code .
Waarnemer Script
<? Php / ** * Dit bestand bevat de waarnemers * * @ Author Lloyd Watkin * @ Sinds 2009/12/23 * / abstracte klasse Onderwerp { abstracte publieke functie addObserver (Observer $ waarnemer); abstracte publieke functie removeObserver (Observer $ waarnemer); abstracte publieke functie updateObservers ($ newsHeadline); } / ** * Dit is het onderwerp klasse voor het voorbeeld * * @ Author Lloyd Watkin * @ Sinds 2009/12/23 * / klasse ArticleAggregator breidt Onderwerp { / ** * Houdt een overzicht 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 update * * @ Var string $ newsHeadline * @ Return void * / publieke functie updateObservers ($ newsHeadline) { foreach ($ this-> _observerList als $ ob) { $ Ob-> update ($ newsHeadline); } } / ** * Voeg een nieuw nieuwsbericht * * @ Var string $ verhaal * @ Return void * / publieke functie addNewsStory ($ verhaal) { if (lege ($ verhaal) | |! is_string ($ verhaal)) { throw new 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 Betreft {abstracte publieke functie addObserver (Observer $ waarnemer); abstracte publieke functie removeObserver (Observer $ waarnemer ); abstracte publieke functie updateObservers ($ newsHeadline);} / ** * Dit is het onderwerp klasse voor het voorbeeld * * @ author Lloyd Watkin * @ sinds 2009/12/23 * / class ArticleAggregator breidt Betreft {/ ** * 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 update * * @ var string $ newsHeadline * @ return void * / public function updateObservers ($ newsHeadline) {foreach ($ this-> _observerList als $ ob) {$ ob-> update ($ newsHeadline);}} / ** * Voeg 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 (! leeg ($ _SERVER ['HTTP_USER_AGENT'])) { echo ''; } / / Wat doen wij? echo 'Observer Pattern Voorbeeld in PHP'. PHP_EOL; echo'================================'. PHP_EOL; / / Stel ons onderwerp $ Subject = nieuwe ArticleAggregator (); echo '- ArticleAggregator gecreëerd'. 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 rugbyspeler houdt financiën'. PHP_EOL; echo'================================================ '. PHP_EOL; $ Subject-> addNewsStory ('celebrity rugbyspeler financiering houdt'); 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 up weer!' . PHP_EOL; echo'======================================='. PHP_EOL; $ Subject-> addNewsStory ('overheid 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 het 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 ... Nieuws Flash - Update van een eerder verhaal! echo 'NewsUpdate: mode en combineren het voetbal zegt'. 'Overheid'. PHP_EOL; echo'================================================ '. '========='. PHP_EOL; $ Subject-> addNewsStory ('mode en voetbal te combineren ". 'Zegt de overheid'); echo PHP_EOL; if (! leeg ($ _SERVER ['HTTP_USER_AGENT'])) { echo '';
}



















































Hallo,
De eerste plaats, 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.