23 Patrones de diseño Capítulo 13: Patrón de observador de Java
Definición: Defina una dependencia de uno a muchos entre objetos, de modo que cuando cada objeto cambie su estado, todos los objetos que dependen de él serán notificados y actualizados automáticamente.
Tipo: Patrón de comportamiento
Diagrama de clases:
A menudo se necesita una necesidad en los sistemas de software: si el estado de un objeto cambia, algunos objetos relacionados con él también cambiarán en consecuencia.
Por ejemplo, queremos diseñar una función de menú de clic derecho. Mientras haga clic con el botón derecho en el área efectiva del software, aparecerá un menú;
Por ejemplo, necesitamos diseñar una función de implementación automática, al igual que cuando se desarrolla Eclipse, siempre que se modifique el archivo, Eclipse implementará automáticamente el archivo modificado en el servidor.
Existe una similitud entre estas dos funciones, es decir, un objeto siempre debe monitorear otro objeto, y mientras su estado cambie, tomará las acciones correspondientes. De hecho, hay muchas soluciones que pueden lograr esto, pero el uso del modelo Observer es, sin duda, una opción convencional.
La estructura del patrón del observador
En el modo Observador más básico, se incluyen los siguientes cuatro caracteres:
Observador: desde el diagrama de clases, puede ver que hay un contenedor vectorial en la clase que almacena el objeto Observador (la razón por la que usa Vector en lugar de List es porque hay muchos
Al enhebrar, el vector es seguro, mientras que la lista no es segura), este contenedor de vectores es el núcleo de la clase Observador, y hay otros tres métodos: el método de fijación es agregar un objeto Observer a este contenedor; El método de DETACH es eliminar el objeto Observador del contenedor; El método de notificación es llamar a los métodos correspondientes del objeto Observador a su vez. Este rol puede ser una interfaz, una clase abstracta o una clase concreta, porque en muchos casos se mezclará con otros patrones, por lo que hay más casos de uso de clases abstractas.
Observador: el rol del observador es generalmente una interfaz, que solo tiene un método de actualización. Cuando cambia el estado del observador, se llamará a este método.
Observador específico: este papel se usa para una fácil expansión, y se puede definir la lógica comercial específica en este rol.
Observador específico: la implementación específica de la interfaz Observador. En este rol, la lógica se procesará cuando cambia el estado del objeto que se observa.
Implementación del código de modo observador
sujeto de clase pública abstracta {Vector privado <Smanter> obs = new Vector <Sserver> (); public void addobServer (Observer Obs) {this.obs.add (OBS); } public void delobserver (Observer Obs) {this.obs.remove (OBS); } protegido void notifyObServer () {for (observador o: obs) {o.update (); }} public abstract void dosomething (); } Public Class ConcreteSubject extiende sujeto {public void dosomething () {System.out.println ("devuelto por el evento Observer"); this.notifyObServer (); }} Public Interface Observer {public void Update (); } Public Class ConcreteBServer1 implementa Observer {public void Update () {System.out.println ("Observer 1 recibe el mensaje y lo procesa"); }} clase pública ConcreteBServer2 implementa Observer {public void Update () {System.out.println ("Observer 2 recibe el mensaje y lo procesa"); }} Cliente de clase pública {public static void main (string [] args) {somet sub = new ConcreteSubject (); sub.AddoBServer (nuevo ConcreteBServer1 ()); // Agregar Observer1 sub.AddoBServer (nuevo ConcreteBServer2 ()); // Agregar Observer2 sub.Dosomething (); }} Resultados de ejecución
El evento Observador se invierte y el Observador 1 recibe la información y la procesa.
Observador 2 recibe la información y la procesa.
A través de los resultados en ejecución, podemos ver que solo llamamos al método del sujeto, pero los métodos relevantes de ambos observadores se llaman al mismo tiempo. Si miras el código con cuidado, en realidad es muy simple. No es más que solo cuando asocia la clase Observador en la clase de asunto y atraviesa el método de actualización del Observador en el método DoSomething.
Ventajas del modo observador
El observador y el observador están ligeramente relacionados y están acoplados de manera abstracta, por lo que es más fácil expandirse para ambos.
El modo Observador es un mecanismo de activación comúnmente utilizado, que forma una cadena de activación y procesa los métodos de cada observador a su vez. Pero al mismo tiempo, esto también es una desventaja del modo observador. Dado que se activa en una cadena, cuando hay muchos observadores, el problema de rendimiento es más preocupante. Además, en la estructura de la cadena, es más probable que ocurran errores de referencia circulares, lo que hace que el sistema sea falsificado.
Resumir
En el lenguaje Java, hay un observador de interfaz y su clase de implementación observable, lo que a menudo implementa el papel del observador. Podemos ver los métodos de uso de estas dos clases en la documentación de la API JDK.
Los amigos que han hecho VC ++, JavaScript DOM o AWT Development son sorprendentes sobre el procesamiento de su evento. Después de comprender el patrón del observador, tienen una cierta comprensión de los principios del mecanismo de procesamiento de eventos. Si desea diseñar una función de un mecanismo de procesamiento que active el evento, usar el modo Observador es una buena opción. El Event Processing DEM (modelo de eventos de delegación) en AWT se implementa utilizando el modo Observer.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.