/** * 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