Method Factory, Factory, Abstract Factory
Exercice 1 - Factories en tout genre
Le but de cet exercice est de créer un petit programme permettant d'appliquer
une série de filtres à une série d'images.
Commencer par télécharger le
fichier td1convert.zip.
Puis importer-le dans le répertoire source de votre projet courant dans Eclipse.
Pour cela, importez l'archive dans Eclipse.
avec clic droit sur votre répertoire contenant les sources
sélectionnez "import" puis "archive file". Indiquez alors le fichier téléchargé.
Au besoin, faites un clic droit sur le paquetage importé, puis sélectionnez "refactor" pour donner un nom
qui correspond à l'arborescence voulue.
Voici un exemple de fichier (filter.txt) décrivant une succession de filtres
à appliquer sur une image :
gray
rotate
blur
Avec la ligne de commande suivante :
java Convert filter.txt image.gif
Le programme va appliquer l'ensemble des filtres décrit dans le fichier filter.txt
à l'image image.gif et ressortir le résulat sous forme d'une image PNG
nommée image.gif.png.
-
Pourquoi les constucteurs de Images et de ImageOps
sont déclarés private ?
-
Proposer une solution de conception permettant, sans changer les classes
existantes, de pouvoir appliquer indifféremment n'importe quel filtre
à une image.
Coder la solution proposée.
-
Utiliser le plugin Omondo pour visualiser le design que
vous venez de créer. Pour cela, sur la "vue explorer",
sur le paquetage concerné, utiliser le bouton droit puis
"Open UML" / "class diagram UML".
Dans la nouvelle fenêtre cochez "Inheritance", et valider.
Assurez vous que toutes les classes sont sélectionnées et validez.
Vous pouvez maintenant comparer la représentation UML avec le code Java.
-
Dans le but d'associer un filtre à une chaîne de caractères,
écrire une méthode createFilter(String name)
qui renvoie un filtre en fonction de son nom.
Dans quelle classe doit-on mettre cette méthode ?
Cette méthode doit-elle ou non être statique ?
Comment s'appel ce design pattern ?
-
Remarquer que les objets filtres sont indépendants de l'image
qu'il manipule. Il est donc possible de renvoyer plusieurs
fois le même filtre pour une même opération.
Changer votre code en correspondance.
-
Comment faire pour eviter les if .. else dans le
code de la méthode createFilter(String name) ?
Changer votre code en conséquence.
-
Ècrire le code qui prend en paramètre un fichier et
ressort sous forme d'une liste l'ensemble des filtres à appliquer,
vous utiliserez pour cela la classe java.util.Scanner.
-
On souhaite maintenant pouvoir choisir dans le code précédent
la façon dont les filtres sont implantés, que doit-on faire ?
Quel est le design pattern correspondant ?
Modifier votre code en conséquence.
-
Ècrire la classe Convert.
Exercice 2 - Chemin dans un système de fichier
Voici le code de la classe PathName
décrivant un chemin dans l'arborescence de fichier.
package fr.umlv.gl.td1.pathname;
public class PathName {
public PathName(PathName directory,String name) {
this.directory=directory;
this.name=name;
}
public PathName getDirectory() {
return directory;
}
public String getLocalName() {
return name;
}
public String getPathName() {
return directory.getPathName()+'/'+name;
}
private final PathName directory;
private final String name;
}
-
On souhaite ajouter un moyen de créer PathName qui
prend une chaine de caractère correspondant à un chemin
dans le système de fichier et qui découpe celui-ci en
PathName.
Comment doit-on faire ?
Rappel : pour extraire le dernier slash d"une chaîne de caractère,
on peut utiliser lastIndexOf.
-
On souhaite maintenant être indépendant de l'OS et donc
que cela marche pour Windows où le séparateur de fichier est '\'
pour Unix où le séparateur de fichier est '/'.
Utiliser pour savoir sur quel système le code est exécuté la
propriété système os.name et pour l'obtenir la méthode
System.getProperty().
Changer votre code pour être indépendant de l'OS.
-
On souhaite maintenant pouvoir gérer MacOS qui possède un double système
de fichier, cela doit marcher avec le séparateur '/' ou le séparateur ':'.
Changer votre architecture en introduisant une nouvelle classe
FileSystemTokenizer qui s'occupera de la gestion des séparateurs.
Quelles sont les méthodes de cette classe.
-
Comment garantir que l'on aura qu'un seul représentant de cet objet ?
Exercice 3 - Filtre avec argument
En reprenant l'exerice sur les filtres, on souhaite maintenant permettre
que les filtres puissent prendre des paramètres :
gray
rotate 1,5
blur
Attention, tous les changements effectués doivent premettre que les anciens fichiers
de filtrage continus à fonctionner.
-
Quelles parties du code précédent doit-on changer pour prendre en compte
le changement de la spécification du fichier des filtres ?
Attention, petit piège, il y a plusieurs parties qui changent !
-
Quel design-pattern doit-on utiliser pour que le parseur du fichier des filtres
délègue à chaque créateur de filtre le soin de lire les arguments du filtre
correspondant ?
-
Modéliser avec un diagramme de séquence les échange entre les différents
objet
Implanter ce design-pattern.
Rémi Forax - Université de Marne La Vallée