Exercices dirigés NSY102


Bluej : Utilisation

Patrons Observateur et Commande


Le Pattern Observer (inspiré d'un énoncé d'examen de l'UV 16472 au Cnam/Paris 2004)

 

En se basant sur les deux interfaces suivantes

public interface Observer{
void update(Observable o, Object arg) ;
}

public interface Observable{
public void addObserver(Observer o);
public void deleteObserver(Observer o);
public void notifyObservers(Object arg);
public int countObservers();
}

QUESTION 1 : programmez une classe implémentant l'interface Observable

QUESTION 2 : programmez une classe " SimpleCompteur " qui soit " observable " et dont toute incrémentation de la valeur de son attribut " compteur " provoque la notification des observateurs.

QUESTION 3 : programmez au moins une classe qui implémente l'interface Observateur, chargée d'imprimer la nouvelle valeur de l'attribut " compteur " de la classe " SimpleCompteur " à chacune de ses modifications.

QUESTION 4 : Vous fournirez également un programme de test unitaire de l'ensemble avec au moins deux observateurs sur le compteur.


Le  Pattern Commande ( également inspiré d'un énoncé d'examen de l'UV 16472 au Cnam/Paris 2004)

Le langage java ne permet pas de passer une procédure en paramètre ou de l'affecter à une variable pour réaliser l'équivalent d'un 'callback'. Pour affecter à différentes structures de commande des fonctions différentes on peut utiliser le pattern dit 'pattern Command'. L'interface ci-dessous

public interface Command {
        public abstract void execute ( );
}

peut donc être implémenté par des classes concrètes, la méthode execute étant spécialisée en conséquence. Différents objets de CommandeConcrète peuvent alors être affectés à des Boutons ou des interrupteurs conçus pour recevoir des commandes et en lancer l'exécution. Dans l'exemple ci-dessous on souhaite piloter indifféremment à partir d'un interrupteur général, un ventilateur ou un 'spot' lumineux par exemple.

class Ventilo {
        public void start () {
                System.out.println("Ventilo is rotating");
        }
        public void stop () {
                System.out.println("Ventilo is not rotating");
        }
}



class Spot {
        public void turnOn( ) {
                System.out.println("Spot est allumé ");
        }
        public void turnOff( ) {
                System.out.println("Spot est éteint");
        }
}
class Interrupteur {
        private // à compléter
        public Interrupteur( // à compléter) {
                // à compléter
        }
        void flipUp( ) { 
                        // à compléter

        }
        void flipDown( ) {
                        // à compléter
        }
}

QUESTION : On demande de programmer les différentes classes de commandes concrètes représentées sur la diagramme UML ci-dessus Ainsi que le test qui déclare et pilote deux interrupteurs associés respectivement à un spot et à un ventilateur.