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

Afficher l'image d'origine

             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...