Está en la página 1de 14

OBSERVER

Propsito:
Definir una relacin de dependencia uno a muchos entre objetos de manera que cuando el estado de un objeto cambia, todos sus dependientes son notificados y actualizados automticamente.

Puede utilizarse para los siguientes casos:


Una instancia de una clase necesitar notificar a

otros objetos cuando cambia su estado.


Cuando un cambio en un objeto requiere cambios

en otros y no se sabe cuantos objetos deben ser cambiados. Cuando se tiene una relacin de dependencia de uno a muchos que puede requerir que un objeto notifique a mltiples objetos que dependen de l cuando cambia su estado.

Ventajas:
Su flexibilidad conlleva a que el objeto observable puede ser relativamente simple, sin que haya una cantidad sustancial de sobrecarga de codigo y es util para :
Realizacin de pruebas : Se puede codificar un observador que muestre el comportamiento del observable .

Desarrollo incremental : Es muy fcil aadir observadores adicionales conforme se vaya codificando.

Desventajas: El envo de notificaciones puede durar bastante tiempo si un objeto tiene un gran nmero de objetos a los que enviar notificaciones.

Las notificaciones del cambio de estado

del objeto observable se hace en general para todos los observadores sin dejarles la posibilidad de escoger que tipo de eventos son tiles para ellos y cuales no.

Estructura

Participantes
Subject: Conoce a sus observadores, que pueden ser de 0 a N, y Ofrece la posibilidad de aadir y eliminar observadores. Observer: Define la interfaz que sirve para notificar a los observadores los cambios realizados en el Subject.

ConcreteSubject: Almacena el estado que es objeto de inters de los observadores y enva un mensaje a sus observadores cuando su estado cambia
ConcreteObserver : Mantiene una referencia a un ConcreteSubject. Almacena el estado del Subject que le resulta de inters. Implementa la interfaz de actualizacin de Observer para mantener la consistencia entre los dos estados.

Ejemplo
interface Observer { // avisa a los observadores de que se ha producido un cambio public void sendNotify(String s); } interface Subject { // avisa al sujeto de tu inters public void registerInterest(Observer obs); }

public class MiBoton extends JButton implements Subject { Random r = new Random(); ArrayList observadores = new ArrayList(); Color c = Color.red; public MiBoton(String nombre) { super(nombre); setForeground(c); } public void cambiaColor() { c = new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)); for (int i=0;i<observadores.size();i++) { ((Observer)observadores.get(i)).sendNotify("cambio de color"); } } public Color getColor() { return c; } public void registerInterest(Observer obs) { observadores.add(obs); } }

class MiPanel extends JPanel implements Observer { MiBoton b = null; public MiPanel(MiBoton b) { super(); this.b = b; b.registerInterest(this); } public void sendNotify(String mensaje) { setBackground(b.getColor()); } }

public class MiFrame extends JFrame { public MiFrame() { final MiBoton b = new MiBoton("Pulsame ya"); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { b.cambiaColor(); } }); this.getContentPane().add(b); this.getContentPane().add(new MiPanel(b),BorderLayout.NORTH); this.getContentPane().add(new MiPanel(b),BorderLayout.SOUTH); this.getContentPane().add(new MiPanel(b),BorderLayout.EAST); this.getContentPane().add(new MiPanel(b),BorderLayout.WEST); setSize(500,400); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new B(); } }

Patrones Relacionados:
Adapter: El patrn Adapter puede ser utilizado para permitir a los objetos que no implementen el interface requerido participar en el patrn Observer para recibir notificaciones. Mediator: El patrn Mediator es utilizado algunas veces para coordinar cambios de estado inicializados por mltiples objetos a un objeto Observable.

También podría gustarte