Sabloane de comportament



Sabloane de comportament



OBSERVER


  • Util cand diferite obiecte trebuie informate de aparitia unui eveniment;

  • Sablonul este utilizat frecvent in JFC (Swing) pentru tratarea evenimentelor, si foloseste ca suport clasa Observable si interfata  Observer;

  • Necesar mai ales cand exista mai multe modalitati de afisare a unor date si dorim ca modificarile ce apar in date sa se reflecte automat si in display-urile asociate;

  • In JFC clasa observata (Subiectul= clasa Observable) tine evidenta tuturor obiectelor ce trebuie informate de aparitia modificarilor (implementeaza metoda notifyObservers()), Observatorii contin o functie de actualizare update() (ex2).

Diagrama.






Exemple.


1.(J.Cooper)


Modurile de afisare sunt definite prin intermediul observatorilor ("Observers") si implementeaza interfata:


abstract interface Observer


Datele sunt referite drept "Subiect" si implementeaza:


abstract interface Subject



Fie un program al carui Subiect ("data repository") este reprezentat de fereastra:





implementata de codul urmator:


public class Watch2L extends Jframe

implements ActionListener, ItemListener, Subject


//se creaza doi observatori: unul care afiseaza culoarea si numele sau, si altul care adauga //culoarea intr-o lista:

//---------create observers---------

ColorFrame cframe = new ColorFrame(this);

ListFrame lframe = new ListFrame(this);



//la fiecare actionare a unui buton radio, se apeleaza metoda sendNotify a fiecarui Observator care //si-a inregistrat interesul fata de datele din Subiect:


public void itemStateChanged(ItemEvent e)


private void notifyObservers(JRadioButton rad)


Programul final arata astfel:




//Clasele ce definesc Observatorii


class ColorFrame extends Jframe  implements Observer



public void sendNotify(String s)


public void paint(Graphics g)



2. (B.Eckel)

Pe o grila sunt plasate patratele de diferite culori. Cand se selecteaza cu mouse-ul o patratica, toate casutele adiacente isi schimba culoarea in cea a casutei selectate.


//: observer:BoxObserver.java

// Demonstration of Observer pattern using

// Java's built-in observer classes.

package observer;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.util.*;


// You must inherit a new type of Observable:

class BoxObservable extends Observable



public class BoxObserver extends JFrame   

  public static void main(String[] args)



class OCBox extends JPanel implements Observer ;

  static Random rand = new Random();

  static final Color newColor()

  OCBox(int x, int y, Observable notifier)

  public void paintComponent(Graphics g)

  class ML extends MouseAdapter


  public void update(Observable o, Object arg)


  private final boolean nextTo(OCBox b)




Tema 4. (B. Eckel) Creati un sistem Observer minimal utilizand java.util.Timer in interiorul clasei Observable, pentru a genera evenimente ce sunt raportate catre Observers (clasele observator). Creati cativa observatori (folosind clase interioare anonime) si inregistrati-i cu Observable si aratati ca sunt apelati cand apar evenimentele de la Timer.