PHP Design Patterns - patrón Observer
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 por el código es el patrón Observer . La definición formal del patrón Observer es la siguiente:
El patrón de observador (un subconjunto de la asíncrono 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, llamados observadores, 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.
Como los sistemas cada vez más débilmente acoplados asegurarse de que cuando un evento ocurre todos los sistemas que requieren el conocimiento de estos cambios son informados. Por ejemplo, una entrada del 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, los usuarios de correo electrónico suscrito, etc El patrón de 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 actualizaciones de observador, un generador de mapa, etc) en un tema (blog, es decir después de la edición del sistema) se puede permitir que el que para llevar a cabo todas las actualizaciones necesarias sin ningún cambio.
Antes de que el patrón Observer fue identificado el truco habitual sería actualizar el objeto de observar con una línea de código adicional para actualizar el sistema requiere, y la eliminación de la línea de código cuando sea necesario. Esto no permite fácilmente añadir y eliminar 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 implementación de una interfaz. Los observadores pueden añadir una retirarse a través de métodos en el objeto observable.
Que es básicamente la misma! Siempre encuentro un ejemplo para ser el mejor método de aprendizaje / conocimiento así 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 canales de noticias más pequeños. Aquí el sistema del atleta noticias toma el lugar del sujeto, observable, etc, mientras que los canales de noticias toman el papel de los observadores u oyentes.
Una vez inicializado observadores pueden conectarse y desconectarse a sí mismos de la materia como mejor les parezca. En mi ejemplo he creado tres observadores, estos análisis los titulares enviados por el sujeto y el 'grito' la noticia de si su adecuado. Los tres observadores se nombran a continuación junto con los términos que buscar al recibir titulares de noticias:
- Deporte Observador: 'rugby', 'fútbol', 'tenis'
- Observadores de noticias: "política", "finanzas", "gobierno"
- Observadores de chismes: "celebridad", "música", "moda"
Después de initalising el tema que añadir las noticias y chismes de los observadores y enviar una actualización de noticias. Después de esto el observador deporte se añade antes de que más noticias se envían. Por último, el observador chisme se retira antes de un titular de prensa final se envía.
Las tres clases diferentes observadores implementar la interfaz de observador, lo que les da un método claro de interfaz / a través del cual recibirá las actualizaciones. Siempre que implementar la interfaz de Observadores de que será capaz de adherirse a la reserva. Esto también se mantiene con el paradigma de la programación de 'programa para implementaciones de interfaces no ". La clase NewsAggregator se extiende la reserva clase abstracta, que nos proporciona los tres métodos públicos necesarios:
- updateObservers ()
- addObserver ()
- removeObserver ()
El código se puede ver corriendo aquí, patrón Observer en PHP ejecución , y el código se puede descargar desde aquí, patrón Observer en el código PHP .
Observadores de script
<? Php / ** * Este archivo contiene los observadores * * @ Autor Lloyd Watkin * @ Since 23/12/2009 * / Asunto clase abstracta { addObserver abstracta función pública (Observador observador $); removeObserver abstracta función pública (Observador observador $); abstracto updateObservers función pública ($ newsHeadline); } / ** * Esta es la clase de asunto para el ejemplo * * @ Autor Lloyd Watkin * @ Since 23/12/2009 * / ArticleAggregator clase extiende Asunto { / ** * Mantiene una lista de nuestros observadores * * @ Array var * / protected $ _observerList = array (); / ** * Método para añadir un observador * * @ Var $ Observador observador * @ Return vacío * / addObserver función pública (Observador $ observador) { $ This-> _observerList [] = $ observador; } / ** * Método para eliminar a un observador * * @ Var $ Observador observador * @ Return valor booleano * / 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 * @ Return vacío * / updateObservers función pública ($ newsHeadline) { foreach ($ this-> _observerList AS $ ob) { $ Ob-> actualizar ($ newsHeadline); } } / ** * Añadir una noticia nueva * * @ Var $ cadena historia * @ Return vacío * / addNewsStory función pública ($ story) { if (empty ($ story) | |! is_string ($ story)) { InvalidArgumentException lanzar nuevos ("espera una noticia! '); } $ This-> updateObservers ($ story); } }
Asunto / Observable script
<? Php / ** * Este archivo contiene el tema * * @ Autor Lloyd Watkin * @ Since 23/12/2009 * / Asunto clase abstracta { addObserver abstracta función pública (Observador observador $); removeObserver abstracta función pública (Observador observador $); abstracto updateObservers función pública ($ newsHeadline); } / ** * Esta es la clase de asunto para el ejemplo * * @ Autor Lloyd Watkin * @ Since 23/12/2009 * / ArticleAggregator clase extiende Asunto { / ** * Mantiene una lista de nuestros observadores * * @ Array var * / protected $ _observerList = array (); / ** * Método para añadir un observador * * @ Var $ Observador observador * @ Return vacío * / addObserver función pública (Observador $ observador) { $ This-> _observerList [] = $ observador; } / ** * Método para eliminar a un observador * * @ Var $ Observador observador * @ Return valor booleano * / 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 * @ Return vacío * / updateObservers función pública ($ newsHeadline) { foreach ($ this-> _observerList AS $ ob) { $ Ob-> actualizar ($ newsHeadline); } } / ** * Añadir una noticia nueva * * @ Var $ cadena historia * @ Return vacío * / addNewsStory función pública ($ story) { if (empty ($ story) | |! is_string ($ story)) { InvalidArgumentException lanzar nuevos ("espera una noticia! '); } $ This-> updateObservers ($ story); } }
Controlador de script
<? Php / ** * Diseño de Observadores de patrón de ejemplo * * @ Autor Lloyd Watkin * @ Since 23/12/2009 * @ Link http://www.evilprofessor.co.uk * / incluyen "observers.php; incluyen "subject.php; if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) { echo '; } / / ¿Qué estamos haciendo? "Ejemplo de Observadores de patrones en PHP" echo. PHP_EOL; echo'================================'. PHP_EOL; / / Configuración de nuestro tema $ Asunto = new ArticleAggregator (); echo '- ArticleAggregator creado ". PHP_EOL; / / Añadir algunos observadores $ Asunto-> addObserver (nuevo NewsObserver ()); $ Asunto-> addObserver ($ chismoso = new GossipObserver ()); echo '- Se ha añadido NewsObverser y GossipObserver. PHP_EOL. PHP_EOL; / / Beep, beep, beep ... Noticias al Instante! echo 'ÚLTIMA HORA: celebridades jugador de rugby ama de finanzas. PHP_EOL; echo'================================================ . PHP_EOL; $ Asunto-> addNewsStory ('celebrity jugador de rugby ama de finanzas); echo PHP_EOL; echo '- SportObserver ha descubierto y quiere unirse al grupo'; $ Asunto-> addObserver (nuevo SportObserver ()); echo PHP_EOL. PHP_EOL; / / Beep, beep, beep ... Noticias al Instante! "ÚLTIMA HORA: el gobierno mete la pata otra vez!" eco . PHP_EOL; echo'======================================='. PHP_EOL; $ Asunto-> addNewsStory ("se mete el gobierno otra vez! '); echo PHP_EOL; / / Beep, beep, beep ... Noticias al Instante! echo 'ÚLTIMA HORA: la moda y el fútbol se combinan ". PHP_EOL; echo'======================================='. PHP_EOL; $ Asunto-> addNewsStory ("la moda y combinar el fútbol '); echo PHP_EOL; / / Beep, beep, beep ... Noticias al Instante! echo 'ÚLTIMA HORA: la música y la política, ¿qué sigue? " . PHP_EOL; echo'=========================================='. PHP_EOL; $ Asunto-> addNewsStory ("la música y la política, ¿qué sigue? '); echo PHP_EOL; / ** * Los chismosos se cansan de las noticias con gran rapidez y han decidido * Dejar de escuchar, a pesar de todas las noticias interesantes hoy en día! * / echo '- GossipObserver se aburre y deja el grupo! " . PHP_EOL. PHP_EOL; $ Asunto-> removeObserver ($ chismoso); / / Beep, beep, beep ... News Flash - Actualización de una historia de antes! echo 'NewsUpdate: la moda y combinar el fútbol dice ". "Gobierno". PHP_EOL; echo'================================================ . '========='. PHP_EOL; $ Asunto-> addNewsStory ("la moda y el fútbol se combinan". 'Dice que el Gobierno "); echo PHP_EOL; if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) { echo ';
}


















































Hola,
En primer lugar, mi Inglés es muy pobre, entonces
¿Me puede decir cuál es el sistema en la foto?
Fedora 12?
¿Cuál es el tema?
Hola,
¿Me puede decir cuál es el sistema en la foto?
Fedora 12?
¿Cuál es el tema?
Su Fedora 11 con KDE aplicada. Glasslooks tema que yo creo.