Compartir tecnología

Patrón de diseño: patrón de observador

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. La idea central del patrón de observador.

El patrón Observador también se conoce como patrón Publicar/Suscribir. GOF define el patrón de observador de la siguiente manera: define una relación de dependencia de uno a muchos entre objetos, lo que permite que varios objetos de observador se centren en el mismo objeto al mismo tiempo. Cuando el estado del objeto cambia, todos los objetos que dependen de él se vuelven. Notificado y actualizado automáticamente.
Como se muestra en la figura siguiente, el patrón del observador contiene 5 tipos de objetos.
Insertar descripción de la imagen aquí

  • Interfaz de destinoAsunto: La interfaz de destino define tres interfaces: agregar observador adjuntar (), eliminar observador separar () y notificar a los observadores notificar a Observadores (), y definir su propia función de operación operación ().
  • Clase de destino abstractaAbstractSubject: Esta clase define un vector de objetos de colección de observadores, que se utiliza para almacenar la lista de objetos de observadores agregados e implementa tres funciones para actualizar: agregar observador adjunto(), eliminar observador separador() y notificar a los observadores notificarObservadores() Esta lista también notifica a todos los objetos observadores para que se actualicen.
  • Clase objetivo específica MySubiect: Hereda de la clase de destino abstracta AbstractSubiect y escribe una función de operación específica para implementar la operación (). En esta función, se puede llamar a notifyObservers () para notificar a todos los observadores que se actualicen.
  • Interfaz de observador Observador: Defina una interfaz unificada update() para los objetos que deben ser notificados cuando cambia la clase de destino. Cuando se llama a notifyObservers(), se llamará a la función update() para actualizarse.
  • observador concreto : Se pueden definir varios objetos de observador, como Observer1 y Observer2, para escribir funciones de actualización unificadas. Client Test puede implementar el monitoreo agregando un observador a la clase Asunto.

Veamos la implementación específica.

(1) Interfaz de observador Observer.java define una interfaz de actualización unificada update(). Su código fuente se muestra en el siguiente programa.

package behavior.observer;


/**
* @author Minggg
* 观察者接口
*/
public interface Observer {

	public void update();
}

(2) La clase de implementación del observador Observer1.java es una implementación específica de un observador y su función de actualización se utiliza para enviar una cadena a la consola. Su código fuente se muestra en el siguiente programa.

package behavior.observer;


/**
* @author Minggg
* 具体观察者
*/
public class Observer1 implements Observer {

	public void update(){ 
		System.out.println("观察者1得到通知!");
	}
}

(3) La clase de implementación del observador Observer2.java es una implementación específica de otro observador y su función de actualización se utiliza para enviar una cadena a la consola. Su código fuente se muestra en el siguiente programa.

package behavior.observer;


/**
* @author Minggg
* 具体观察者
*/
public class Observer2 implements Observer {

	public void update(){ 
		System.out.println("观察者2得到通知!");
	}
}

(4) La interfaz observada Subject.java define tres funciones de interfaz para observadores operativos y define una interfaz de función operativa específica para representar sus propias funciones. Su código fuente se muestra en el siguiente programa.

package behavior.observer;


/**
* @author Minggg
* 被观察者接口
*/
public interface Subject {

	// 增加观察者
	public void attach(Observer observer);
	// 删除观察者
	public void detach(Observer observer);
	// 通知所有观察者
	public void notifyObservers();
	// 自身的操作接口
	public void operation();
}

(5) La clase abstracta observada AbstractSubject.java proporciona un vector de lista de vectores para guardar todos los objetos del observador y escribir funciones de implementación para operar los objetos de la lista. Su código fuente se muestra en el siguiente programa.

package behavior.observer;

import java.util.Enumeration;
import java.util.Vector;


/**
* @author Minggg
* 被观察者抽象类
*/
public abstract class AbstractSubject implements Subject {

	private Vector