Tp5 :le pattern prototype - design patterns - télécharger pd

Le Pattern Prototype

Vous venez d’être recruté en tant que responsable des effets spéciaux d’une grande boîte. Vous récupérez les effets spéciaux réalisés par votre prédécesseur, qui avait travaillé sur le film Le Seigneur des Anneaux. En exécutant le main, vous voyez une grandiose scène de bataille apparaître.

1. George Lucas vous contacte pour gérer les effets spéciaux du prochain Star Wars : l’histoire de Jar Jar Binks. Vous devrez intégrer une grande bataille épique. Récupérez le code et modifiez la fonction main pour afficher des vaisseaux de la guerre des étoiles.

2. L’objectif est de simplifier les modifications futures du main lors de l’ajout d’un nouveau projet. De plus, un problème se pose : René a accidentellement inséré un Xwing de Star Wars dans la scène de Le Seigneur des Anneaux (retravaillée pour l’édition BluRay). Peter Jackson et George Lucas sont en colère, il faut donc empêcher le main d’accéder aux détails des Soldier d’une scène.

Pour résoudre ce problème, implémentez le pattern Prototype en ajoutant à l’interface Soldier une méthode clone qui prend en paramètre un unique Soldier.

Le Pattern Composite : Un « LS » fait maison

Le pattern Composite permet de traiter un objet ou une de ses parties comme étant du même type. Il est souvent utilisé pour effectuer des opérations récursives sur un objet, comme la propagation d’une action.

Rappelez-vous comment vous aviez implémenté une calculatrice capable d’évaluer des expressions mathématiques comme (2+4)*5-6. Vous aviez utilisé un pattern composite où les feuilles et les nœuds de l’arbre étaient considérés comme des objets identiques.

Ici, le but est de créer une commande affichant le contenu d’un répertoire (fichiers et sous-dossiers) en utilisant les classes File de Java. Par exemple, pour un dossier « test » contenant « Dossier 1 » et « Dossier 2 » :

  • Dossier 1 contient « Sous-Dossier A », « Sous-Dossier B » et le fichier file1.
  • Dossier 2 contient « Sous-Dossier C », qui contient le fichier file2.

L’affichage souhaité ressemble à ceci :

-test
 |-Dossier 1
 | |-Sous-Dossier A
 | |-Sous-Dossier B
 | >file1 (26 octets)
 |-Dossier 2
 | |-Sous-Dossier C
 | >file2 (6 octets)

Pour ce faire, créez une classe abstraite FileComposite, dont hériteront Dossier et Fichier. Lors de la création du premier Dossier (correspondant au répertoire en cours), l’arbre des sous-dossiers doit être automatiquement construit via des appels récursifs. Implémentez ensuite une méthode print dans chaque classe pour afficher le contenu comme décrit.

Trouver le bon pattern pour résoudre un problème

Dans cet exercice, vous souhaitez modifier légèrement le comportement de la méthode write de FileOutputStream pour masquer les chiffres dans le flux de sortie et les remplacer par des étoiles.

1. Voici un exemple de code pour écrire du texte dans un fichier :

import java.io.*;

public class Test {
    public static void main(String[] argv) {
        String text1 = "Première Ligne";
        String text2 = "Seconde ligne 123";
        String text3 = "Troisième ligne 635";

        File fic = new File("monfichier.txt");
        try {
            OutputStream ostream = new FileOutputStream(fic);
            ostream.write(text1.getBytes());
            ostream.write(text2.getBytes());
            ostream.write(text3.getBytes());
        } catch(Exception e) {
            System.out.println("Problème pour ouvrir le fichier.");
        }
    }
}

2. Le client exige de ne pas modifier la méthode ostream.write, mais souhaite ajouter une fonctionnalité : masquer les chiffres et les remplacer par des étoiles. Il pourrait aussi vouloir ajouter d’autres fonctionnalités plus tard.

Comment ajouter des fonctionnalités à ostream.write sans altérer sa signature ?

Indice : La solution repose sur un pattern déjà vu. FileOutputStream hérite de OutputStream. Vous pouvez utiliser un filtre comme HideDigitFilter en enveloppant le flux d’origine :

OutputStream ostream = new HideDigitFilter(new FileOutputStream(fic));

Étudiez la classe FilterOutputStream pour comprendre comment implémenter ce filtre.

3. Ajoutez également une méthode pour convertir toutes les lettres en majuscules et une autre pour compter les caractères écrits en sortie. Testez si ces modifications fonctionnent en combinaison.

FAQ

Qu’est-ce que le pattern Prototype ?

Le pattern Prototype permet de créer des objets en copiant une instance existante, sans connaître les détails de sa classe. Cela simplifie la duplication d’objets complexes tout en préservant leur structure.

Comment implémenter le pattern Composite ?

Le pattern Composite repose sur une hiérarchie de classes où les composants (feuilles et nœuds) sont traités de manière uniforme. Utilisez une classe abstraite commune et implémentez une méthode récursive pour gérer les opérations.

À quoi sert le pattern Décorateur (ici utilisé comme filtre) ?

Le pattern Décorateur permet d’ajouter dynamiquement des responsabilités à un objet sans modifier sa classe. Il est idéal pour modifier le comportement d’un flux (comme OutputStream) sans altérer sa signature.

Cela peut vous intéresser :

Partagez vos remarques, questions , propositions d'amélioration ou d'autres cours à ajouter dans notre site

Enregistrer un commentaire (0)
Plus récente Plus ancienne