Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Observer
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.
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.
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.