PHP Design Patterns - Observer Pattern

Ved Steven Lloyd Watkin , tirsdag 29 desember 2009 22:02

Jeg har lest Head First Design Patterns nylig og har besluttet å skrive noen av mønstrene som PHP eksempler for min egen fordel. Den første som jeg har bestemt meg for å kode opp er Observer Pattern . Den formelle definisjonen av Observer Pattern er:

Observatøren mønster (en undergruppe av den asynkrone publisere / abonnere mønster ) er en software design mønster hvor et objekt , kalt faget, vedlikeholder en liste over de forsørges, kalt observatører, og varsler dem automatisk for eventuelle statlige endringer, vanligvis ved å ringe en av deres metoder . Det er i hovedsak brukes til å implementere distribuerte hendelsen håndteringssystemer.

Etter hvert som systemene blir mer løst koplet å sørge for at når en hendelse skjer alle systemer som krever er kunnskap om disse oppdateringene informert. For eksempel, et blogginnlegg, etter lagring et innlegg kan det være nødvendig å oppdatere en søkemotor (f.eks Lucene), oppdatere vårt sitemap, koder, e-post abonnerer brukere, osv. Observatøren mønsteret lar utviklere å legge til flere lyttere uten å redigere deres observerbare objekt . Ved å injisere observatører (dvs. en søkemotor oppdatering observatør, en sitemap generator, etc) inn i et emne (dvs. bloggen redigering system) kan vi tillate at det å utføre alle de nødvendige oppdateringene uten noen endringer.

Før Observer mønsteret ble identifisert vanlig triks vil være å oppdatere observerbare objekt med en ekstra linje med kode for å oppdatere nødvendige systemfiler, og fjerne linje med kode som kreves. Dette tillater ikke for enkelt å legge til og fjerne observatører.

Faget oppdaterer alle sine observatører via en oppdatering metode. Denne oppdateringen metoden kaller en metode i hvert observatør som er utledet fra å gjennomføre et grensesnitt. Observatører kan legge en fjerner seg gjennom metoder i observerbare objektet.

Det er stort sett det! Jeg har alltid finner et eksempel for å være den beste metoden for å lære / forstå så her er min kodet opp eksempel ...

Observer Pattern i PHP

I mitt eksempel har jeg laget et nytt system (NewsAggregator) som sender ut nyheter headline oppdateringer til mindre nyhetsstrømmer. Her nyhetene sytem tar plassen til faget, observerbare, etc mens nyhetsstrømmer ta rollen som Observatører eller lyttere.

Når initialisert observatører kan feste og ta seg fra faget som det passer. I mitt eksempel har jeg opprettet tre observatører, disse skanne overskriftene sendt ut av faget og "rope" på nyhetene hvis hensiktsmessig. De tre observatører er navngitt nedenfor sammen med de betingelsene de skanne for når du mottar nyhetsoverskrifter:

  • Sport Observer: «rugby ',' fotball ',' tennis '
  • News Observer: "politikk", "finans ',' regjeringen '
  • Gossip Observer: 'kjendis', 'musikk', 'mote'

Etter initalising emnet legger jeg til nyheter og sladder observatører og sende ut en nyhetsoppdatering. Etter denne sporten observatøren er lagt før flere nyheter og oppdateringer blir sendt ut. Endelig sladder observatøren er fjernet før en endelig nyheten overskriften er sendt ut.

De tre ulike observatør klassene implementere grensesnittet Observer, gir dette dem et klart grensesnitt / metode hvor de vil motta oppdateringer. Forutsatt de gjennomfører Observer grensesnitt de vil kunne feste seg til emnet. Dette holder også med programmeringsspråket paradigme 'program til grensesnitt ikke implementeringer'. Den NewsAggregator klassen utvider abstrakt klasse Emne, som gir oss de tre nødvendige offentlige metoder:

  1. updateObservers ()
  2. addObserver ()
  3. removeObserver ()

Koden kan sees som kjører her, Observer Pattern i PHP Running , og koden kan lastes ned herfra, Observer Pattern i PHP kode .

Observer Script

  <? Php
 / **
  * Denne filen inneholder observatører
  *
  * @ Author Lloyd Watkin
  * @ Siden 2009/12/23
  * /

 abstrakt klasse Subject
 {
	 abstrakte offentlig funksjon addObserver (Observer $ observatør);
	 abstrakte offentlig funksjon removeObserver (Observer $ observatør);
	 abstrakte offentlig funksjon updateObservers ($ newsHeadline);
 }

 / **
  * Dette er temaet klassen for eksempel
  *
  * @ Author Lloyd Watkin
  * @ Siden 2009/12/23
  * /
 class ArticleAggregator strekker Subject
 {
	 / **
	  * Holder en liste over våre observatører
	  *
	  * @ Var array
	  * /
	 beskyttede $ _observerList = array ();

	 / **
	  * Metode for å legge til en observatør
	  *
	  * @ Var Observer $ observatør
	  * @ Return annullert
	  * /
	 offentlig funksjon addObserver (Observer $ observatør)
	 {
		 $ This-> _observerList [] = $ observatør;
	 }

	 / **
	  * Metode for å fjerne en observatør
	  *
	  * @ Var Observer $ observatør
	  * @ Return boolsk
	  * /
	 offentlig funksjon removeObserver (Observer $ observatør)
	 {
		 foreach ($ this-> _observerList AS $ key => $ ob) {
			 if ($ ob == $ observatør) {
				 fjern ($ this-> _observerList [$ key]);
				 avkastning sant;
			 }
		 }
		 return false;
	 }

	 / **
	  * Metode for å oppdatere observatører
	  *
	  * @ Var streng $ newsHeadline
	  * @ Return annullert
	  * /
	 offentlig funksjon updateObservers ($ newsHeadline)
	 {
		 foreach ($ this-> _observerList AS $ ob) {
			 $ Ob-> oppdateringen ($ newsHeadline);
		 }
	 }

	 / **
	  * Legg til en ny nyhetsartikkel
	  *
	  * @ Var streng $ historien
	  * @ Return annullert
	  * /
	 offentlig funksjon addNewsStory ($ historie)
	 {
		 if (tom ($ story) | |! is_string ($ historie)) {
			 kaste nytt InvalidArgumentException ('Forventet en nyhetsartikkel!');
		 }
		 $ This-> updateObservers ($ historie);
	 }
 } 

Subject / observerbare Script

 ? <Php / ** * Denne filen inneholder emnet * * @ author Lloyd Watkin * @ siden 2009/12/23 * / abstract class Subject {abstract offentlig funksjon addObserver (Observer $ observatør), abstrakte offentlig funksjon removeObserver (Observer $ observatør ); abstrakte offentlig funksjon updateObservers ($ newsHeadline);} / ** * Dette er temaet klasse for eksempel * * @ author Lloyd Watkin * @ siden 2009/12/23 * / class ArticleAggregator strekker Subject {/ ** * Plass en liste over våre observatører * * @ var array * / beskyttet $ _observerList = array (); / ** * Metode for å legge til en observatør * * @ var Observer $ observatør * @ return void * / offentlig funksjon addObserver (Observer $ observatør) {$ this-> _observerList [] = $ observatør;} / ** * Metode for å fjerne en observatør * * @ var Observer $ observatør * @ return boolean * / offentlig funksjon removeObserver (Observer $ observatør) {foreach ($ dette-> _observerList AS $ key => $ ob) {if ($ ob == $ observatør) {fjern ($ this-> _observerList [$ key]), returnerer true;}} return false;} / ** * Metode for å oppdatere observatører * * @ var streng $ newsHeadline * @ return void * / offentlig funksjon updateObservers ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ ob-> oppdateringen ($ newsHeadline);}} / ** * Legg til en ny nyhetsartikkel * * @ var streng $ historien * @ return void * / offentlig funksjon addNewsStory ($ historie) {if (tom ($ story) | |! is_string ($ historie)) {kaste nytt InvalidArgumentException ('Forventet en nyhetsartikkel story ');!} $ this-> updateObservers ($ historie);}} 

Controller Script

  <? Php
 / **
  * Observer Design Pattern Eksempel
  *
  * @ Author Lloyd Watkin
  * @ Siden 2009/12/23
  * @ Link http://www.evilprofessor.co.uk
  * /
 inkluderer 'observers.php';
 inkluderer 'subject.php';

 if (! tom ($ _SERVER ['HTTP_USER_AGENT'])) {
     echo '
 ';} / / Hva gjør vi?  echo 'Observer Pattern Eksempel i PHP ".  PHP_EOL; ekko'================================'.  PHP_EOL; / / Sett opp våre fag $ emne = ny ArticleAggregator (); echo '- ArticleAggregator opprettet'.  PHP_EOL; / / Legg noen observatører $ emne-> addObserver (ny NewsObserver ()); $ fag-> addObserver ($ gossiper = ny GossipObserver ()); echo '- Lagt NewsObverser & GossipObserver'.  PHP_EOL.  PHP_EOL; / / pip, pip, pip ...  Nyheter Flash!  echo 'Newsflash: kjendis rugby spiller elsker finans'.  PHP_EOL; echo'============================================== == ".  PHP_EOL, $ emne-> addNewsStory ('kjendis rugby spiller elsker finans'); echo PHP_EOL; echo '- SportObserver har funnet ut og ønsker å bli med i gruppa!'; $ Emne-> addObserver (ny SportObserver ()); echo PHP_EOL .  PHP_EOL; / / pip, pip, pip ...  Nyheter Flash!  echo 'Newsflash: Regjeringen søl opp igjen!'  .  PHP_EOL; ekko'======================================='.  PHP_EOL, $ emne-> addNewsStory ('regjering søl opp igjen!'); Echo PHP_EOL; / / pip, pip, pip ...  Nyheter Flash!  echo 'Newsflash: mote og fotball kombinere'.  PHP_EOL; ekko'======================================='.  PHP_EOL, $ emne-> addNewsStory ('mote og fotball kombinere'); echo PHP_EOL; / / pip, pip, pip ...  Nyheter Flash!  echo 'Newsflash: musikk og politikk, hva nå? "  .  PHP_EOL; ekko'=========================================='.  PHP_EOL, $ emne-> addNewsStory ('musikk og politikk, hva nå?'); Echo PHP_EOL; / ** * Gossipers bli lei av nyheter veldig raskt og har bestemt seg * å slutte å lytte, til tross for alle de interessante nyheter i dag!  * / Echo '- GossipObserver er lei og forlater gruppa! "  .  PHP_EOL.  PHP_EOL, $ emne-> removeObserver ($ gossiper); / / pip, pip, pip ...  News Flash - Oppdatering til en tidligere historie!  echo 'NewsUpdate: mote og fotball kombinere sier ".  'Regjeringen'.  PHP_EOL; echo'============================================== == ".  '========='.  PHP_EOL, $ emne-> addNewsStory ('mote og fotball kombinere' 'sier regjeringen'.); Echo PHP_EOL; if (! Tom ($ _SERVER ['HTTP_USER_AGENT'])) {echo ' 

';

}

3 Svar å "PHP Design Patterns - Observer Pattern"

  1. Løfte sier:

    Hei,
    Først, jeg engelsk svært dårlig, så
    Kan du fortelle meg hva som er systemet i bildet?
    fedora 12?
    Hva er temaet?

  2. Løfte sier:

    Hei,
    Kan du fortelle meg hva som er systemet i bildet?
    Fedora 12?
    Hva er temaet?

Legg igjen en kommentar













Panorama Theme av Themocracy

9 besøkende online nå
4 gjester, 5 roboter, 0 medlemmer
Maks besøkende i dag: 13 klokka 12:15 pm UTC
Denne måneden: 26 på 07-05-2011 12:35 UTC
I år: 130 på 28-03-2011 22:40 UTC
All time: 130 på 28-03-2011 10:40 UTC