HTTP/1.0 200 OK Accept-Ranges: none Content-Location: http://www.evilprofessor.co.uk/211-php-design-patterns-observer-pattern/comment-page-1/ Content-Type: text/html; charset=UTF-8 Date: Sun, 22 May 2011 09:46:36 GMT X-Frame-Options: ALLOWALL Set-Cookie: PREF=ID=c2be57a95c3f7809:TM=1306057596:LM=1306057597:S=vIbQeCxGzhpovt29; expires=Tue, 21-May-2013 09:46:37 GMT; path=/; domain=translate.googleusercontent.com X-Content-Type-Options: nosniff Server: translation Expires: Sun, 22 May 2011 09:46:36 GMT Cache-Control: private Evilprofessor.co.uk »PHP Design Patterns - Observer Pattern

PHP Design Patterns - Observer Pattern

By Steven Lloyd Watkin , utorak 29. prosinca 2009 10:02

Ive 'bio čitanje glavu najprije Design Patterns i nedavno su odlučili napisati neke obrasce kao PHP primjera za svoju korist. Prvi koji sam odlučio da kod gore je Observer Pattern . Formalna definicija Observer Pattern je:

Promatrač uzorak (podskup asinkroni objaviti / pretplatiti uzorak ) je softver dezen u kojima objekt , zove subjekt, održava popis svojih članova obitelji, zove promatrača, te ih obavještava automatski bilo promjene stanja, obično pozivom jedan od njihovih metoda . To je uglavnom koristi za implementaciju distribuiranih sustava događaj rukovanje.

Kao i sustavi postaju sve labavo povezanih pazeći da kad se dogodi događaj svi sustavi koji zahtijevaju poznavanje tih ažuriranja su informirani. Na primjer, blog post, nakon spremanja post možda ćemo morati ažurirati tražilice (npr. Lucene), ažurirati naš sitemap, oznake, e-mail pretplatili korisnici, itd. promatrač uzorak omogućava programerima za dodavanje dodatnih slušatelje bez uređivanja svojih vidljivi objekt . Utiskivanjem promatrača (tj. promatraču ažurirati tražilice, sitemap generator, itd.) u subjekt (tj. blogu uređivanje sustava) možemo dopustiti da provesti sve potrebne nadopune bez ikakvih promjena.

Prije Observer uzorak je bio identificiran uobičajeni trik da bi se ažurirati vidljivi objekt s dodatnim liniju koda za ažuriranje sustava potrebne, i uklanjanje liniju koda ako je potrebno. To ne dopušta jednostavno dodavanje i uklanjanje promatrača.

Predmet obnove svih svojih promatrača putem metode Update. Ovo ažuriranje metoda poziva metodu u svakoj promatrač koji je izveden iz provodi sučelja. Promatrači mogu dodati maknuti sami kroz metode vidljivi objekt.

To je u osnovi to! Ja uvijek naći primjer da je najbolji način učenja / razumijevanja pa ovdje je moj kodirani gore primjer ...

Observer Pattern u PHP

U mom primjeru ja sam stvorio vijesti sustav (NewsAggregator) koji upućuje naslov ažuriranja vijesti na manji izvori s vijestima. Ovdje vijesti sytem zauzima mjesto subjekta, uočljiva, itd a izvori s vijestima preuzeti ulogu promatrača i slušatelja.

Nakon što inicira promatrači mogu priložiti i odvojiti od subjekta kao što vidite stane. U mom primjeru ja sam stvorio tri promatrača, te skeniranje naslove poslana od strane subjekta i 'vikati' vijest ako je potrebno. Tri promatrači su pod nazivom ispod zajedno s uvjetima koje skeniranje prilikom primanja vijestima:

  • Sport Observer: 'ragbi', 'nogomet', 'tenisa'
  • Vijesti Observer: 'politika', 'finance', 'vlade'
  • Tračevi Observer: 'celebrity', 'glazbu', 'modni'

Nakon initalising temu dodam vijesti i tračeve promatrača i poslati vijesti ažurirati. Nakon ovog sporta promatrač je dodan prije nego su više vijesti poslana. Na kraju trač promatrač je uklonjena prije konačne vijesti naslov je poslan.

Tri različite klase promatrač implementirati sučelje Observer, to im daje jasno sučelje / način kroz koji će primati ažuriranja. Pod uvjetom da provode Observer sučelje će biti u mogućnosti da se pridaju toj temi. To također čuva s programskim paradigme 'program sučelja ne implementacija ". NewsAggregator klasa proširuje apstraktne klase subjekt, koji nam daje tri potrebna javna metode:

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

Kôd se može vidjeti ovdje trčanje, Observer Pattern u PHP Trčanje , i kod može biti preuzimanje datoteka from ovdje, Observer uzorak u PHP Code .

Observer Script

  <? Php
 / **
  * Ova datoteka sadrži promatrači
  *
  * @ Autor Lloyd Watkin
  * @ Jer 2009/12/23
  * /

 apstraktna klasa Predmet
 {
	 sažetak javne funkcije addObserver (Observer $ promatrača);
	 sažetak javne funkcije removeObserver (Observer $ promatrača);
	 sažetak javne funkcije updateObservers ($ newsHeadline);
 }

 / **
  * Ovaj je predmet klasa za primjer
  *
  * @ Autor Lloyd Watkin
  * @ Jer 2009/12/23
  * /
 klasa ArticleAggregator proteže Tema
 {
	 / **
	  * Utvrđuje popis naših promatrača
	  *
	  * @ Var niz
	  * /
	 zaštićeni $ _observerList = array ();

	 / **
	  * Metoda za dodavanje promatrač
	  *
	  * @ Var $ Observer promatrač
	  * @ Povratak void
	  * /
	 javnu funkciju addObserver (Observer $ promatrač)
	 {
		 $ This-> _observerList [] = $ promatrač;
	 }

	 / **
	  * Metoda za uklanjanje promatrač
	  *
	  * @ Var $ Observer promatrač
	  * @ Povratak boolean
	  * /
	 javnu funkciju removeObserver (Observer $ promatrač)
	 {
		 foreach ($ this-> _observerList kao $ key => $ ob) {
			 if ($ ob == $ promatrač) {
				 resetiranje ($ this-> _observerList [$ tipku]);
				 povratak istina;
			 }
		 }
		 povratak false;
	 }

	 / **
	  * Metoda za ažuriranje promatrača
	  *
	  * @ Var $ string newsHeadline
	  * @ Povratak void
	  * /
	 javnu funkciju updateObservers ($ newsHeadline)
	 {
		 foreach ($ this-> _observerList kao $ ob) {
			 $ Ob-> ažurirati ($ newsHeadline);
		 }
	 }

	 / **
	  * Dodajte novu priču vijest
	  *
	  * @ Var $ string priča
	  * @ Povratak void
	  * /
	 javnu funkciju addNewsStory ($ priča)
	 {
		 if (prazan ($ priča) | |! is_string ($ priča)) {
			 baciti novo InvalidArgumentException ('Očekivani vijest!');
		 }
		 $ This-> updateObservers ($ priča);
	 }
 } 

Predmet / primjetan skripta

 ? <Php / ** * Ova datoteka sadržava subjekt * * @ autor Lloyd Watkin * @ 2009/12/23 od * / apstraktne klase Predmet {apstraktne javne funkcije addObserver (Observer $ promatrača); sažetak javne funkcije removeObserver (Observer $ promatrač ); sažetak javne funkcije updateObservers ($ newsHeadline);} / ** * Ovaj je predmet klasa za primjer * * @ autor Lloyd Watkin * @ 2009/12/23 od * / class ArticleAggregator proširuje Subject {/ ** * Utvrđuje popis naših promatrača * * @ var polja * / $ zaštićena _observerList = array (); / ** * Metoda za dodavanje promatrača * * @ var $ Observer promatrač * @ povratak void * / javne funkcije addObserver (Observer $ promatrač) {$ this-> _observerList [] = $ promatrač;} / ** * Metoda za uklanjanje promatrača * * @ var $ Observer promatrač * @ povratak boolean * / javne funkcije removeObserver (Observer $ promatrač) {foreach ($ this-> _observerList kao $ key => $ ob) {if ($ ob == $ promatrač) {resetiranje ($ this-> _observerList [$ tipku]); vratiti true;}} vrati false;} / ** * Metoda za ažuriranje promatrača * * @ var $ string * @ newsHeadline povratak void * / javne funkcije updateObservers ($ newsHeadline) {foreach ($ this-> _observerList kao $ ob) {$ ob-> ažurirati ($ newsHeadline);}} / ** * Dodaj nova vijest * * @ var $ string * @ priču povratak void * / javne funkcije addNewsStory ($ priča) {if (prazan ($ priča) | |! is_string ($ priča)) {baciti novo InvalidArgumentException ('Očekivani vijesti priče ');!} $ this-> updateObservers ($ priča);}} 

Controller Original

  <? Php
 / **
  * Observer Design Pattern Primjer
  *
  * @ Autor Lloyd Watkin
  * @ Jer 2009/12/23
  * @ Link http://www.evilprofessor.co.uk
  * /
 uključuju 'observers.php';
 uključuju 'subject.php';

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

 / / Što radimo?
 echo "Observer Pattern Primjer u PHP '.  PHP_EOL;
 jeka'================================'.  PHP_EOL;
 / / Postaviti našim temu
 $ Subject = new ArticleAggregator ();
 echo '- ArticleAggregator stvorio'.  PHP_EOL;

 / / Dodaj neke promatrače
 $ Subjekt-> addObserver (novi NewsObserver ());
 $ Subjekt-> addObserver ($ gossiper = new GossipObserver ());

 echo '- Dodano NewsObverser & GossipObserver'.
	  PHP_EOL.  PHP_EOL;

 / / Bip, bip, bip ...  Flash vijesti!
 jeka 'Newsflash: celebrity ragbi igrač voli finance'.  PHP_EOL;
 jeka'================================================ '.  PHP_EOL;
 $ Subjekt-> addNewsStory ('celebrity ragbi igrač voli finance');
 jeka PHP_EOL;

 echo '- SportObserver je saznao i želi da se pridruži grupi!';
 $ Subjekt-> addObserver (novi SportObserver ());
 jeka PHP_EOL.  PHP_EOL;

 / / Bip, bip, bip ...  Flash vijesti!
 jeka 'Newsflash: vlada opet zabrljati gore!'  .  PHP_EOL;
 jeka'======================================='.  PHP_EOL;
 $ Subjekt-> addNewsStory ('Vlada zabrljati gore opet!');
 jeka PHP_EOL;

 / / Bip, bip, bip ...  Flash vijesti!
 jeka 'Newsflash: modni i nogomet kombinirati'.  PHP_EOL;
 jeka'======================================='.  PHP_EOL;
 $ Subjekt-> addNewsStory ('mode i nogomet kombinirati');
 jeka PHP_EOL;

 / / Bip, bip, bip ...  Flash vijesti!
 jeka 'Newsflash: glazbe i politike, što dalje?'  .  PHP_EOL;
 jeka'=========================================='.  PHP_EOL;
 $ Subjekt-> addNewsStory ('glazba i politika, što je sljedeće?');
 jeka PHP_EOL;

 / **
  * Gossipers rasti umorna od novosti vrlo brzo i odlučili
  * Da prestane slušati, unatoč svim zanimljive vijesti danas!
  * /
 echo '- GossipObserver je dosadno i ostavlja grupu!'  .
      PHP_EOL.  PHP_EOL;
 $ Subjekt-> removeObserver ($ gossiper);

 / / Bip, bip, bip ...  Flash vijesti - Update na ranije priču!
 jeka 'NewsUpdate: moda nogomet i kombinirati kaže'.
      'Vlada'.  PHP_EOL;
 jeka'================================================ '.
      '========='.  PHP_EOL;
 $ Subjekt-> addNewsStory ('mode i nogometa kombinirati'.
                         "Vlada kaže ');
 jeka PHP_EOL;

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

';

}

3 Reakcija to "PHP Design Patterns - Observer pattern"

  1. Zavjet kaže:

    Pozdrav,
    Prvo, moj engleski je veoma loš, onda
    Možete li mi reći što je sustav na slici?
    Fedora 12?
    Što je tema?

  2. Zavjet kaže:

    Pozdrav,
    Možete li mi reći što je sustav na slici?
    Fedora 12?
    Što je tema?

Dopust jedan Odgovor













Panorama Theme by Themocracy

5 posjetitelja online aukciji
2 gosti, 3 robota, 0 clanova
Max posjetitelja danas: 13 u 0:15 UTC
Ovaj mjesec: 26 at 2011/07/05 12:35 UTC
Ove godine: 130 u 28-03-2011 10:40 UTC
Sva vremena: u 130 28-03-2011 10:40 UTC