Saltar al contenido
Portada » Patrones de diseño: Observer

Patrones de diseño: Observer

Para entender el patrón de diseño observador (Observer) es necesario primero abordar los conceptos de objeto sujeto y objeto observador.

Esto puede entenderse fácilmente a partir de la analogía de la suscripción a una revista:

  • El editor de la revista (sujeto) es el negocio que publica las revistas (el dato).
  • Un ciudadano (observador) interesado en la revista puede suscribirse (registrarse).
  • Si te de-suscribes dejas de recibir nuevas ediciones.
  • El editor no sabe quien eres y como usas la revista, simplemente te la entrega por estar suscrito.

Definición formal

El patrón observer define una dependencia 1 a N entre objetos, de forma que cuando un objeto cambia su estado todas sus dependencias son notificadas y actualizadas automáticamente.

Habrá muchos objetos que actuan como observadores de un sujeto que es observado. Los observadores no tienen acceso al dato, es el sujeto el que notifica a los observadores la actualización.

El diagrama de clases queda como sigue:

Implementación en Java


import java.util.ArrayList;
import java.util.Iterator;


interface Sujeto
{
	public void registrarObservador(Observador o);
	public void desregistrarObservador(Observador o);
	public void notificarObservadores();
}

class DatosPartido implements Sujeto
{
	int goles;
	int faltas;

	ArrayList<Observador> listaObservadores;

	public DatosPartido () {
		listaObservadores = new ArrayList<Observador>();
	}

	@Override
	public void registrarObservador(Observador o) {
		listaObservadores.add(o);
	}

	@Override
	public void desregistrarObservador(Observador o) {
		listaObservadores.remove(listaObservadores.indexOf(o));
	}

	@Override
	public void notificarObservadores()
	{
		for (Iterator<Observador> it =
			observerList.iterator(); it.hasNext();)
		{
			Observador o = it.next();
			o.update(goles, faltas);
		}
	}

	private int obtenerUltimosGoles()
	{
		return 4;
	}

	private int obtenerUltimasFaltas()
	{
		return 2;
	}



	public void datosModificados()
	{
		goles= obtenerUltimosGoles();
		faltas = obtenerUltimasFaltas();

		notificarObservadores();
	}
}


interface Observador
{
	public void actualizar(int goles, int faltas);
}

class MostrarMedia implements Observador
{
	private float datoMedio;

	public void update(int goles, int faltas)
	{
		this.datoMedio =(float)goles/faltas;
		display();
	}

	public void display()
	{
		System.out.println("Media de goles y faltas: " +
						datoMedio);
	}
}

class MostrarDatosActuales implements Observador
{
	private int goles, faltas;

	public void update(int goles, int faltas)
	{
		this.goles = goles;
		this.faltas = faltas;
		display();
	}

	public void display()
	{
		System.out.println("Datos Actuales: "
						+ "Goles: " + goles +
						"\nFaltas:" + faltas );
	}
}


class Main
{
	public static void main(String args[])
	{

		MostrarMedia media = new MostrarMedia ();
		MostrarDatosActuales actuales= new MostrarDatosActuales ();


		DatosPartido datos = new DatosPartido ();


		datos.registrarObservador(media);
		datos.registrarObservador(actuales);

		datos.datosModificados();


		datos.desregistrarObservador(media );

		datos.datosModificados();
	}
}

Hazte con los mejores libros sobre patrones de diseño (design patterns)

Design Patterns: Elements of Reusable Object-Oriented Software – Erich Gamma

Patrones de diseño en Java. Los 23 modelos de diseño

Fácil Aprendizaje Patrones de Diseño Java


Más patrones de diseño

PatrónDescripción
Factoría (Factory)Abstrae clientes de la instanciación de objetos de una librería.
ObserverDesacopla el sujeto de los observadores para notificar su estado.
SingletonComo tener una única instancia de una clase en memoria.
DecoratorAñadir responsabilidades a un objeto de forma dinámica.

Recursos básicos Java

AsuntoDescripción
Tutorial básico y sintaxisTutorial básico Java y sintaxis. Aprende los fundamentos del lenguaje.
Hilos (Threads)Aprende a manejar hilos y las cuestiones básicas de la concurrencia
Funciones LambdaAquí te enseñamos las nociones más importantes para arrancas con funciones lambda
PalíndromosPrograma de ejemplo para el uso de palíndromos en Java.
Máquina Virtual de JavaTe explicamos el funcionamiento de la máquina virtual de java (Java Virtual Machine – JVM)
JDK, JRE y JVMDiferencias entre el JDK, JRE y JVM.
Mejores libros Java en EspañolHazte con los mejores libros Java para aprender paso a paso y profundizar en las mejores prácticas
TensorFlowManejo del API de TensorFlow para la construcción de grafos de operaciones y su ejecución
Tutorial Log4jTutorial para el manejo de Log4j, herramienta ágil y flexible para la gestión de Logs en Java
Java SecurityEntiende y aplica las posibilidades que da Java para mantener la seguridad
Tutorial JConsoleAprende los conceptos básicos de monitorización de procesos Java con JConsole
JavaFXTutorial de JavaFX, librería gráfica moderna para construcción de GUIs en móvil, escritorio y web.
Estructuras de datos en JavaExplicación y ejemplos de las estructuras de datos más importantes: listas, pila, cola, arbol.
JavaapiConjunto de clases, interfaces, métodos y paquetes que forman parte de la plataforma Java estándar
Algoritmo HuffmanMétodo eficiente para codificar datos, asignando códigos más cortos a los caracteres más frecuentes