Patróns de deseño PHP - O nivel Observer

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

Estiven lendo o Head First Design Patterns recentemente e decide escribir algúns dos patróns, como exemplos de PHP para o meu propio beneficio. O primeiro que eu decidimos código anterior é o patrón Observer . A definición formal do estándar Observer é:

O observador estándar (un subconxunto do asíncrono publish / subscribe estándar ) é un software patrón de deseño en que un obxecto , chamado de suxeito, mantén unha lista dos seus dependentes, como "observadores", e notifica-los directamente de calquera cambio de estado, xeralmente por chamada un dos seus métodos . É usado principalmente para aplicar sistemas de manipular de eventos distribuídos.

Como os sistemas se fan máis flexible asegurarse de que cando un evento acontece todos os sistemas que requiren o coñecemento destas actualizacións están informados. Por exemplo, un post de blog, despois de gardar un post que pode ter actualizar un motor de procura (por exemplo, Lucena), actualizar o noso Sitemap, etiquetas, e-mail usuarios rexistrados, etc O observador estándar permite aos desenvolvedores engadir máis oíntes sen modificar o seu obxecto observables . Ao inxectar os observadores (ou sexa, unha busca de observación actualización do motor, un xerador de Sitemap, etc) en un tema (ou sexa, sistema de edición de post do blog) que pode permitir a el para realizar todas as actualizacións necesarias, sen ningún cambio.

Antes o estándar Observer foi identificado o truco habitual sería actualizar o obxecto observable cunha liña de código adicional para actualizar o sistema é necesario, e retirar a liña de código, segundo sexa necesario. Iso non permite facilmente a adición e eliminación de observadores.

As actualizacións de todos os suxeitos dos seus observadores a través dun método de actualización. A rede de actualización chama un método en cada observador, que deriva da posta en marcha dunha interface. O observador pode engadir un retirar a través de métodos no obxecto observables.

E basicamente é iso! Eu sempre creo un exemplo a ser o mellor método de aprendizaxe / comprensión polo que aquí está o exemplo do meu código anterior ...

Observer pattern en PHP

No meu exemplo creei un sistema de noticias (NewsAggregator) que envía actualizacións de titulares de noticias de menor fontes novas. Aquí, a noticia sytem toma o lugar do suxeito, observables, etc mentres os fontes novas asumir o papel de observadores ou oíntes.

Unha vez iniciado observadores pode conectar e desconectar-se do tema como ben entenderen. No meu exemplo creei tres observadores, eses dixitalizar as titulares do seu tema e "berrar" a noticia, a súa adecuada. Os tres observadores son nomeados por baixo, xunto cos termos que facer a exploración para cando recibir novas:

  • tenis "'rugby', Sport Observer:" fútbol ",
  • News Observer: 'política', 'Finanzas', 'goberno'
  • moda "'Celebridade', Gossip Observer:" music ",

Tras initalising o asunto que eu engadir os observadores de noticias e fofocas e enviar unha actualización de novas. Despois diso, o observador, o deporte é engadido antes das actualizacións máis noticias envían fóra. Por fin, o observador a fofoca é eliminada antes de un titular de xornal final é enviada para fóra.

As tres clases distintas do observador implementar a interface Observer, iso dálles unha interface clara e / ou método a través do cal recibirá actualizacións. Sempre que implementar a interface Observer que será capaz de unirse ao asunto. Isto tamén se mantén co paradigma de programación do 'programa de interfaces non implementacións. A clase estende a NewsAggregator Asunto clase abstracta, que nos ofrece os tres necesarios métodos públicos:

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

O código pode ser visto correndo aquí, Observer pattern en PHP duración , eo código pódese descargar aquí, Observer pattern en PHP Code .

Observador Script

  <? PHP
 / **
  * Este arquivo contén os observadores
  *
  * @ Author Lloyd Watkin
  * @ Desde 2009/12/23
  * /

 Asunto clase abstracta
 {
	 addObserver función abstracta pública (Observador $ observador);
	 removeObserver función abstracta pública (Observador $ observador);
	 resumo público updateObservers función ($ newsHeadline);
 }

 / **
  * Esta é a clase de asunto por exemplo
  *
  * @ Author Lloyd Watkin
  * @ Desde 2009/12/23
  * /
 ArticleAggregator clase estende Asunto
 {
	 / **
	  * Mantén unha lista dos nosos observadores
	  *
	  * @ Var array
	  * /
	 protected $ _observerList = array ();

	 / **
	  * Método para engadir un observador
	  *
	  * @ Var $ Observador Observador
	  Void * @ return
	  * /
	 addObserver función pública (Observador $ observador)
	 {
		 _observerList $ this-> [] = $ observador;
	 }

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

	 / **
	  * Método para actualizar os observadores
	  *
	  * @ Var cadea $ newsHeadline
	  Void * @ return
	  * /
	 updateObservers función pública ($ newsHeadline)
	 {
		 foreach ($ this-> _observerList AS $ ob) {
			 actualizar $ ob-> ($ newsHeadline);
		 }
	 }

	 / **
	  * Engada unha nova nova
	  *
	  * @ Var cadea $ historia
	  Void * @ return
	  * /
	 addNewsStory función pública ($ historia)
	 {
		 if (historia ($ baleiro) | | is_string ($ historia!)) {
			 xogar InvalidArgumentException novo ('esperado unha noticia');
		 }
		 $ This-> updateObservers ($ historia);
	 }
 } 

Asunto Script / Observable

 <PHP / ** * Este arquivo contén o tema * * @ author * @ Lloyd Watkin desde 2009/12/23 * / Asunto clase abstracta {addObserver función abstracta pública (Observador $ observador); removeObserver función abstracta pública (Observador $ observador ); resumo updateObservers función pública ($ newsHeadline);} / ** * Esta é a clase de asunto por exemplo * * @ author * @ Lloyd Watkin desde 2009/12/23 * / class ArticleAggregator estende Asunto {/ ** * Mantén unha lista dos nosos observadores * * * @ var array / protected _observerList $ = array (); / ** * Método para engadir un observador * * * @ var Observer observador $ @ return void * / addObserver función pública (Observador $ observador) _observerList {$ this-> [] = $ observador;} / ** * Método para eliminar un observador * * * @ var Observer observador $ @ return booleano * / removeObserver función pública (Observador $ observador) {foreach ($ this-> _observerList AS $ key => $ ob) {if (ob == observador $ $) {unset (_observerList $ this-> [$ chave]); return true;}} return false;} / ** * Método para actualizar os observadores * * @ var string * $ newsHeadline @ return void * / updateObservers función pública ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ actualización ob-> ($ newsHeadline);}} / ** * Engadir unha nova historia da noticia * @ var cadea * @ return $ historia void * / addNewsStory función pública ($ historia) {if (historia ($ baleiro) | |! is_string ($ historia)) {throw InvalidArgumentException novo ('esperado unha noticia historia ");!} $ this-> updateObservers ($ historia);}} 

Controlador de Script

  <? PHP
 / **
  * Exemplo Deseño pattern Observer
  *
  * @ Author Lloyd Watkin
  * @ Desde 2009/12/23
  * @ Link http://www.evilprofessor.co.uk
  * /
 include \ observers.php;
 include \ subject.php;

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

 / / O que estamos facendo?
 echo 'Exemplo Observer pattern en PHP.  PHP_EOL;
 echo'================================'.  PHP_EOL;
 / / Configura o noso tema
 $ Asunto ArticleAggregator = new ();
 echo '- ArticleAggregator creado.  PHP_EOL;

 / / Engadir algúns observadores
 $ AddObserver suxeita-> (novo NewsObserver ());
 (Gossip $ = new GossipObserver ()) $ asunto-> addObserver;

 echo '- Engadido NewsObverser & GossipObserver.
	  PHP_EOL.  PHP_EOL;

 / / Bip, bip, bip, ...  News Flash!
 echo 'Newsflash: xogador de rugby famosos adora financiamento ".  PHP_EOL;
 echo'================================================ .  PHP_EOL;
 addNewsStory $ asunto-> ('xogador de rugby famosos adora financiar');
 echo PHP_EOL;

 echo '- SportObserver descubriu e quere unirse ao grupo';
 $ AddObserver suxeita-> (novo SportObserver ());
 echo PHP_EOL.  PHP_EOL;

 / / Bip, bip, bip, ...  News Flash!
 echo 'Newsflash: Goberno move-se outra vez! "  .  PHP_EOL;
 echo'======================================='.  PHP_EOL;
 $ Asunto-> addNewsStory ("goberno move-se de novo! ');
 echo PHP_EOL;

 / / Bip, bip, bip, ...  News Flash!
 echo 'Newsflash: moda e fútbol combinan.  PHP_EOL;
 echo'======================================='.  PHP_EOL;
 addNewsStory $ asunto-> («moda e fútbol combinan ');
 echo PHP_EOL;

 / / Bip, bip, bip, ...  News Flash!
 echo 'Newsflash: música e política, o que vén despois? "  .  PHP_EOL;
 echo'=========================================='.  PHP_EOL;
 ("Música e política, o que vén despois?") AddNewsStory $ asunto->;
 echo PHP_EOL;

 / **
  * Fofoqueiro se cansa de novidades moi rapidamente e decidiron
  * Deixar de ouvir, a pesar de todas as novas interesantes hoxe!
  * /
 echo '- GossipObserver está aburrido e deixa o grupo!  .
      PHP_EOL.  PHP_EOL;
 removeObserver $ asunto-> ($ Gossip);

 / / Bip, bip, bip, ...  Flash News - Actualización dunha historia máis cedo!
 echo 'NewsUpdate: moda e fútbol combinan di.
      "Goberno".  PHP_EOL;
 echo'================================================ .
      '========='.  PHP_EOL;
 addNewsStory $ asunto-> («moda e fútbol combinan.
                         'Di que o goberno');
 echo PHP_EOL;

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

';

}

3 Responses to "Patróns de deseño PHP - O nivel Observer"

  1. Voto di:

    Ola,
    En primeiro lugar, o meu inglés é moi pobre, entón
    Me pode dicir cal é o sistema na foto?
    Fedora 12?
    Cara a un tema?

  2. Voto di:

    Ola,
    Me pode dicir cal é o sistema na foto?
    Fedora 12?
    Cara a un tema?

Deixe unha resposta













Panorama Tema por Themocracy

11 convidados en liña agora
10 hóspedes, un bots, 0 membros
Max visitantes hoxe: 14 ás 07:34 UTC
Este mes: 26 en 2011/07/05 12:35 UTC
Este ano: 130 en 28-03-2011 22:40 UTC
Todas as horas: 130 en 28-03-2011 10:40 UTC