PHP Design Patterns - vzor Observer

Tým, , utorok 29 december 2009 22:02

Čítal som hlavou napred Design Patterns v nedávnej dobe, a sa rozhodol napísať niektoré vzory ako PHP príklady pre vlastný prospech. Prvý z nich, ktoré som sa rozhodol do kódu, je vzor Observer . Formálne definície Observer Pattern:

Pozorovateľa vzor (podmnožina asynchrónne publish / subscribe vzor ) je softvér návrhový vzor , v ktorom objekt , nazvaný predmet, vedie zoznam jeho rodinných príslušníkov, tzv pozorovateľa, a upozorní ich automaticky akékoľvek zmeny stavu, zvyčajne tým, že volá jeden z ich metód . Používa sa predovšetkým k realizácii distribuované systémy spracovania udalostí.

Sú systémy stávajú voľne viazaných uistite sa, že až sa táto udalosť stane, všetky systémy, ktoré vyžadujú znalosť týchto zmenách boli informovaní. Napríklad, blogu, po uložení príspevok budeme musieť aktualizovať vyhľadávače (napr. Lucene), aktualizovať náš mapa stránok, tagov, e-mail predplatiteľov atď pozorovateľ vzor umožňuje vývojárom pridať ďalšie poslucháčov bez úpravy ich pozorovateľné objektu . Tým, že napichne pozorovateľa (tj vyhľadávač aktualizácia pozorovateľa, generátor mapa stránok, atď) na predmet (napr. blogu redakčného systému), si môžeme dovoliť ho vykonať všetky potrebné aktualizácie, bez akýchkoľvek zmien.

Pred Observer vzor bol identifikovaný obvyklý trik by bolo aktualizovať pozorovateľný objekt s ďalší riadok kódu aktualizácia požadovaný systém a odstrániť riadok kódu podľa potreby. To neumožňuje jednoduché pridávanie a odoberanie pozorovateľov.

Predmetom aktualizácie všetkých svojich pozorovateľov prostredníctvom metódy Update. Táto aktualizácia metóda volá metódu každého pozorovateľa, ktorý je odvodený od splnenia rozhranie. Pozorovatelia môžu pridávať odstrániť sami pomocou metódy pozorovateľné objektu.

To je v podstate to! Vždy som si nájsť príklad, že je najlepší spôsob učenia / pochopiť, takže tu je moja kódované až napríklad ...

Pozorovateľ vzor v PHP

V mojom príklade som vytvoril systém správ (NewsAggregator), ktorá vysiela správy aktualizácia titulok na menšie spravodajské kanály. Tu Novinky sytém zaberie miesto predmetu, pozorovateľný, atď kým RSS kanály vziať úlohu pozorovateľov, alebo poslucháča.

Akonáhle je inicializácia pozorovatelia môžu pripojiť a odpojiť sa od témy, ako uznajú za vhodné. V mojom príklade som vytvoril tri pozorovatelia tieto skenovanie titulky zaslať predmet a "kričať" U nás sa jeho potreby. Tieto tri pozorovatelia z nižšie menovaných spolu s podmienkami, ktoré pre vyhľadávanie pri príjme novinové titulky:

  • Šport Observer: "rugby", "futbal", "tenisový"
  • Novinky Observer: "politika", "financie", "verejný"
  • Gossip Observer: "Celebrity", "Hudba", "fashion"

Po initalising predmetu pridám novinky a klebety pozorovateľov a vyslať News Update. Potom sa pridal športové pozorovateľ pred viac noviniek prostredníctvom sú odosielané von. Konečne ohováranie pozorovateľa odstránený pred konečnou Novinky titulok je rozoslaný.

Tri rôzne pozorovateľa triedy implementovať rozhranie Observer, to im dáva jasné rozhranie / metóda, ktorú obdrží aktualizácie. Za predpokladu, že implementáciu Observer rozhranie, ktoré sa budú môcť pripojiť sa k téme. To tiež udržiava s programovacím paradigmy "program na rozhraní nie implementácie." NewsAggregator trieda rozširuje triedu abstraktné témy, ktoré nám poskytuje tri požadované verejné metódy:

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

Tento kód môže byť videný tu beží, vzor Observer v PHP Prevádzka a kód si môžete stiahnuť tu, vzor Observer v PHP kóde .

Pozorovateľ Script

  <? Php
 / **
  * Tento súbor obsahuje pozorovateľa
  *
  * @ Author Lloyd Watkin
  * @ Od 2009/12/23
  * /

 abstraktné trieda predmetu
 {
	 abstract public function addObserver (Observer $ pozorovateľ);
	 abstract public function removeObserver (Observer $ pozorovateľ);
	 abstract public function updateObservers ($ newsHeadline);
 }

 / **
  * Jedná sa o predmet triedy pre príklad
  *
  * @ Author Lloyd Watkin
  * @ Od 2009/12/23
  * /
 triedy ArticleAggregator Predmet rozširuje
 {
	 / **
	  * Obsahuje zoznam našich pozorovateľov
	  *
	  * @ Var pole
	  * /
	 protected $ _observerList = array ();

	 / **
	  * Spôsob pridanie pozorovateľa
	  *
	  * @ Var $ Pozorovateľ pozorovateľa
	  * @ Return neplatné
	  * /
	 public function addObserver (Observer $ pozorovateľ)
	 {
		 $ This-> _observerList [] = $ pozorovateľa;
	 }

	 / **
	  * Metóda na odstránenie pozorovateľov
	  *
	  * @ Var $ Pozorovateľ pozorovateľa
	  * @ Return boolean
	  * /
	 public function removeObserver (Observer $ pozorovateľ)
	 {
		 foreach ($ this-> _observerList AS $ key => $ OB) {
			 if ($ OB $ == pozorovateľa) {
				 unset ($ this-> _observerList [$ key]);
				 return true;
			 }
		 }
		 return false;
	 }

	 / **
	  * Metóda update pozorovateľa
	  *
	  * @ Var string $ newsHeadline
	  * @ Return neplatné
	  * /
	 public function updateObservers ($ newsHeadline)
	 {
		 foreach ($ this-> _observerList AS $ OB) {
			 $ OB-> update ($ newsHeadline);
		 }
	 }

	 / **
	  * Pridať nový reportáž
	  *
	  * @ Var string $ príbeh
	  * @ Return neplatné
	  * /
	 public function addNewsStory ($ príbeh)
	 {
		 if (empty ($ príbeh) | |! is_string ($ príbeh)) {
			 throw new InvalidArgumentException ("očakávaná reportáž! ');
		 }
		 $ This-> updateObservers ($ príbeh);
	 }
 } 

Predmet / pozorovateľne Script

 ? <Php / ** * Tento súbor obsahuje predmet * * @ author Lloyd Watkin * @ 2009/12/23 od * / abstraktné triedy Predmet {abstract public function addObserver (Observer $ pozorovateľ), abstract public function removeObserver (Observer $ pozorovateľa ), abstract public function updateObservers ($ newsHeadline);} / ** * Toto je predmetom triedy napr * @ author Lloyd Watkin * @ 2009/12/23 od * / trieda ArticleAggregator rozširuje Predmet {/ ** * Obsahuje zoznam našich pozorovateľov * * @ var pole * / protected $ _observerList = array (); / ** * Metóda pridať pozorovateľa * * @ var $ Pozorovateľ pozorovateľa * @ return void * / public function addObserver (Observer $ pozorovateľ) {$ this-> _observerList [] = $ pozorovateľ;} / ** * metóda k odstráneniu pozorovateľa * * @ var $ Pozorovateľ pozorovateľa * @ return boolean * / public function removeObserver (Observer $ pozorovateľ) {foreach ($ this-> _observerList AS $ key => $ OB) {if ($ OB $ == pozorovateľa) {unset ($ this-> _observerList [$ key]) return true;}} return false;} / ** * Metóda update pozorovateľa * * @ var string $ newsHeadline * @ return void * / public function updateObservers ($ newsHeadline) {foreach ($ this-> _observerList AS $ OB) {$ OB-> update ($ newsHeadline);}} / ** * Pridať nová reportáž * * @ var string $ príbeh * @ return void * / public function addNewsStory ($ príbeh) {if (empty ($ príbeh) | |! is_string ($ príbeh)) {throw new InvalidArgumentException ("Očakávané novinky Príbeh ");!} $ this-> updateObservers ($ príbeh);}} 

Skriptu kontroleru

  <? Php
 / **
  * Observer návrhový vzor Príklad
  *
  * @ Author Lloyd Watkin
  * @ Od 2009/12/23
  * @ Link http://www.evilprofessor.co.uk
  * /
 patrí "observers.php;
 patrí "subject.php;

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

 / / Čo budeme robiť?
 echo "vzor Observer Príklad v PHP".  PHP_EOL;
 echo'================================'.  PHP_EOL;
 / / Nastavenie náš predmet
 $ Subject = new ArticleAggregator ();
 echo "- ArticleAggregator vytvoril.  PHP_EOL;

 / / Pridať pozorovatelia
 $ Subject-> addObserver (nové NewsObserver ());
 $ Subject-> addObserver ($ gossiper = new GossipObserver ());

 echo "- pridanie NewsObverser a GossipObserver".
	  PHP_EOL.  PHP_EOL;

 / / Beep, píp, píp ...  Novinky Flash!
 echo "Newsflash: celebrity rugby hráč miluje financie".  PHP_EOL;
 echo'================================================ ".  PHP_EOL;
 $ Subject-> addNewsStory ("celebrity rugby hráč miluje financie");
 echo PHP_EOL;

 echo "- SportObserver zistil, a chce, aby sa pripojil k skupine ';
 $ Subject-> addObserver (nové SportObserver ());
 echo PHP_EOL.  PHP_EOL;

 / / Beep, píp, píp ...  Novinky Flash!
 echo "Newsflash: vláda pokazí znova!"  .  PHP_EOL;
 echo'======================================='.  PHP_EOL;
 $ Subject-> addNewsStory ("vláda pokazí znova!");
 echo PHP_EOL;

 / / Beep, píp, píp ...  Novinky Flash!
 echo "Newsflash: Móda a futbal kombinovať.  PHP_EOL;
 echo'======================================='.  PHP_EOL;
 $ Subject-> addNewsStory ("módy a futbalu spojiť");
 echo PHP_EOL;

 / / Beep, píp, píp ...  Novinky Flash!
 echo "Newsflash: hudba a politika, čo ďalej?"  .  PHP_EOL;
 echo'=========================================='.  PHP_EOL;
 $ Subject-> addNewsStory ("hudbe a politike, čo ďalej?");
 echo PHP_EOL;

 / **
  * Klevetnice baviť o novinkách a veľmi rýchlo sa rozhodli
  * Ak chcete prestať počúvať, aj cez všetky zaujímavé novinky ešte dnes!
  * /
 echo "- GossipObserver sa nudí, a opustí skupinu!"  .
      PHP_EOL.  PHP_EOL;
 $ Subject-> removeObserver ($ gossiper);

 / / Beep, píp, píp ...  Novinky Flash - Update na skoršie príbeh!
 echo "NewsUpdate: Móda a futbal kombinovať hovorí '.
      "Verejný".  PHP_EOL;
 echo'================================================ ".
      '========='.  PHP_EOL;
 $ Subject-> addNewsStory ("módy a futbalu kombinovať.
                         "Vláda hovorí, že ');
 echo PHP_EOL;

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

";

}

3 Reakcie na "Design PHP vzory - Observer Pattern"

  1. Sľub hovorí:

    Dobrý deň,
    Po prvé, moja angličtina je veľmi zlá, potom
    Môžeš mi povedať, čo je systém na obrázku?
    Fedora 12?
    Aké je téma?

  2. Sľub hovorí:

    Dobrý deň,
    Môžeš mi povedať, čo je systém na obrázku?
    Fedora 12?
    Aké je téma?

Required













Panorama Téma, ktoré Themocracy

9 návštevníkov online
5 osôb, 4 topánky, 0 členov
Max návštevníkov dnes: 10 v 12:02 UTC
Tento mesiac: 17 v 18-08-2011 06:54 GMT
Tento rok: 130 u 28-03-2011 22:40 GMT
Za celé obdobie: 130 u 28-03-2011 22:40 GMT