Enoncé
Sur le modèle des transparents 13 et 14 du cours7 construire des décorateurs qui décorent des objets de type Writer8 pour :
- mettre un texte, écrit dans un Writer, tout en majuscules quelle que soit la casse initiale; (
ToUpperCaseWriter
) - mettre la première lettre de chaque phrase en majuscule; (First
ToUpperCaseWriter
) - ne laisser qu'un espace entre les mots (enlever des espaces lorsqu'il y en a plusieurs entre deux mots consécutifs); (
OnlyOneSpaceWriter
) - centrer un texte sur une ligne d'une largeur donnée; (
CenteredWriter
) - coder un texte en appliquant le chiffre de Vigenère9. (
VigenereWriter
) Comment faire pour décoder ?
On veut avoir un décorateur pour chacun des cas énumérés ci-dessus.
On veut également pouvoir combiner deux décorateurs.
Code de base
Par exemple, le code suivant:
- class CodeDeBase {
- public static void main(String[] args) {
- try {
- Writer writer = new StringWriter();
- writer.write("je n'aime pas les majuscules. mais en français c'est obligatoire.");
- writer.close();
- System.out.println(writer);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
class CodeDeBase {
public static void main(String[] args) {
try {
Writer writer = new StringWriter();
writer.write("je n'aime pas les majuscules. mais en français c'est obligatoire.");
writer.close();
System.out.println(writer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
produit la sortie:
je n'aime pas les majuscules. mais en français c'est obligatoire.
Exemple 0
Avant de commencer, réaliser un décorateur trivial DummyWriter qui réalise le patron décorateur, sans ajouter de fonctionnalité de telle sorte que le code suivant:
- class Exemple1 {
- public static void main(String[] args) {
- try {
- Writer writer = new StringWriter();
- writer = new DummyWriter(writer);
- writer.write("je n'aime pas les majuscules. mais en français c'est obligatoire.");
- writer.close();
- System.out.println(writer);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
class Exemple1 {
public static void main(String[] args) {
try {
Writer writer = new StringWriter();
writer = new DummyWriter(writer);
writer.write("je n'aime pas les majuscules. mais en français c'est obligatoire.");
writer.close();
System.out.println(writer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
produise la sortie:
je n'aime pas les majuscules. mais en français c'est obligatoire.
Exemple 1
Si vous avez répondu à la première question, vous avez construit la classe ToUpperCaseWriter de telle sorte que le code suivant:
- class Exemple1 {
- public static void main(String[] args) {
- try {
- Writer writer = new StringWriter();
- writer = new ToUpperCaseWriter(writer);
- writer.write("je n'aime pas les majuscules. mais en français c'est obligatoire.");
- writer.close();
- System.out.println(writer);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
class Exemple1 {
public static void main(String[] args) {
try {
Writer writer = new StringWriter();
writer = new ToUpperCaseWriter(writer);
writer.write("je n'aime pas les majuscules. mais en français c'est obligatoire.");
writer.close();
System.out.println(writer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
produise la sortie:
JE N'AIME PAS LES MAJUSCULES. MAIS EN FRANÇAIS C'EST OBLIGATOIRE.
Exemple 2
Alors que le code suivant:
- class Exemple2 {
- public static void main(String[] args) {
- try {
- Writer writer = new StringWriter();
- writer = new FirstToUpperCaseWriter(writer);
- writer.write("je n'aime pas les majuscules. mais en français c'est obligatoire.");
- writer.close();
- System.out.println(writer);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
class Exemple2 {
public static void main(String[] args) {
try {
Writer writer = new StringWriter();
writer = new FirstToUpperCaseWriter(writer);
writer.write("je n'aime pas les majuscules. mais en français c'est obligatoire.");
writer.close();
System.out.println(writer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
produit la sortie suivante:
Je n'aime pas les majuscules. Mais en français c'est obligatoire.
Exemple 3
En combinant deux décorateurs de la façon suivante:
- class Exemple3 {
- public static void main(String[] args) {
- try {
- Writer writer = new StringWriter();
- writer = new FirstToUpperCaseWriter(writer);
- writer = new CenteredWriter(writer, 10);
- writer.write("je n'aime pas les majuscules. mais en français c'est obligatoire.");
- writer.close();
- System.out.println(writer);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
class Exemple3 {
public static void main(String[] args) {
try {
Writer writer = new StringWriter();
writer = new FirstToUpperCaseWriter(writer);
writer = new CenteredWriter(writer, 10);
writer.write("je n'aime pas les majuscules. mais en français c'est obligatoire.");
writer.close();
System.out.println(writer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
On obtient la sortie:
Je n'aime
pas les
majuscules
. Mais en
français
c'est
obligatoir
e.
Notes de bas de page
1 http://miageprojet2.unice.fr/User:FredericMallet/Patrons_de_conception/TP_-_Les_d%c3%a9corateurs#Enonc.c3.a9
2 http://miageprojet2.unice.fr/User:FredericMallet/Patrons_de_conception/TP_-_Les_d%c3%a9corateurs#Code_de_base
3 http://miageprojet2.unice.fr/User:FredericMallet/Patrons_de_conception/TP_-_Les_d%c3%a9corateurs#Exemple_0
4 http://miageprojet2.unice.fr/User:FredericMallet/Patrons_de_conception/TP_-_Les_d%c3%a9corateurs#Exemple_1
5 http://miageprojet2.unice.fr/User:FredericMallet/Patrons_de_conception/TP_-_Les_d%c3%a9corateurs#Exemple_2
6 http://miageprojet2.unice.fr/User:FredericMallet/Patrons_de_conception/TP_-_Les_d%c3%a9corateurs#Exemple_3
7 http://deptinfo.unice.fr/~fmallet/Patrons/01a_Decorateur.pdf
8 http://docs.oracle.com/javase/8/docs/api/java/io/Writer.html
9 https://fr.wikipedia.org/wiki/Chiffre_de_Vigen%C3%A8re