PHP Design Patterns - Observer minta

A , 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 frissítési 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 az én 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 $ története
	  * @ 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émával
  *
  * @ 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 $ története
	  * @ 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);
	 }
 } 

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 & 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,
  * Megállítani hallgat, 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 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:

    Helló,
    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:

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

Hagy egy Válaszol













Panorama Theme by Themocracy

23 online látogató jelenleg
4 vendég, 19 botoktól, 0 tag
Max. látogatók ma: 23 at 02:00 UTC
Ebben a hónapban: 47 at 2011/03/10 02:47 UTC
Ebben az évben: 130 at 28-03-2011 22:40 UTC
Minden idő: 130 at 28-03-2011 10:40 UTC