PHP Design Patterns - Observer Pattern

Ved Steven Lloyd Watkin , Tirsdag 29 Dec 2009 22:02

Jeg har læst Head First Design Patterns for nylig og har besluttet at skrive nogle af de mønstre, som PHP eksempler, for min egen fordel. Den første, som jeg har besluttet at kode op er Observer Pattern . Den formelle definition af Observer Pattern er:

Observatøren mønster (en delmængde af den asynkrone offentliggøre / abonnere mønster ) er en software- design mønster , hvor et objekt , kaldet emnet, vedligeholder en liste over sine pårørende, kaldet observatører, og meddeler dem automatisk i nogen stat ændringer, som regel ved at kalde en af deres metoder . Det er hovedsageligt bruges til at implementere distribuerede hændelseshåndtering systemer.

Som systemer bliver mere løst koblet og sørg for, at når en begivenhed, der sker alle systemer, der kræver viden om disse opdateringer er informeret. For eksempel, et blog-indlæg, efter at spare en stilling vi måske nødt til at opdatere en søgemaskine (fx Lucene), opdatere vores sitemap, tags, e-mail tegnet brugere osv. Observatøren mønster giver udviklere mulighed for at tilføje flere lyttere uden at redigere deres observerbare objekt . Ved at indsprøjte observatører (dvs. en søgemaskine opdatere observatør, en sitemap generator osv.) ind i et emne (dvs. blogindlæg redigeringssystem) kan vi give den til at udføre alle de nødvendige opdateringer uden ændringer.

Før Observer mønstret blev identificeret den sædvanlige trick ville være at opdatere observerbare objekt med en ekstra linje kode for at ajourføre de krævede systemet, og fjerne den linje kode efter behov. Dette giver ikke mulighed for nemt at tilføje og fjerne observatører.

Emnet opdaterer alle sine observatører via en opdatering metode. Denne opdatering metode kalder en metode i hver observatør, som er afledt fra at gennemføre et interface. Observatører kan tilføje en fjerne sig gennem metoder i det observerbare objekt.

Det er dybest set det! Jeg har altid finde et eksempel på at være den bedste metode til læring / forståelse, så her er mit kodet op eksempel ...

Observatør Mønster i PHP

I mit eksempel har jeg oprettet et nyt system (NewsAggregator), som udsender nyhedsoverskrift opdateringer til mindre nyhedskilder. Her er nyhederne sytem træder i stedet for Emne, Observerbare osv. mens nyhedskilder at tage rollen som observatører eller lyttere.

Når initialiseret observatører kan vedhæfte og distancere sig fra emnet, som de ønsker. I mit eksempel har jeg lavet tre observatører, disse scan overskrifterne sendt ud af emnet og "råbe" The News, hvis det er relevant. De tre observatører er navngivet nedenfor sammen med de vilkår, de scanne for når der modtages nyhedsoverskrifter:

  • Sport Observatør: 'rugby', 'fodbold', 'tennis'
  • Nyheder Observatør: 'politik', 'finans', 'regeringen'
  • Gossip Observatør: 'celebrity', 'musik', 'mode'

Efter initalising emnet jeg tilføje nyheder og sladder observatører og sende en nyhed opdatering. Efter dette sporten observatør er tilsat før flere nyheder opdateringer er sendt ud. Endelig sladderen observatør er fjernet, før en endelig nyhedsoverskrift er sendt ud.

De tre forskellige observatør klasser implementere grænsefladen Observer, hvilket giver dem en klar grænseflade / metode, hvorigennem de vil modtage opdateringer. Forudsat at de implementere Observer interfacet de vil være i stand til at knytte sig til emnet. Dette holder også med programmering paradigme "program til grænseflader ikke implementeringer '. Den NewsAggregator klassen udvider den abstrakte klasse Emne, der giver os de tre nødvendige offentlige metoder:

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

Koden kan ses køre her, Observer Mønster i PHP Løb , og koden kan downloades herfra, Observer Mønster i PHP Code .

Observer Script

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

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

 / **
  * Dette er emnet klassen for eksempel
  *
  * @ Author Lloyd Watkin
  * @ Siden 2009/12/23
  * /
 klasse ArticleAggregator udvider Emne
 {
	 / **
	  * Indeholder en liste over vores observatører
	  *
	  * @ Var bred vifte
	  * /
	 beskyttet $ _observerList = array ();

	 / **
	  * Metode til at tilføje en observatør
	  *
	  * @ Var Observer $ observatør
	  * @ Return void
	  * /
	 offentlig funktion addObserver (Observer $ observatør)
	 {
		 $ This-> _observerList [] = $ observatør;
	 }

	 / **
	  * Metode til at fjerne en observatør
	  *
	  * @ Var Observer $ observatør
	  * @ Return boolean
	  * /
	 offentlig funktion removeObserver (Observer $ observatør)
	 {
		 foreach ($ this-> _observerList AS $ key => $ ob) {
			 if ($ ob == $ observatør) {
				 unset ($ this-> _observerList [$ key]);
				 returnere sandt;
			 }
		 }
		 return false;
	 }

	 / **
	  * Metode til at opdatere observatører
	  *
	  * @ Var streng $ newsHeadline
	  * @ Return void
	  * /
	 offentlig funktion updateObservers ($ newsHeadline)
	 {
		 foreach ($ this-> _observerList AS $ ob) {
			 $ Ob-> opdatering ($ newsHeadline);
		 }
	 }

	 / **
	  * Tilføj en ny nyhedshistorie
	  *
	  * @ Var streng $ historie
	  * @ Return void
	  * /
	 offentlig funktion addNewsStory ($ historie)
	 {
		 if (empty ($ historie) | |! is_string ($ historie)) {
			 kaste nye InvalidArgumentException ('Forventet en nyhedshistorie!');
		 }
		 $ This-> updateObservers ($ historie);
	 }
 } 

Emne / Observerbare Script

 ? <Php / ** * Denne fil indeholder emnet * * @ author Lloyd Watkin * @ siden 2009/12/23 * / abstrakt klasse Emne {abstrakte offentlig funktion addObserver (Observer $ observatør); abstrakte offentlig funktion removeObserver (observatør $ observatør ); abstrakt offentlig funktion updateObservers ($ newsHeadline);} / ** * Dette er emnet klassen for eksempel * * @ author Lloyd Watkin * @ siden 2009/12/23 * / class ArticleAggregator udvider Emne {/ ** * Holder en liste over vores observatører * * @ var vifte * / beskyttet $ _observerList = array (); / ** * Metode til at tilføje en observatør * * @ var Observer $ observatør * @ return void * / public function addObserver (Observer $ observatør) {$ this-> _observerList [] = $ observatør;} / ** * Metode til at fjerne en observatør * * @ var Observer $ observatør * @ return boolean * / public function removeObserver (Observer $ observatør) {foreach ($ this-> _observerList som $ key => $ ob) {if ($ ob == $ observatør) {unset ($ this-> _observerList [$ key]); returnere true;}} return false;} / ** * Metode til at opdatere observatører * * @ var streng $ newsHeadline * @ return void * / public function updateObservers ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ ob-> opdatering ($ newsHeadline);}} / ** * Læg en ny nyhedshistorie * * @ var streng $ historien * @ return void * / public function addNewsStory ($ historie) {if (empty ($ historie) | |! is_string ($ historie)) {kaste nyt InvalidArgumentException ('Forventet en nyhed historie ');!} $ this-> updateObservers ($ historie);}} 

Controller Script

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

 if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) {
     echo '
  ';
 }

 / / Hvad gør vi?
 echo 'Observatør Mønster Eksempel i PHP ".  PHP_EOL;
 ekko'================================'.  PHP_EOL;
 / / Set op vort emne
 $ Subject = ny ArticleAggregator ();
 echo '- ArticleAggregator oprettet'.  PHP_EOL;

 / / Tilføj nogle iagttagere
 $ Subject-> addObserver (ny NewsObserver ());
 $ Subject-> addObserver ($ gossiper = ny GossipObserver ());

 echo '- Tilføjet NewsObverser & GossipObserver'.
	  PHP_EOL.  PHP_EOL;

 / / Bip, bip, bip ...  News Flash!
 echo 'Newsflash: celebrity rugby spiller elsker finansiering «.  PHP_EOL;
 echo'================================================ '.  PHP_EOL;
 $ Subject-> addNewsStory ('celebrity rugby spiller elsker finansiere');
 echo PHP_EOL;

 echo '- SportObserver har fundet ud af og ønsker at slutte sig til gruppen!';
 $ Subject-> addObserver (ny SportObserver ());
 ekko PHP_EOL.  PHP_EOL;

 / / Bip, bip, bip ...  News Flash!
 echo 'Newsflash: Regeringen messer op igen! "  .  PHP_EOL;
 ekko'======================================='.  PHP_EOL;
 $ Subject-> addNewsStory ('regering messer op igen!');
 echo PHP_EOL;

 / / Bip, bip, bip ...  News Flash!
 echo 'Newsflash: mode og fodbold kombinere'.  PHP_EOL;
 ekko'======================================='.  PHP_EOL;
 $ Subject-> addNewsStory ('mode og fodbold kombinere');
 echo PHP_EOL;

 / / Bip, bip, bip ...  News Flash!
 echo 'Newsflash: musik og politik, og det næste?'  .  PHP_EOL;
 ekko'=========================================='.  PHP_EOL;
 $ Subject-> addNewsStory ('musik og politik, og det næste?');
 echo PHP_EOL;

 / **
  * Gossipers blive træt af nyheder meget hurtigt og har besluttet
  * At stoppe med at lytte, på trods af alle de spændende nyheder i dag!
  * /
 echo '- GossipObserver er kede sig og forlader gruppen!'  .
      PHP_EOL.  PHP_EOL;
 $ Subject-> removeObserver ($ gossiper);

 / / Bip, bip, bip ...  News Flash - opdatering af en tidligere historie!
 echo 'NewsUpdate: mode og fodbold kombinere siger'.
      »Staten«.  PHP_EOL;
 echo'================================================ '.
      '========='.  PHP_EOL;
 $ Subject-> addNewsStory ('mode og fodbold kombinere'.
                         Siger regeringen ');
 echo PHP_EOL;

 if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) {
     echo ' 

';

}

3 svar til "PHP Design Patterns - Observer Pattern"

  1. Vow siger:

    Hej,
    Først Mit engelsk er meget dårlig, så
    Kan du fortælle mig, hvad er systemet i billedet?
    Fedora 12?
    Hvad er temaet?

  2. Vow siger:

    Hej,
    Kan du fortælle mig, hvad er systemet i billedet?
    Fedora 12?
    Hvad er temaet?

Efterlad et svar













Panorama Tema ved Themocracy

6 besøgende online nu
2 gæster, 4 bots, 0 medlemmer
Max besøgende i dag: 18 kl 0:34 UTC
Denne måned: 52 kl 18-06-2011 03:11 UTC
I år: 130 kl 28-03-2011 22:40 UTC
Al tid: 130 kl 28-03-2011 10:40 UTC