Corbeille : 5/6 – Introduction aux design patterns
A- Le pattern state
Le Pattern State vous permet de créer une
interface souple de programmation pour des
machines d'état et autre. Après votre succès
auprès de la commune urbaine de douala, vous
venez d'être embauché par la commune de
Lemba pour mettre en place une machine à la
pointe de la technologie : un distributeur au-to-
ma-tique de billets !
« Vous devez réaliser le diagramme de classe et le code
java. »
1. On souhaite créer un distributeur de billets. Ce dernier peut être vu
comme une machine d'états avec trois états : pas de carte insérée, en
attente d'opération, et en attente de retirer des espèces. On pourra faire
quatre actions sur la machine : insérer une carte, entrer un code, retirer
des espèces, retirer la carte. Évidemment, selon l'état de la machine, les
actions auront différentes conséquences.
Voici un squelette du code de la machine :
La classe Carte est une classe avec un constructeur qui prend un code
secret, et une méthode qui répond si le code entré est bon.
Si le Client entre trois fois un mauvais code, sa carte doit être avalée.
Codez votre Distributeur.
La machine semble bien marcher, mais certains clients se plaignent. En
effet, certaines fois, la machine ne donne pas d'argent... Rapidement, les
ingénieurs de la machine comprennent que lorsque la machine n'a plus
Corbeille : 5/6 – Introduction aux design patterns
de billets, et ne peut pas donner d'argent. On doit donc rajouter un état à
la machine, qui sera l'état vide. Cependant, vous voyez bien que rajouter
un état change beaucoup de code et n'est donc pas très pratique.
Nous allons donc, avant de rajouter l'état vide, modifier les classes et
organiser mieux le projet.
2. Créez donc une interface (ou pourquoi pas une classe abstraite...) Etat
état qui contiendra les quatre méthodes de la machine (insérer la carte,
entrer code, retirer argent, reprendre carte). Créer trois classes Etat, une
par état possible de la machine et écrivez-y du code.
Le Distributeur devra posséder trois variables de classes (une par chaque
type d'état possible), plus une variable de classe de type Etat qui sera
son état courant. A chaque appel d'une méthode (insérer carte, ...), il
devra appeler la méthode sur son état courant. Ce sont les Etat qui
décideront de la marche à suivre. Cependant, le distributeur doit
posséder une méthode permettant de modifier son état courant.
Pour vous aider, voici le diagramme de classe que vous devriez obtenir.
Testez avec un Client que tout fonctionne.
Vous venez de mettre en place le Pattern State. L'objet n'est pas ses
états, mais possède ses états.
3. Ajoutez un état MachineVide pour empêcher de retirer de l'argent
quand la machine est vide. Vous allez donc ajoutez au Distributeur une
variable de classe permettant de connaître son stock d'argent, et vous
vérifierez, lorsque vous donnerez de l'argent à un Client, qu'il y a assez
d'espèces dans le Distributeur.
4. Ajoutez aussi une méthode lire_solde_compte, qui permettra au client
d'accéder à son solde lorsque le Distributeur est en mode
En_Attente_Pour_Retirer_Argent.
Réponse :
Corbeille : 5/6 – Introduction aux design patterns
B- Le pattern Observer
On souhaite gérer un arbre orienté dont les valeurs des nœuds sont
automatiquement mises à jour lorsqu’on modifie la valeur du nœud
racine. Chaque nœud est représenté par un triplet (nom, valeur,
coefficient) comme dans l’exemple suivant :
transmise par son nœud père, sa valeur devient valeur + v ∗
Chaque fois qu’un nœud (nom, valeur, coefficient) reçoit une valeur v
coefficient. Le nœud transmet alors sa nouvelle valeur à ses nœuds fils.
la valeur 1, la valeur de n0 devient 0 + 1 ∗ 2 = 2.
Par exemple, si le nœud racine de l’arbre précédent reçoit (de l’extérieur)
- la valeur de n1 devient 1 + 2 ∗ 1 = 3,
La nouvelle valeur de n0 est propagée à ses fils :
- la valeur de n2 devient 3 + 2 ∗ 4 = 11.
La propagation se poursuit de la même façon à partir des fils de n1 et n2
jusqu’au nœuds feuilles de l’arbre.
On dispose du diagramme de classes suivant :
Utiliser le design pattern Observateur pour compléter ce diagramme de
façon à pouvoir modéliser un arbre possédant un unique nœud racine et
Corbeille : 5/6 – Introduction aux design patterns
plusieurs nœuds fils comme dans l’exemple suivant (le nombre de fils est
en fait indéterminé) :
Distinguer deux types de nœuds : NoeudSujet qui transmet sa valeur à
ses fils et NoeudObservateur qui reçoit une valeur de son père.
Traduire le diagramme de classe UML en java en commençant par créer
et tester la classe Noeud.
Créer une classe TestObservateur qui modélise l’arbre présenté à la
question 1 de la partie UML.
Réponse :