/** * Design Pattern "Observer" * * Mesure de température

publicité
/**
* Design Pattern "Observer"
*
* Mesure de température
*
* @author Peter DAEHNE - HEG-Genève
*/
public class Mesure {
int noMesure;
double temp;
public Mesure
public String
/* N° de la mesure (devrait être une Date)*/
/* Température relevée */
(int noMesure, double temp) {this.noMesure = noMesure; this.temp = temp;}
toString () {return "N°" + noMesure + " / " + temp + "°C";}
} // Mesure
/**
* Design Pattern "Observer"
*
* Sujet concret de l'observation: un Thermomètre
*
* @author Peter DAEHNE - HEG-Genève
*/
public class Thermomètre extends Subject {
private Mesure mesure; /* La Mesure mémorisée par le sujet */
/* Constructeur */
public Thermomètre (Mesure mesure) {this.mesure = mesure;}
/* Retourne la Mesure de température mémorisée */
public Mesure getState () {return mesure;}
/* Affecte la Mesure de température avec m */
public void setState (Mesure m) {
mesure = m;
notifyObservers();
} // setState
} // Thermomètre
/**
* Design Pattern "Observer"
*
* Pur contrôleur - génère des relevés de température aléatoires
*
* @author Peter DAEHNE - HEG-Genève
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class StationMétéo extends JFrame {
private Thermomètre therm; /* Sujet affecté */
private int noMesure = 1; /* Numéro de la mesure */
private Random rnd = new Random(); /* Générateur aléatoire */
/* Création des composants de la fenêtre */
private void créerComposants () {
JButton btnMesurer = new JButton("Mesurer");
btnMesurer.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {interaction();}
});
getContentPane().add(btnMesurer, BorderLayout.CENTER);
pack();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
} // créerComposants
/* Une nouvelle mesure doit être effectuée */
private void interaction () {
Mesure m = new Mesure(noMesure++, ((int)(100 * ((rnd.nextDouble() * 40) - 20))) / 100.0);
therm.setState(m);
} // interaction
/* Constructeur */
public StationMétéo (Subject therm) {
super("Station météo");
créerComposants();
this.therm = (Thermomètre)therm;
} // Constructeur
} // StationMétéo
/**
* Design Pattern "Observer"
*
* Observateur concret - vue uniquement (représente la température maximale observée)
*
* @author Peter DAEHNE - HEG-Genève
*/
import java.awt.*;
import javax.swing.*;
public class VueMesureMax extends JFrame implements Observer {
private Mesure mesureMax = null;
private JTextField tfTempMax;
/* Création des composants de la fenêtre */
private void créerComposants () {
JLabel lblMax = new JLabel("Mesure maximale");
tfTempMax = new JTextField(10);
getContentPane().add(lblMax, BorderLayout.WEST);
getContentPane().add(tfTempMax, BorderLayout.EAST);
pack();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
} // créerComposants
/* Représente l'état observé: on mémorise la valeur maximale relevée */
private void represente (Mesure m) {
if (mesureMax == null) {
mesureMax = new Mesure(m.noMesure, m.temp);
tfTempMax.setText(mesureMax.toString());
return;
}
if (m.temp > mesureMax.temp) {
mesureMax.noMesure = m.noMesure;
mesureMax.temp = m.temp;
tfTempMax.setText(m.toString());
}
} // represente
/* Constructeur */
public VueMesureMax (Subject subject) {
super("Maximum observé");
créerComposants();
subject.addObserver(this);
} // Constructeur
/* Interface Observer */
public void update (Subject subject) {
represente(((Thermomètre)subject).getState());
} // update
public Mesure getMax () {return mesureMax;}
} // VueMesureMax
/**
* Design Pattern "Observer"
*
* Observateur concret - vue uniquement (représente la température observée)
*
* @author Peter DAEHNE - HEG-Genève
*/
public class VueMesure implements Observer {
/* Représente l'état observé */
private void represente (Mesure m) {
System.out.println("Mesure effectuée:" + m);
} // represente
/* Constructeur */
public VueMesure (Subject subject) {
subject.addObserver(this);
} // Constructeur
/* Interface Observer */
public void update (Subject subject) {
represente(((Thermomètre)subject).getState());
} // update
} // VueMesure
/**
* Design Pattern "Observer"
*
* Programme principal gérant une station météo
*
* @author Peter DAEHNE - HEG-Genève
*/
public class Principal {
public static void main (String[] args) {
Mesure mesure = new Mesure(0, 0);
Thermomètre therm = new Thermomètre(mesure);
StationMétéo sm = new StationMétéo(therm);
VueMesureMax vueMax = new VueMesureMax(therm);
VueMesure vue = new VueMesure(therm);
} // main
} // Principal
Téléchargement