
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ón | Descripción |
Factoría (Factory) | Abstrae clientes de la instanciación de objetos de una librería. |
Observer | Desacopla el sujeto de los observadores para notificar su estado. |
Singleton | Como tener una única instancia de una clase en memoria. |
Decorator | Añadir responsabilidades a un objeto de forma dinámica. |
Recursos básicos Java
Asunto | Descripción |
Tutorial básico y sintaxis | Tutorial 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 Lambda | Aquí te enseñamos las nociones más importantes para arrancas con funciones lambda |
Palíndromos | Programa de ejemplo para el uso de palíndromos en Java. |
Máquina Virtual de Java | Te explicamos el funcionamiento de la máquina virtual de java (Java Virtual Machine – JVM) |
JDK, JRE y JVM | Diferencias entre el JDK, JRE y JVM. |
Mejores libros Java en Español | Hazte con los mejores libros Java para aprender paso a paso y profundizar en las mejores prácticas |
TensorFlow | Manejo del API de TensorFlow para la construcción de grafos de operaciones y su ejecución |
Tutorial Log4j | Tutorial para el manejo de Log4j, herramienta ágil y flexible para la gestión de Logs en Java |
Java Security | Entiende y aplica las posibilidades que da Java para mantener la seguridad |
Tutorial JConsole | Aprende los conceptos básicos de monitorización de procesos Java con JConsole |
JavaFX | Tutorial de JavaFX, librería gráfica moderna para construcción de GUIs en móvil, escritorio y web. |
Estructuras de datos en Java | Explicación y ejemplos de las estructuras de datos más importantes: listas, pila, cola, arbol. |
Javaapi | Conjunto de clases, interfaces, métodos y paquetes que forman parte de la plataforma Java estándar |
Algoritmo Huffman | Método eficiente para codificar datos, asignando códigos más cortos a los caracteres más frecuentes |