Licence Informatique 3éme année - Module Programmation Objet Avancé
Examen 2ème session - Mai 2010
Problème B. Le pattern State (8 points)
Le pattern State consiste à permettre à un objet de changer d'état de façon dynamique à l'exécution. L'objet représente un contexte (Context) et ses états possibles sont réalisés dans des classes concrètes d'état (ConcreteState), qui respectent toutes un modèle abstrait d'état (State).
On veut utiliser le pattern State pour écrire des classes permettant de gérer le pointeur de la souris dans une interface graphique. Le pointeur est représenté par une classe Cursor qui possède une méthode permettant de récupérer la forme du curseur pour l'afficher, et une méthode appelée lorsqu'un clic est effectué sur un composant :
public class Cursor {
public CursorShape getShape(){ … } public void clic(Component c){ … } }
On suppose que la classe CursorShape est déjà écrite, ainsi que ses sous-classes SelectCursorShape et ActionCursorShape. Le curseur peut prendre 2 états :
- l'état de sélection, où la forme du curseur est une instance de SelectCursorShape et où le clic sur un composant déclenche sa sélection (on suppose qu'il existe une méthode select() dans la classe Component).
- l'état d'action, où la forme du curseur est une instance de ActionCursorShape et où le clic sur un composant déclenche l'action correspondant à ce composant (on suppose qu'il existe une méthode action() dans la classe Component).
1) Ecrire les classes permettant de représenter les états du curseur. Compléter la classe Cursor pour que le programme fonctionne selon les spécifications.
2) On veut maintenant que l'action déclenchée par un clic sur un composant ne comporte pas forcément que l'appel à la méthode action(), mais puisse varier en fonction du contexte, par exemple en fonction du type de système d'exploitation sur lequel tourne l'application, du type de machine (ordinateur, téléphone, etc). Quel pattern utiliser et
pourquoi? Sans écrire le code des classes, dessiner un schéma UML qui montre comment cette fonctionnalité pourrait être ajoutée.