PHP Patrones de Diseño - Diseño de Observadores

Por Lloyd Watkin Steven , martes 29 de diciembre 2009 22:02

He estado leyendo Head First Design Patterns recientemente y he decidido a escribir algunos de los patrones como ejemplos de PHP para mi propio beneficio. El primero que me he decidido a codificar es el patrón Observer . La definición formal del patrón Observer es:

El patrón observador (un subconjunto de los asincrónica de publicación / suscripción patrón ) es un software de patrón de diseño en el que un objeto , llamado el tema, mantiene una lista de sus dependientes, los observadores llamados, y les notifica automáticamente de cualquier cambio de estado, por lo general, llamando uno de sus métodos . Se utiliza principalmente para implementar sistemas distribuidos de control de eventos.

Puesto que los sistemas se vuelven más imprecisa asegurarse de que cuando un evento ocurre todos los sistemas que requieren el conocimiento de estas actualizaciones se informó. Por ejemplo, una entrada de blog, después de guardar un mensaje que tenga que actualizar un motor de búsqueda (por ejemplo, Lucene), actualizar nuestro mapa del sitio, las etiquetas, correo electrónico usuarios suscritos, etc El patrón observador permite a los desarrolladores añadir detectores adicionales sin modificar su objeto observable . Mediante la inyección de observadores (es decir, un motor de búsqueda de observador actualización, un mapa de su sitio, etc) en un sujeto (es decir, sistema de edición blog post) podemos permitir que el que para llevar a cabo todas las actualizaciones necesarias sin ningún cambio.

Antes de que el patrón Observer se identificó el truco habitual sería actualizar el objeto de observar con una línea adicional de código para actualizar el sistema requiere, y la eliminación de la línea de código como sea necesario. Esto no permite fácilmente agregar y quitar los observadores.

Las actualizaciones de todos los sujetos de sus observadores a través de un método de actualización. Este método de actualización llama a un método en cada observador que se deriva de la aplicación de una interfaz. Los observadores pueden añadir una retirarse a través de métodos en el objeto observable.

Eso es básicamente! Siempre encuentro un ejemplo para ser el mejor método de aprendizaje y comprensión de lo que aquí está mi código de ejemplo de hasta ...

Observador Patrón en PHP

En mi ejemplo he creado un sistema de noticias (NewsAggregator) que envía actualizaciones de titulares de noticias a las pequeñas noticias. Aquí el sytem de noticias toma el lugar del sujeto, observable, etc mientras que los canales de noticias tomar el papel de los observadores u oyentes.

Una vez que los observadores inicializado puede atacar y se separan de la materia como mejor les parezca. En mi ejemplo he creado tres observadores, estos análisis de los titulares que se distribuye por el tema y "nota" la noticia de si es apropiado. Los tres observadores se nombran a continuación junto con los términos que para la exploración al recibir titulares de noticias:

  • tenis '' 'de rugby, deporte Observador: "fútbol",
  • Noticias Observador: "política", "finanzas", "gobierno"
  • la moda '"' celebridad ', Gossip Observador:" música ",

Después de initalising el tema que añadir a los observadores de noticias y chismes y enviar una actualización de noticias. Después de esto el observador deporte se añade antes de que más actualizaciones de las noticias se envían. Por último, el observador chisme se produce antes de un titular de prensa final se envía.

Los tres observadores diferentes clases implementan la interfaz Observer, esto les da una clara interfaz o método a través del cual recibirá las actualizaciones. Siempre que implementar la interfaz de Observadores serán capaces de colocar en la Asignatura. Esto también se mantiene con el paradigma de programación de «programa de interfaces no puestas en práctica". La clase NewsAggregator amplía el Asunto clase abstracta, que nos proporciona los tres métodos públicos necesarios:

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

El código se puede ver corriendo aquí, Observador Patrón en PHP Ejecutar , y el código se puede descargar desde aquí, Observador Patrón en el código PHP .

Observadores de secuencias de comandos

  <? Php
 / **
  * Este archivo contiene los observadores
  *
  * @ Autor Lloyd Watkin
  * @ Desde 2009/12/23
  * /

 Sin perjuicio de la clase abstracta
 {
	 addObserver abstracta función pública (Observador $ observador);
	 removeObserver abstracta función pública (Observador $ observador);
	 resumen updateObservers función pública ($ newsHeadline);
 }

 / **
  * Esta es la clase de objeto para el ejemplo
  *
  * @ Autor Lloyd Watkin
  * @ Desde 2009/12/23
  * /
 clase ArticleAggregator extiende Asunto
 {
	 / **
	  * Contiene una lista de nuestros observadores
	  *
	  * @ Var array
	  * /
	 protegidas _observerList $ = array ();

	 / **
	  * Método para añadir un observador
	  *
	  * @ Var $ Observador observador
	  * @ Devuelven void
	  * /
	 addObserver función pública (Observador $ observador)
	 {
		 _observerList $ this-> [] = $ observador;
	 }

	 / **
	  * Método para eliminar un observador
	  *
	  * @ Var $ Observador observador
	  * @ Booleano retorno
	  * /
	 removeObserver función pública (Observador $ observador)
	 {
		 foreach ($ this-> _observerList as $ key => $ ob) {
			 if ($ ob == $ observador) {
				 unset ($ this-> _observerList [$ clave]);
				 return true;
			 }
		 }
		 return false;
	 }

	 / **
	  * Método para actualizar los observadores
	  *
	  * @ Var $ cadena newsHeadline
	  * @ Devuelven void
	  * /
	 updateObservers función pública ($ newsHeadline)
	 {
		 foreach ($ this-> _observerList COMO $ ob) {
			 actualización de $ ob-> ($ newsHeadline);
		 }
	 }

	 / **
	  * Añadir una nueva noticia
	  *
	  * @ Var $ cadena historia
	  * @ Devuelven void
	  * /
	 addNewsStory función pública ($ argumento)
	 {
		 if (empty ($ argumento) | |! is_string ($ argumento)) {
			 lanzar nuevos InvalidArgumentException ('Se esperaba una noticia!');
		 }
		 $ This-> updateObservers ($ argumento);
	 }
 } 

Asunto / Guión observables

 <Php / ** * Este archivo contiene el objeto * * @ autor Lloyd Watkin * @ desde 2009/12/23 * / Asunto clase abstracta {addObserver abstracta función pública (Observador $ observador); removeObserver abstracta función pública (Observador $ observador ); abstracta updateObservers función pública ($ newsHeadline);} / * ** Esta es la clase de objeto para el ejemplo * * @ autor Lloyd Watkin * @ desde 2009/12/23 * / clase ArticleAggregator extiende Asunto {/ ** * Guarda una lista de nuestros observadores * * * @ var array / protegidas $ _observerList = array (); / ** * Método para añadir un observador * * @ var $ * Observadores de observador @ return void * / addObserver función pública (Observador $ observador) _observerList {$ this-> [] = $ observador;} / ** * Método para eliminar un observador * * @ var Observador observador $ * @ return * booleano / removeObserver función pública (Observador $ observador) {foreach ($ this-> clave _observerList COMO $ => $ ob) {if ($ ob == $ observador) {unset (_observerList $ this-> [$ clave]); return true;}} return false;} / ** * Método para actualizar los observadores * * @ var $ cadena newsHeadline * @ return void * / updateObservers función pública ($ newsHeadline) {foreach ($ this-> _observerList COMO $ ob) {$ actualización ob-> ($ newsHeadline);}} / ** * Agregar una nueva historia de noticias * * @ var $ cadena * @ return historia void * / addNewsStory función pública ($ argumento) {if (empty ($ argumento) | |! is_string ($ argumento)) {throw InvalidArgumentException nueva ('Se esperaba una noticia historia ");} $ this-> updateObservers ($ argumento);}} 

Controlador de secuencias de comandos

  <? Php
 / **
  * Diseño de Observadores Patrón Ejemplo
  *
  * @ Autor Lloyd Watkin
  * @ Desde 2009/12/23
  * @ Http://www.evilprofessor.co.uk enlace
  * /
 incluyen "observers.php;
 incluyen "subject.php;

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

 / / ¿Qué estamos haciendo?
 echo 'observador patrón de ejemplo en PHP.  PHP_EOL;
 eco'================================'.  PHP_EOL;
 / / Configuración de nuestro tema
 tema = $ ArticleAggregator nuevo ();
 echo '- ArticleAggregator creado ".  PHP_EOL;

 / / Añadir un poco de observadores
 $ AddObserver objeto-> (nuevo NewsObserver ());
 (Chismoso $ = new GossipObserver ()) $ objeto-> addObserver;

 echo '- Añadido NewsObverser y GossipObserver.
	  PHP_EOL.  PHP_EOL;

 / / Bip, bip, bip ...  Noticias de última hora!
 echo 'NoticiasFlash: jugador de rugby celebridades ama de finanzas.  PHP_EOL;
 eco'================================================ '.  PHP_EOL;
 addNewsStory $ objeto-> ('Famoso jugador de rugby ama de finanzas);
 eco PHP_EOL;

 echo '- SportObserver ha descubierto y quiere unirse al grupo!';
 $ AddObserver objeto-> (nuevo SportObserver ());
 eco PHP_EOL.  PHP_EOL;

 / / Bip, bip, bip ...  Noticias de última hora!
 echo 'NoticiasFlash: el gobierno meta la pata otra vez! "  .  PHP_EOL;
 eco'======================================='.  PHP_EOL;
 $ Objeto-> addNewsStory ("gobierno meta la pata otra vez! ');
 eco PHP_EOL;

 / / Bip, bip, bip ...  Noticias de última hora!
 echo 'NoticiasFlash: la moda y el fútbol se combinan ".  PHP_EOL;
 eco'======================================='.  PHP_EOL;
 addNewsStory $ objeto-> («combinar la moda y el fútbol ');
 eco PHP_EOL;

 / / Bip, bip, bip ...  Noticias de última hora!
 echo 'NoticiasFlash: la música y la política, ¿qué sigue? "  .  PHP_EOL;
 eco'=========================================='.  PHP_EOL;
 addNewsStory $ objeto-> («la música y la política, ¿y ahora qué? ');
 eco PHP_EOL;

 / **
  * Chismosos se cansan de las noticias con gran rapidez y han decidido
  * Dejar de escuchar, a pesar de todas las noticias interesantes hoy!
  * /
 echo '- GossipObserver se aburre y deja el grupo!  .
      PHP_EOL.  PHP_EOL;
 removeObserver $ objeto-> ($ chismoso);

 / / Bip, bip, bip ...  Flash de Noticias - Actualización de una historia antes!
 echo 'NewsUpdate: la moda y el fútbol se combinan dice.
      "Gobierno".  PHP_EOL;
 eco'================================================ '.
      '========='.  PHP_EOL;
 addNewsStory $ objeto-> («combinar la moda y el fútbol".
                         'Dice que el Gobierno ");
 eco PHP_EOL;

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

';

}

3 Respuestas a "PHP Patrones de Diseño - Diseño de observador"

  1. Voto dice:

    Hola,
    En primer lugar, mi Inglés es muy pobre, a continuación,
    ¿Me puede decir cuál es el sistema en la foto?
    Fedora 12?
    ¿Cuál es el tema?

  2. Voto dice:

    Hola,
    ¿Me puede decir cuál es el sistema en la foto?
    Fedora 12?
    ¿Cuál es el tema?

Deja una respuesta













Panorama Tema por Themocracy

4 visitantes en línea ahora
2 personas, contra los robots de 2, 0 miembros
Número máximo de visitantes de hoy: 14 a las 24:11 UTC
Este mes: 26 a 05/07/2011 12:35a.m. UTC
Este año: 130 en 28-03-2011 22:40 UTC
Todo el tiempo: 130 en 28-03-2011 22:40 UTC