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, queremos 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 de vectores en la clase que almacena el objeto Observer (la razón por la cual se usa Vector en lugar de la lista es porque cuando las operaciones de múltiples subprocesos, el vector es seguro, mientras que la lista no es segura). Este contenedor vectorial es el núcleo de la clase Observador. Hay otros tres métodos: el método de adjunta es agregar el objeto Observador 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.
Ejemplo de implementación del modo observador
Interfaz de sujeto
sujeto de interfaz pública {public void registroBServer (observador o); Vacío público RemoLoBServer (Observador O); public void notifyAllObServers ();}Interfaz de observador
Public Interface Observer {Public void Update (Sujem s);}La clase Hunter implementa la interfaz de la asignatura
import java.util.arrayList; CLASE Public Class Headhunter Implementa sujeto {// Defina una lista de usuarios, como Mike, Bill, etc. Private ArrayList <Scerver> UserList; Private ArrayList <String> Jobs; Public HeadHunter () {userList = new ArrayList <Smanterver> (); Jobs = new ArrayList <String> (); } @Override public void RegistroBServer (observador o) {userList.Add (o); } @Override public void RemoLoBServer (Observer O) {} @Override public void notifyAllObServers () {for (Observer o: userList) {o.update (this); }} public void addJob (trabajo de cadena) {this.jobs.add (trabajo); notifyAlLObServers (); } public arrayList <String> getJobs () {return trabajos; } public String toString () {return Jobs.ToString (); }}JobSeeker es un observador:
Public Class JobSeeker implementa Observer {Nombre de cadena privada; Public Jobseeker (nombre de cadena) {this.name = name; } @Override public void Update (temas s) {System.out.println (this.name + "recibió notificado!"); // Imprima la lista de trabajos System.out.println (s); }}Empiece:
clase pública Main {public static void main (string [] args) {Headhunter hh = new Headhunter (); hh.RegisterObServer (nuevo JobSeeker ("Mike")); hh.RegisterObServer (nuevo Jobseeker ("Chris")); hh.RegisterObServer (nuevo Jobseeker ("Jeff")); // Cada vez que agrega un trabajo, todos los trabajos pueden ser notificados. hh.addjob ("Google Job"); hh.addjob ("Yahoo Job"); }} 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.