PHP Patrons de Disseny - Disseny de Observadors

Per Lloyd Watkin Steven , dimarts 29 desembre 2009 22:02

He estat llegint Head First Design Patterns recentment i he decidit a escriure alguns dels patrons com a exemples de PHP per al meu propi benefici. El primer que m'he decidit a codificar és el patró Observer . La definició formal del patró Observer és:

El patró observador (un subconjunt dels asincrònica de publicació / subscripció patró ) és un programari de patró de disseny en el qual un objecte , anomenat el tema, manté una llista dels seus dependents, els observadors anomenats, i us notifica automàticament de qualsevol canvi d'estat, en general, trucant un dels seus mètodes . S'utilitza principalment per implementar sistemes distribuïts de control d'esdeveniments.

Com que els sistemes es tornen més imprecisa assegurar-se que quan un esdeveniment ocorre tots els sistemes que requereixen el coneixement d'aquestes actualitzacions es va informar. Per exemple, una entrada de bloc, després de guardar un missatge que hagi de actualitzar un motor de cerca (per exemple, Lucene), actualitzar el nostre mapa del lloc, les etiquetes, correu electrònic usuaris subscrits, etc El patró observador permet als desenvolupadors afegir detectors addicionals sense modificar el seu objecte observable . Mitjançant la injecció d'observadors (és a dir, un motor de cerca d'observador actualització, un mapa del seu lloc, etc) en un subjecte (és a dir, sistema d'edició blog post) podem permetre que el que per dur a terme totes les actualitzacions necessàries sense cap canvi.

Abans que el patró Observer es va identificar el truc habitual seria actualitzar l'objecte d'observar amb una línia addicional de codi per actualitzar el sistema requereix, i l'eliminació de la línia de codi com sigui necessari. Això no permet fàcilment afegir i treure els observadors.

Les actualitzacions de tots els subjectes dels seus observadors a través d'un mètode d'actualització. Aquesta manera d'actualitzar crida a un mètode en cada observador que es deriva de l'aplicació d'una interfície. Els observadors poden afegir una retirar-se a través de mètodes en l'objecte observable.

Això és bàsicament! Sempre trobo un exemple per ser el millor mètode d'aprenentatge i comprensió del que aquí està el meu codi d'exemple de fins a ...

Observador Patró en PHP

En el meu exemple he creat un sistema de notícies (NewsAggregator) que envia actualitzacions de titulars de notícies a les petites notícies. Aquí el Sytem de notícies pren el lloc del subjecte, observable, etc mentre que els canals de notícies prendre el paper dels observadors o oients.

Una vegada que els observadors inicialitzat pot atacar i se separen de la matèria com millor els sembli. En el meu exemple he creat tres observadors, aquestes anàlisis dels titulars que es distribueix pel tema i "nota" la notícia de si és apropiat. Els tres observadors es nomenen a continuació juntament amb els termes que per a l'exploració en rebre titulars de notícies:

  • tennis'''de rugbi, esport Observador: "futbol",
  • Notícies Observador: "política", "finances", "govern"
  • la moda '"' celebritat ', Gossip Observador:" música ",

Després de initalising el tema que afegir als observadors de notícies i xafarderies i enviar una actualització de notícies. Després d'això l'observador esport s'afegeix abans que més actualitzacions de les notícies s'envien. Finalment, l'observador xafarderia es produeix abans d'un titular de premsa final s'envia.

Els tres observadors diferents classes implementen la interfície Observer, això els dóna una clara interfície o mètode a través del qual rebrà les actualitzacions. Sempre d'implementar la interfície d'Observadors seran capaços de posar a l'assignatura. Això també es manté amb el paradigma de programació de «programa d'interfícies no posades en pràctica". La classe NewsAggregator amplia l'Assumpte classe abstracta, que ens proporciona els tres mètodes públics necessaris:

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

El codi es pot veure corrent aquí, Observador patró en PHP Executar , i el codi es pot descarregar des d'aquí, Observador Patró en el codi PHP .

Observadors de seqüència

  <? Php
 / **
  * Aquest fitxer conté els observadors
  *
  * @ Autor Lloyd Watkin
  * @ Des 2009/12/23
  * /

 Sense perjudici de la classe abstracta
 {
	 addObserver abstracta funció pública (Observador $ observador);
	 removeObserver abstracta funció pública (Observador $ observador);
	 resum updateObservers funció pública ($ newsHeadline);
 }

 / **
  * Aquesta és la classe d'objecte per a l'exemple
  *
  * @ Autor Lloyd Watkin
  * @ Des 2009/12/23
  * /
 classe ArticleAggregator s'estén Assumpte
 {
	 / **
	  * Conté una llista dels nostres observadors
	  *
	  * @ Var array
	  * /
	 protegides _observerList $ = array ();

	 / **
	  * Mètode per afegir un observador
	  *
	  * @ Var $ Observador observador
	  * @ Tornen void
	  * /
	 addObserver funció pública (Observador $ observador)
	 {
		 _observerList $ this-> [] = $ observador;
	 }

	 / **
	  * Mètode per eliminar un observador
	  *
	  * @ Var $ Observador observador
	  * @ Booleà retorn
	  * /
	 removeObserver funció pública (Observador $ observador)
	 {
		 foreach ($ this-> _observerList es $ key => $ o b) {
			 if ($ ob == $ observador) {
				 unset ($ this-> _observerList [$ clau]);
				 return true;
			 }
		 }
		 return false;
	 }

	 / **
	  * Mètode per actualitzar els observadors
	  *
	  * @ Var $ cadena newsHeadline
	  * @ Tornen void
	  * /
	 updateObservers funció pública ($ newsHeadline)
	 {
		 foreach ($ this-> _observerList COM $ o b) {
			 actualització de $ ob-> ($ newsHeadline);
		 }
	 }

	 / **
	  * Afegir una nova notícia
	  *
	  * @ Var $ cadena història
	  * @ Tornen void
	  * /
	 addNewsStory funció pública ($ argument)
	 {
		 if (empty ($ argument) | |! is_string ($ argument)) {
			 llançar nous InvalidArgumentException ('S'esperava una notícia!');
		 }
		 $ This-> updateObservers ($ argument);
	 }
 } 

Assumpte / Guió observables

 <Php / ** * Aquest fitxer conté l'objecte * * @ autor Lloyd Watkin * @ des 2009/12/23 * / Assumpte classe abstracta {addObserver abstracta funció pública (Observador $ observador); removeObserver abstracta funció pública (Observador $ observador ); abstracta updateObservers funció pública ($ newsHeadline),} / * ** Aquesta és la classe d'objecte per a l'exemple * @ autor Lloyd Watkin * @ des 2009/12/23 * / mena ArticleAggregator s'estén Assumpte {/ ** * Guarda una llista dels nostres observadors * * * @ var array / protegides $ _observerList = array (); / ** * Mètode per afegir un observador * * @ var $ * Observadors d'observador @ return void * / addObserver funció pública (Observador $ observador) _observerList {$ this-> [] = $ observador;} / ** * Mètode per eliminar un observador * * @ var Observador observador $ * @ return * booleà / removeObserver funció pública (Observador $ observador) {foreach ($ this-> clau _observerList COM $ => $ o b) {if ($ ob == $ observador) {unset (_observerList $ this-> [$ clau]); return true;}} return false;} / ** * Mètode per actualitzar els observadors * * @ var $ cadena newsHeadline * @ return void * / updateObservers funció pública ($ newsHeadline) {foreach ($ this-> _observerList COM $ o b) {$ actualització ob-> ($ newsHeadline);}} / ** * Afegir una nova història de notícies * * @ var $ cadena * @ return història void * / addNewsStory funció pública ($ argument) {if (empty ($ argument) | |! is_string ($ argument)) {throw InvalidArgumentException nova ('S'esperava una notícia història ");} $ this-> updateObservers ($ argument);}} 

Controlador de seqüència

  <? Php
 / **
  * Disseny d'Observadors Patró Exemple
  *
  * @ Autor Lloyd Watkin
  * @ Des 2009/12/23
  * @ Http: / / www.evilprofessor.co.uk enllaç
  * /
 inclouen "observers.php;
 inclouen "subject.php;

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

 / / Què estem fent?
 echo 'observador patró d'exemple en PHP.  PHP_EOL;
 ressò'================================'.  PHP_EOL;
 / / Configuració del nostre tema
 tema = $ ArticleAggregator nou ();
 echo '- ArticleAggregator creat ".  PHP_EOL;

 / / Afegir una mica d'observadors
 $ AddObserver objecte-> (nou NewsObserver ());
 (Chismoso $ = new GossipObserver ()) $ objecte-> addObserver;

 echo '- Afegit NewsObverser i GossipObserver.
	  PHP_EOL.  PHP_EOL;

 / / Bip, bip, bip ...  Notícies d'última hora!
 echo 'NoticiasFlash: jugador de rugbi celebritats mestressa de finances.  PHP_EOL;
 ressò'================================================ '.  PHP_EOL;
 addNewsStory $ objecte-> ('Famós jugador de rugbi mestressa de finances);
 eco PHP_EOL;

 echo '- SportObserver ha descobert i vol unir-se al grup!';
 $ AddObserver objecte-> (nou SportObserver ());
 ressò PHP_EOL.  PHP_EOL;

 / / Bip, bip, bip ...  Notícies d'última hora!
 echo 'NoticiasFlash: el govern meta la pota altra vegada! "  .  PHP_EOL;
 ressò'======================================='.  PHP_EOL;
 $ Objecte-> addNewsStory ("govern meta la pota de nou! ');
 eco PHP_EOL;

 / / Bip, bip, bip ...  Notícies d'última hora!
 echo 'NoticiasFlash: la moda i el futbol es combinen ".  PHP_EOL;
 ressò'======================================='.  PHP_EOL;
 addNewsStory $ objecte-> («combinar la moda i el futbol ');
 eco PHP_EOL;

 / / Bip, bip, bip ...  Notícies d'última hora!
 echo 'NoticiasFlash: la música i la política, què segueix? "  .  PHP_EOL;
 ressò'=========================================='.  PHP_EOL;
 addNewsStory $ objecte-> («la música i la política, i ara què? ');
 eco PHP_EOL;

 / **
  * Xafarders es cansen de les notícies amb gran rapidesa i han decidit
  * Deixar d'escoltar, malgrat totes les notícies interessants avui!
  * /
 echo '- GossipObserver s'avorreix i deixa el grup!  .
      PHP_EOL.  PHP_EOL;
 removeObserver $ objecte-> ($ xafarder);

 / / Bip, bip, bip ...  Flash de Notícies - Actualització d'una història abans!
 echo 'NewsUpdate: la moda i el futbol es combinen diu.
      "Govern".  PHP_EOL;
 ressò'================================================ '.
      '========='.  PHP_EOL;
 addNewsStory $ objecte-> («combinar la moda i el futbol".
                         'Diu que el Govern ");
 eco PHP_EOL;

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

';

}

3 Respostes a "PHP Patrons de Disseny - Disseny d'observador"

  1. Vot diu:

    Hola,
    En primer lloc, el meu anglès és molt pobre, a continuació,
    Em pot dir quin és el sistema a la foto?
    Fedora 12?
    Quin és el tema?

  2. Vot diu:

    Hola,
    Em pot dir quin és el sistema a la foto?
    Fedora 12?
    Quin és el tema?

Deixa una resposta













Panorama Tema per Themocracy

6 visitants en línia
3 persones, contra els robots d'3, 0 membres
Nombre màxim de visitants d'avui: 17 a les 12:28 UTC
Aquest mes: 26 a 2011.07.05 12:35 UTC
Aquest any: 130 en 2011.03.28 22:40 UTC
Tot el temps: 130 en 2011.03.28 22:40 UTC