Vous êtes sur la page 1sur 5

ETS – Département de Génie Logiciel et TI Cours : LOG120 Automne 2010 Groupe 01 – Prof : Abdelouahed Gherbi Exercices pour la séance de cours 07

Exercice 01

On veut concevoir et implémenter en java une application qui permet d’afficher et d’évaluer des expressions booléennes simples. Ces expressions peuvent être

La constantes T (pour true)

La constante F (pour false)

Le cas générale une expression booléenne binaire de la forme Exp1 op Exp2 où op est l’un des opérateurs booléens AND, OR ou XOR.

Les expressions non constantes doivent être affichées avec des parenthèses

1. Identifier et utiliser un patron de conception convenable pour ce problème

2. Donne un diagramme de classes UML correspondant à ce patron pour le problème

3. Dresser un tableau montrant la correspondance entre les éléments de la structure générale du patron avec les éléments de cette situation

4. Proposer une implémentation en Java de cette conception

Solution :

1.

Le patron convenable pour cette situation est le patron Composite car une expression (ayant le

comportement afficher et evaluer) est elle-même composée d’expression ayant ce même comportement. Les objets primitifs sont les expressions de base qui sont les deux constantes booléennes True et False.

2.

<<Interface>> IBoolExp 2 +afficher() +evaluer() {abstract} ConstBool BinaryBoolExpr +afficher()
<<Interface>>
IBoolExp
2
+afficher()
+evaluer()
{abstract}
ConstBool
BinaryBoolExpr
+afficher()
BinaryBoolExpr()
+evaluer()
AndExpr
OrExpr
XorExpr
+afficher()
+afficher()
+afficher()
+evaluer()
+evaluer()
+evaluer()

3.

Nom dans le patron de conception

Nom réel

Primitive

IBoolExp

Composite

AndExpr, OrExpr et XorExpr

Leaf

ConstBool

Method()

afficher() et evaluer()

4.

Voir code dans le projet Eclipse disponible au site Web du cours.

Exercice 02 On peut donner un titre à une bordure en utilisant la classe TitleBorder comme dans l’exemple suivant :

JPanel panel = new JPanel();

Panel.setBorder(new TitleBorder(new EtchedBorder(), “Sélectioner une option”); // (1)

Les classes TitleBorder et EtchedBorder sont définies dans le package javax.swing.border.

Les deux classes implémentent l’interface Border définie dans le même package. L’interface Border définie la méthode paintBorder() La méthode setBorder() est définie dans la classe JCompnent : void

setBorder(Border border)

a. Quel est le patron de conception mis en œuvre dans le code (1).

b. Dessiner le diagramme de classes UML représentant le patron dans cette situation

c. Dresser un tableau montrant la correspondance entre les éléments de la structure générale du patron avec les éléments de cette situation

Solution :

a. Le patron utilisé dans le code (1) est patron décorateur. La classe EtchedBorder qui
a.
Le patron utilisé dans le code (1) est patron décorateur. La classe EtchedBorder qui implémente
l’interface Border est décoré par la classe TitleBorder pour permettre d’assigner un titre à la
bordure (deuxième paramètre du constructeur de TitleBorder
b.
d.

Nom dans le patron

Nom réel (dans la situation)

Component

Border

ConcreteComponent

EtchedBorder

Decorator

TitleBorder

Method()

paintBorder()

Exercice 03 On considère les classes abstraites Writer et Reader définies dans la package java.io. Ces deux classes permettant (entre autres) d’écrire (respectivement lire) un tableau de caractères utilisant les méthodes :

void write(char[] cbuf, int off, int len); int read(char[] cbuf, int off, int len);

On veut étendre la fonctionnalité de ces deux classes pour encrypter (respectivement décrypter) les caractères écrites par Writer (respectivement lus par Reader).

a. Quel est le patron de conception qui convient à cette solution

b. Dessiner le diagramme de classes UML correspondant.

c.

Écrire le code des deux classes EncryptingWriter et DecyptingReader utilisant la méthode de chiffrement de Caesar

Solution :

a.

b.

Le patron de conception convenable pour cette situation est le patron Décorateur car les classe EncryptingWriter et DecryptingReader ajoutent une fonctionalité respectivement aux classes Writer et Reader tout en préservant le comportement de ces classes

{abstract} Reader 1 +read() FileReader DecryptingReader +read() +read()
{abstract}
Reader
1
+read()
FileReader
DecryptingReader
+read()
+read()
{abstract} Writer 1 +write() FileWriter DecryptingWriter +write() +write()
{abstract}
Writer
1
+write()
FileWriter
DecryptingWriter
+write()
+write()

c.

Voir le code dans le projet Eclipse disponible dans le site Web du cours

Exercice 04 On veut améliorer cette conception de l’exercice 03 afin de pouvoir varier les algorithmes de cryptage et décryptage.

a. Quel patron de conception il faut utiliser?

b. Dessiner le diagramme de classes UML correspondant

c. Réécrire le code en conséquence.

Solution :

a. Le patron de conception convenable pour cette situation est le patron Stratégie

b. Les classes diagramme UML sont comme suit :

Stratégie b. Les classes diagramme UML sont comme suit : c. Voir le code dans le

Exercice 05 On considère le code suivant de la classe MessageQueue implémentant une file FIFO Concevoir une classe de test unitaire utilisant le framework JUnit pour la classe MessageQueue

public class MessageQueue

{

 

private Message[] elements; private int head; private int tail; private int count; public MessageQueue(int capacity)

{

elements = new Message[capacity]; count = 0; head = 0; tail = 0;

}

public Message remove()

{

Message r = elements[head]; head = (head + 1) % elements.length; count--; return r;

}

public void add(Message aMessage)

{

elements[tail] = aMessage; tail = (tail + 1) % elements.length; count++;

}

public int size()

{

return count;

}

public boolean isFull()

{

return count == elements.length;

}

public Message peek()

{

return elements[head];

}

}

public class Message {

private String text;

public Message(String messageText){

text = messageText;

}

public String getText(){

}

return text;

}

Solution:

Voir le code dans le projet Eclipse disponible dans le site Web du cours