PHP Design Patterns - Observer minta

A Steven Lloyd Watkin , kedd 29 december 2009 22:02

Én olvastam Head First Design Patterns a közelmúltban, és úgy döntött, hogy írjon néhány minták a PHP példákat a saját javára. Az első, hogy én döntöttem, hogy kóddal fel az Observer minta . A hivatalos meghatározásának Observer minta:

A megfigyelő minta (egy részét az aszinkron közzé / subscribe minta ) egy szoftver tervezési mintát , amikor egy objektum , az úgynevezett a téma, egy listát az eltartottak, az úgynevezett megfigyelők, és értesíti őket automatikusan a bármely állam változások általában hívja egyik módszer . Ez főleg, hogy végre elosztott esemény kezelő rendszerek.

Mivel a rendszer egyre inkább lazán összekapcsolt ügyelve arra, hogy ha egy esemény történik, minden igénylő rendszerek ismerete ezek a frissítések képesek tájékoztatni. Például egy blogbejegyzés, mentés után egy poszt is előfordulhat, hogy frissítenie kell a kereső (pl. Lucene), frissítjük sitemap, címkék, e-mail jegyzett felhasználó, stb A megfigyelő minta lehetővé teszi a fejlesztők, így további hallgatók nélkül szerkesztése a megfigyelhető objektumok . Az intravénás megfigyelők (azaz a kereső frissítést megfigyelő, a sitemap generátor, stb) egy tárgy (pl. blogbejegyzést szerkesztő rendszer) tudjuk hogy az, hogy teljes a szükséges frissítéseket változtatás nélkül.

Mielőtt az Observer minta azonosították a szokásos trükk az lenne, hogy frissítse a megfigyelhető objektum egy további sort, hogy frissítse a szükséges rendszert, és eltávolítja a vonal a kód szükséges. Ez nem teszi lehetővé a könnyű hozzáadása és eltávolítása megfigyelők.

A téma frissíti annak minden megfigyelő keresztül update módszert. Ez a frissítés metódushívások módszer minden megfigyelő amely származó végrehajtási felület. Megfigyelők is hozzá egy eltávolítani magukat módszerekkel a megfigyelhető objektumot.

Ez alapvetően meg! Mindig találni példát, hogy a legjobb módszer a tanulás / megértés, így itt a kódolt fel például ...

Observer minta a PHP

A példában, amit létrehoztunk egy hírt rendszer (NewsAggregator), amely küld híreket headline frissítések a kisebb hírcsatornák. Itt a hír sytem helyére kerül a téma, Megfigyelhető, stb míg a hírcsatornák venni a szerepét a megfigyelők, illetve hallgatóknak.

Ha kezdeményezte megfigyelők is csatolni, és vegye le magukat a téma belátásuk szerint. A példában hoztam létre három megfigyelő, ezeket olvassa be a szalagcímek küldött a témát, és "kiabálni" a hír, ha szükséges. A három megfigyelők alább megnevezett mellett a feltételek, hogy keresni fogadásakor hírek:

  • Sport Observer: "rugby", "futball", "tenisz"
  • Hírek Observer: "politika", "pénzügyi", "kormány"
  • Gossip Observer: "celebrity", "zene", "divat"

Miután initalising tárgyát vehetek a hírek és pletykák megfigyelők és küldje el a hírt frissítés. Ezt követően a sport megfigyelő adni, mielőtt további hírek frissítések küldött ki. Végül a pletyka megfigyelő távolítani, mielőtt a végső hír főcím is küldött ki.

A három különböző megfigyelő osztály végre a felület Observer, ez ad nekik egy világos felület / módszer, amelyen keresztül fognak kapni. Amennyiben azok az Observer interfészt képesek lesznek, hogy hozzákötődnek a tárgya. Ez tartja a programozási paradigmája "program interfészek nem implementációk". A NewsAggregator osztály kiterjeszti az absztrakt osztály tárgya, amely biztosítja számunkra a három szükséges állami módszerek:

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

A kód látható fut itt Observer minta PHP futtatása , és a kód is letölthető innen, Observer Pattern a PHP kód .

Observer Script

  <? Php
 / **
  * Ez a fájl tartalmazza a megfigyelők
  *
  * @ Szerző Lloyd Watkin
  * @ Óta 2009/12/23
  * /

 absztrakt osztály Tárgy
 {
	 absztrakt public function addObserver (Observer $ megfigyelő);
	 absztrakt public function removeObserver (Observer $ megfigyelő);
	 absztrakt public function updateObservers ($ newsHeadline);
 }

 / **
  * Ez a téma osztály a példa
  *
  * @ Szerző Lloyd Watkin
  * @ Óta 2009/12/23
  * /
 osztályú ArticleAggregator kiterjeszti Tárgy
 {
	 / **
	  * Tárolására egy lista a megfigyelők
	  *
	  * @ Var array
	  * /
	 protected $ _observerList = array ();

	 / **
	  * Módszer, hogy adjunk egy megfigyelő
	  *
	  * @ Var Observer $ megfigyelői
	  * @ Return void
	  * /
	 public function addObserver (Observer $ megfigyelő)
	 {
		 $ This-> _observerList [] = $ megfigyelőként;
	 }

	 / **
	  * Módszer, hogy távolítsa el a megfigyelő
	  *
	  * @ Var Observer $ megfigyelői
	  * @ Return boolean
	  * /
	 public function removeObserver (Observer $ megfigyelő)
	 {
		 foreach ($ this-> _observerList AS $ key => $ ob) {
			 if ($ ob == $ megfigyelő) {
				 unset ($ this-> _observerList [$ kulcs]);
				 return true;
			 }
		 }
		 return false;
	 }

	 / **
	  * Módszer, hogy frissítse a megfigyelők
	  *
	  * @ Var string $ newsHeadline
	  * @ Return void
	  * /
	 public function updateObservers ($ newsHeadline)
	 {
		 foreach ($ this-> _observerList AS $ ob) {
			 $ Ob-> update ($ newsHeadline);
		 }
	 }

	 / **
	  * Új hír
	  *
	  * @ Var string $ story
	  * @ Return void
	  * /
	 public function addNewsStory ($ történet)
	 {
		 if (empty ($ story) | |! is_string ($ story)) {
			 dobja új InvalidArgumentException ("Várható egy hírt! ');
		 }
		 $ This-> updateObservers ($ story);
	 }
 } 

Tárgy / Megfigyelhető Script

 <? Php / ** * Ez a fájl tartalmazza a téma * * @ szerző Lloyd Watkin * @ óta 2009/12/23 * / absztrakt osztály Tárgy {abstract public function addObserver (Observer $ megfigyelő), elvont public function removeObserver (Observer $ megfigyelői ), elvont public function updateObservers ($ newsHeadline);} / ** * Ez a téma osztály a példa * * @ szerző Lloyd Watkin * @ óta 2009/12/23 * / class ArticleAggregator kiterjed Tárgy {/ ** * tárolására egy lista a megfigyelők * * @ var array * / protected $ _observerList = array (); / ** * módszer, hogy adjunk egy megfigyelő * * @ var Observer $ megfigyelőt * @ return void * / public function addObserver (Observer $ megfigyelő) {$ this-> _observerList [] = $ megfigyelőként;} / ** * módszer, hogy távolítsa el a megfigyelő * * @ var Observer $ megfigyelőt * @ return boolean * / public function removeObserver (Observer $ megfigyelő) {foreach ($ this-> _observerList AS $ key => $ ob) {if ($ ob == $ megfigyelő) {unset ($ this-> _observerList [$ kulcs]) return true;}} return false;} / ** * módszer, hogy frissítse a megfigyelők * * @ var string $ newsHeadline * @ return void * / public function updateObservers ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ ob-> update ($ newsHeadline);}} / ** * Új Új hír * * @ var string $ story * @ return void * / public function addNewsStory ($ történet) {if (empty ($ story) | |! is_string ($ story)) {throw new InvalidArgumentException ("várható a hír történetet! ");} $ this-> updateObservers ($ történet);}} 

Controller Script

  <? Php
 / **
  * Observer tervezési minta példa
  *
  * @ Szerző Lloyd Watkin
  * @ Óta 2009/12/23
  * @ Link http://www.evilprofessor.co.uk
  * /
 között "observers.php";
 között "subject.php";

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

 / / Mit csinálunk?
 echo "Observer minta példa PHP-ben."  PHP_EOL;
 echo'================================'.  PHP_EOL;
 / / Beállítása a téma
 $ Subject = új ArticleAggregator ();
 echo '- ArticleAggregator létrehozott ".  PHP_EOL;

 / / Add Egyes megfigyelők
 $ Subject-> addObserver (új NewsObserver ());
 $ Subject-> addObserver ($ gossiper = new GossipObserver ());

 echo '- Új NewsObverser és GossipObserver ".
	  PHP_EOL.  PHP_EOL;

 / / Hangjelzés, hangjelzés, csipog ...  Hírek Flash!
 echo 'Hírmorzsa: celeb rögbi játékos szeret finanszírozás ".  PHP_EOL;
 echo'================================================ ".  PHP_EOL;
 $ Subject-> addNewsStory (celeb rögbi játékos szeret pénzügyek ');
 echo PHP_EOL;

 echo '- SportObserver talált, és szeretne csatlakozni a csoporthoz! ";
 $ Subject-> addObserver (új SportObserver ());
 echo PHP_EOL.  PHP_EOL;

 / / Hangjelzés, hangjelzés, csipog ...  Hírek Flash!
 echo 'Hírmorzsa: kormányzati elrontja újra! "  .  PHP_EOL;
 echo'======================================='.  PHP_EOL;
 $ Subject-> addNewsStory ("kormányzati elrontja újra! ');
 echo PHP_EOL;

 / / Hangjelzés, hangjelzés, csipog ...  Hírek Flash!
 echo 'Hírmorzsa: divat és a futball össze ".  PHP_EOL;
 echo'======================================='.  PHP_EOL;
 $ Subject-> addNewsStory ("a divat és a futball össze");
 echo PHP_EOL;

 / / Hangjelzés, hangjelzés, csipog ...  Hírek Flash!
 echo 'Hírmorzsa: a zene és a politika, mi a következő lépés? "  .  PHP_EOL;
 echo'=========================================='.  PHP_EOL;
 $ Subject-> addNewsStory ("a zene és a politika, mi a következő lépés?");
 echo PHP_EOL;

 / **
  * Gossipers nő belefáradt a hírek nagyon gyorsan és úgy döntött,
  * A stop hallgatni, annak ellenére, hogy minden érdekes hír ma!
  * /
 echo '- GossipObserver unatkozik, és elhagyja a csoportot! "  .
      PHP_EOL.  PHP_EOL;
 $ Subject-> removeObserver ($ gossiper);

 / / Hangjelzés, hangjelzés, csipog ...  Hírek Flash - Frissítés egy korábbi történet!
 echo 'NewsUpdate: divat és a futball össze azt mondja ".
      "Kormány".  PHP_EOL;
 echo'================================================ ".
      '========='.  PHP_EOL;
 $ Subject-> addNewsStory ("a divat és a futball össze".
                         Mondja kormány);
 echo PHP_EOL;

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

";

}

3 Responses to "PHP Design Patterns - Observer Pattern"

  1. Fogadalom szerint:

    Hello,
    Először is, az angol tudásom nagyon gyenge, akkor
    Meg tudja mondani, mi az a rendszer, a képen?
    Fedora 12?
    Mi a téma?

  2. Fogadalom szerint:

    Hello,
    Meg tudja mondani, mi az a rendszer, a képen?
    Fedora 12?
    Mi a téma?

Hagy egy Válaszol













Panorama Theme by Themocracy

7 online látogató jelenleg
3 vendég, 4 botoktól, 0 tag
Max. látogatók ma: 14-én 02:02 UTC
Ebben a hónapban: 22 at 2011/08/06 12:30 UTC
Ebben az évben: 130 at 28-03-2011 22:40 UTC
Minden idő: 130 at 28-03-2011 10:40 UTC