PHP Design Patterns - patró Observer

Per , 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 pel codi és el patró Observer . La definició formal del patró Observer és la següent:

El patró d'observador (un subconjunt de la asíncron de publicació / subscripció patró ) és un programari de patró de disseny en què un objecte , anomenat el tema, manté una llista dels seus dependents, anomenats observadors, i se'ls 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 els sistemes cada vegada més dèbilment acoblats assegurar-se que quan un esdeveniment ocorre tots els sistemes que requereixen el coneixement d'aquests canvis són informats. Per exemple, una entrada del 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, els usuaris de correu electrònic subscrit, etc El patró d'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'actualitzacions d'observador, un generador de mapa, etc) en un tema (bloc, és a dir després de l'edició del sistema) es pot permetre que el que per dur a terme totes les actualitzacions necessàries sense cap canvi.

Abans que el patró Observer va ser identificat el truc habitual seria actualitzar l'objecte d'observar amb una línia de codi addicional per actualitzar el sistema requereix, i l'eliminació de la línia de codi quan sigui necessari. Això no permet fàcilment afegir i eliminar 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 la implementació d'una interfície. Els observadors poden afegir una retirar-se a través de mètodes en l'objecte observable.

Que és bàsicament la mateixa! Sempre trobo un exemple per ser el millor mètode d'aprenentatge / coneixement així 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 canals de notícies més petits. Aquí el sistema de l'atleta notícies pren el lloc del subjecte, observable, etc, mentre que els canals de notícies prenen el paper dels observadors o oients.

Un cop inicialitzat observadors poden connectar-se i desconnectar-se a si mateixos de la matèria com millor els sembli. En el meu exemple he creat tres observadors, aquestes anàlisis els titulars enviats pel subjecte i el 'crit' la notícia de si el seu adequat. Els tres observadors es nomenen a continuació juntament amb els termes de buscar en rebre titulars de notícies:

  • Esport Observador: 'rugbi', 'futbol', 'tennis'
  • Observadors de notícies: "política", "finances", "govern"
  • Observadors de xafarderies: "celebritat", "música", "moda"

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

Les tres classes diferents observadors implementar la interfície d'observador, el que els dóna un mètode clar d'interfície / a través del qual rebrà les actualitzacions. Sempre d'implementar la interfície d'Observadors de que serà capaç d'adherir a la reserva. Això també es manté amb el paradigma de la programació de 'programa per implementacions d'interfícies no ". La classe NewsAggregator s'estén la reserva 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í, patró Observer en PHP execució , i el codi es pot descarregar des d'aquí, patró Observer en el codi PHP .

Observadors de script

  <? Php
 / **
  * Aquest arxiu conté els observadors
  *
  * @ Autor Lloyd Watkin
  * @ Since 2009.12.23
  * /

 Assumpte classe abstracta
 {
	 addObserver abstracta funció pública (Observador observador $);
	 removeObserver abstracta funció pública (Observador observador $);
	 abstracte updateObservers funció pública ($ newsHeadline);
 }

 / **
  * Aquesta és la classe d'assumpte per l'exemple
  *
  * @ Autor Lloyd Watkin
  * @ Since 2009.12.23
  * /
 ArticleAggregator classe s'estén Assumpte
 {
	 / **
	  * Manté una llista dels nostres observadors
	  *
	  * @ Array var
	  * /
	 protected $ _observerList = array ();

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

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

	 / **
	  * Mètode per actualitzar els observadors
	  *
	  * @ Var $ cadena newsHeadline
	  * @ Return buit
	  * /
	 updateObservers funció pública ($ newsHeadline)
	 {
		 foreach ($ this-> _observerList AS $ ob) {
			 $ Ob-> actualitzar ($ newsHeadline);
		 }
	 }

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

Assumpte / Observable script

 ? <Php / ** * Aquest arxiu conté la matèria * * @ author Lloyd Watkin * @ since 12/23/2009 * / Assumpte classe abstracta {addObserver abstracta funció pública (Observador $ observador); removeObserver abstracta funció pública (Observador $ observador ); abstracte updateObservers funció pública ($ newsHeadline);} / ** * Aquesta és la classe d'assumpte per l'exemple * @ autor Lloyd Watkin * @ since 2009.12.23 * / ArticleAggregator classe s'estén Assumpte {/ ** * Guarda una llista dels nostres observadors * * @ var array * / protected $ _observerList = array (); / ** * Mètode per afegir un observador * * @ var $ Observador observador * @ return void * / addObserver funció pública (Observador $ observador) {$ this-> _observerList [] = $ observador;} / ** * Mètode per eliminar un observador * * @ var $ Observador observador * @ return * booleà / removeObserver funció pública (Observador $ observador) {foreach ($ this-> _observerList es $ key => $ ob) {if ($ ob == $ observador) {unset ($ this-> _observerList [$ clau]); return true;}} return false;} / ** * Mètode per actualitzar els observadors * * @ var string $ newsHeadline * @ return void * / public function updateObservers ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ ob-> actualitzar ($ newsHeadline);}} / ** * Afegeix una notícia nova * * @ var string * @ return història void * / addNewsStory funció pública ($ story) {if (empty ($ story) | |! is_string ($ story)) {throw InvalidArgumentException nou ("espera una notícia història ");} $ this-> updateObservers ($ story);}} 

Controlador de script

  <? Php
 / **
  * Disseny de Observadors de patró d'exemple
  *
  * @ Autor Lloyd Watkin
  * @ Since 2009.12.23
  * @ Link http://www.evilprofessor.co.uk
  * /
 inclouen "observers.php;
 inclouen "subject.php;

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

 / / Què estem fent?
 "Exemple d'Observadors de patrons en PHP" fet.  PHP_EOL;
 fet'================================'.  PHP_EOL;
 / / Configuració del nostre tema
 $ Assumpte = new ArticleAggregator ();
 echo '- ArticleAggregator creat ".  PHP_EOL;

 / / Afegir alguns observadors
 $ Assumpte-> addObserver (nou NewsObserver ());
 $ Assumpte-> addObserver ($ xafarder = new GossipObserver ());

 echo '- S'ha afegit NewsObverser i GossipObserver.
	  PHP_EOL.  PHP_EOL;

 / / Beep, beep, beep ...  Notícies al Instant!
 echo 'ÚLTIMA HORA: celebritats jugador de rugbi mestressa de finances.  PHP_EOL;
 fet'================================================ .  PHP_EOL;
 $ Assumpte-> addNewsStory ('celebrity jugador de rugbi mestressa de finances);
 fet PHP_EOL;

 echo '- SportObserver ha descobert i vol unir-se al grup';
 $ Assumpte-> addObserver (nou SportObserver ());
 fet PHP_EOL.  PHP_EOL;

 / / Beep, beep, beep ...  Notícies al Instant!
 "ÚLTIMA HORA: el govern fica la pota una altra vegada!" Eco  .  PHP_EOL;
 fet'======================================='.  PHP_EOL;
 $ Assumpte-> addNewsStory ("es fica el govern de nou! ');
 fet PHP_EOL;

 / / Beep, beep, beep ...  Notícies al Instant!
 echo 'ÚLTIMA HORA: la moda i el futbol es combinen ".  PHP_EOL;
 fet'======================================='.  PHP_EOL;
 $ Assumpte-> addNewsStory ("la moda i combinar el futbol ');
 fet PHP_EOL;

 / / Beep, beep, beep ...  Notícies al Instant!
 echo 'ÚLTIMA HORA: la música i la política, què segueix? "  .  PHP_EOL;
 fet'=========================================='.  PHP_EOL;
 $ Assumpte-> addNewsStory ("la música i la política, què segueix? ');
 fet PHP_EOL;

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

 / / Beep, beep, beep ...  News Flash - Actualització d'una història d'abans!
 echo 'NewsUpdate: la moda i combinar el futbol diu ".
      "Govern".  PHP_EOL;
 fet'================================================ .
      '========='.  PHP_EOL;
 $ Assumpte-> addNewsStory ("la moda i el futbol es combinen".
                         'Diu que el Govern ");
 fet PHP_EOL;

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

;

}

3 Responses to "patrons de disseny PHP - patró Observer"

  1. Vot, diu:

    Hola,
    En primer lloc, el meu anglès és molt pobre, llavors
    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 un comentari













Panorama Tema per Themocracy

6 visitants en línia ara
3 persones, 3 bots, 0 membres
Max visitants d'avui: 16 a les 01:33 UTC
Aquest mes: 17 a 2011.01.09 23:27 UTC
Aquest any: 130 en 2011.03.28 22:40 UTC
En total: 130 en 2011.03.28 22:40 UTC