Exercices dirigés NFP121
Les Patrons Adaptateur et Proxy
Ce qui est fourni, la classe Buffer, une gestion de type FIFO
Ce qui est demandé : une implémentation d'interface FileEntiersI
L'interface CollectionI et la classe Buffer sont fournies
public interface CollectionI{ public void put(int i) throws FullException; public int get() throws EmptyException; public boolean full(); public boolean empty(); public int size(); public int capacity(); }
public class Buffer implements CollectionI{ private int[] data; private int in,out; private int capacity; private int size; public Buffer(int capacity){ this.capacity = capacity; this.data = new int[capacity]; } public void put(int i) throws BufferFullException{ if(full()) throw new BufferFullException(); data[in] = i; in = (in+1)%capacity; size++; } public int get() throws BufferEmptyException{ if(empty()) throw new BufferEmptyException(); int value = data[out]; out = (out+1)%capacity; size--; return value; } public boolean empty(){ return size==0; } public boolean full(){ return size==capacity; } public int size(){ return size;} public int capacity(){ return capacity;} }
QUESTION 1 : Proposez une classe de tests unitaires BufferTest
Soit l'intertface FileEntiersI ci-dessous
public interface FileEntiersI { //opérations public void enfiler(int i) throws FilePleineException; public int defiler() throws FileVideException; // interrogations public int taille(); public int capacite(); public boolean estVide(); public boolean estPleine(); }
QUESTION 2 : Proposez une implémentation de l'interface FileEntiersI, en utilisant le patron Adaptateur.
source:
http://jfod.cnam.fr/NFP121/supports/extras_designpatternscard.pdf
http://www.mcdonaldland.info/files/designpatterns/designpatternscard.pdf
Votre implémentation doit passer tous les tests de la classe TestFileEntier ci-dessous
public class TestFileEntier extends junit.framework.TestCase{ public void testFileStandard(){ FileEntiersI file = new Adaptateur(new Buffer(6)); assertTrue(file.estVide()); assertFalse(file.estPleine()); int taille = 0; for(int i = 1; i<=6; i++){ try{ file.enfiler(i); taille++; assertEquals(taille, file.taille()); assertFalse(file.estVide()); }catch(Exception e){ fail("aucune exception n'est attendue ici !!"); } } assertEquals(taille, file.taille()); assertEquals(taille, file.taille()); assertTrue(file.estPleine()); try{ assertEquals(1, file.defiler()); assertEquals(2, file.defiler()); assertEquals(3, file.defiler()); assertEquals(taille-3, file.taille()); assertEquals(4, file.defiler()); assertEquals(5, file.defiler()); assertEquals(6, file.defiler()); assertEquals(taille-6, file.taille()); }catch(Exception e){ fail("aucune exception n'est attendue ici !!"); } } public void testBufferSimple(){ FileEntiersI file = new Adaptateur(new Buffer(6)); assertEquals(6,file.capacite()); assertEquals(0,file.taille()); assertTrue(file.estVide()); assertFalse(file.estPleine()); try{ file.enfiler(1); file.enfiler(2); file.enfiler(3); }catch(Exception e){ fail("aucune exception n'est attendue ici !!"); } assertFalse(file.estPleine()); try{ assertEquals(1, file.defiler()); assertEquals(2, file.defiler()); file.enfiler(55); assertEquals(3, file.defiler()); assertEquals(55, file.defiler()); assertTrue(file.estVide()); }catch(Exception e){ fail("aucune exception n'est attendue ici !!"); } } public void testBufferAvecExceptions(){ FileEntiersI file = new Adaptateur(new Buffer(3)); assertTrue(file.estVide()); assertFalse(file.estPleine()); for(int i = 1; i<=3; i++){ try{ file.enfiler(i); assertFalse(file.estVide()); }catch(Exception e){ fail("aucune exception n'est attendue ici !!"); } } try{ assertTrue(file.estPleine()); file.enfiler(55); fail("une exception est attendue ici !!"); }catch(Exception e){ assertTrue( e instanceof FilePleineException); } try{ file.defiler();file.defiler();file.defiler(); assertTrue(file.estVide()); int i = file.defiler(); fail("une exception est attendue ici !!"); }catch(Exception e){ assertTrue( e instanceof FileVideException); } } }
QUESTION 3 : Le patron Proxy
source: http://jfod.cnam.fr/NFP121/supports/extras_designpatternscard.pdf
Soit l'interface ServiceI
public interface ServiceI{ public String requete(String utilisateur, String url); }
On demande d'installer le patron Proxy/Procuration afin d'effectuer la
requête aux seuls utilisateurs agréés.
La liste des utilisateurs agréés est accessible depuis la classe
UtilisateursNFP121. (La liste est
constituée des prénoms
des inscrits à l'unité NFP121 de cette année)
import java.util.List; public abstract class Utilisateurs{ public abstract List<String> agrees(); }
Proposez la classe ServiceProxy et un exemple d'utilisation de ce mandataire, comme par exemple une classe de tests unitaires.
Post-liminaire :
Préparation du tp5, exécution et tests de l'applette de l'énoncéconsole> appletviewer http://jfod.cnam.fr/progAvancee/tp5/tp5.html
avec si nécessaire sous windows set PATH=D:\BlueJ-315\jdk\bin;%PATH%Depuis votre navigateur http://jfod.cnam.fr/progAvancee/tp5/tp5.html
/* Une idée...