Design Patterns et Utilisation de l`API Java
Transcription
Design Patterns et Utilisation de l`API Java
Programmation Orientée Objet, Pierre Parrend Programmation Orientée Objet IUT Lumière, DUT STID 2 2007-2008 Pierre Parrend TD4 – Design Pattern, Utilisation de l'API Java Notions • Design Patterns Le Singleton Représentation en UML: private static private Coder un Singleton private static FichierClient fichierClientSingleton; public class FichierClient { private FichierClient() { System.out.println("Nouveau fichier client cree"); } public static FichierClient getFichierClient() { if(fichierClientSingleton==null) { fichierClientSingleton=new FichierClient(); } return fichierClientSingleton; } } IUT Lumière, DUT STID 2 2007-2008 Programmation Orientée Objet, Pierre Parrend La Façade Le Design Pattern Façade consiste à avoir une classe comme point d'entrée unique d'une partie d'une programme. C'est le rôle joué par la Classe 'FichierClient' dans ce TP (cf. représentation UML ci-dessous). Le Design Pattern Usine (Factory) Le Design Pattern Usine (Factory) consiste à utiliser une classe de génération d'objets, en fonction du contexte. Par exemple, dans ce TP, un client sera créé par la classe 'Enfant' s'il a moins de 18 ans, et Adulte s'il a entre 18 et 64 ans, de manière transparente pour la classe qui initie la création (FichierClient). C'est le rôle joué par la Classe 'ClientFactory' dans ce TP (cf. représentation UML ci-dessous). Le Design Pattern Inversion de Contrôle Le Design Pattern Inversion de Contrôle consiste à permettre à un objet de rétro-agir sur l'objet qui l'a créé. Représentation UML: Coder l'inversion de Contrôle: package ioc; public class Master { public void sayHello(){System.out.println("Hello");} public static void main(String[] args){ Slave esclave=new Slave(new Master()); esclave.callBack(); } } class Slave { private Master monMaitre; public Slave(Master monMaitre){this.monMaitre=monMaitre;} public void callBack(){monMaitre.sayHello();} } IUT Lumière, DUT STID 2 2007-2008 Programmation Orientée Objet, Pierre Parrend • Eléments de Java Les Exceptions En cas d'erreur, une exception est levée. Il est nécessaire de l''attraper' (catch), pour la traiter, et de la transmettre explicitement dans les signatures de méthodes. public void ouvrirFichier() throws IOException { FileOutputStream fos = new FileOutputStream(«nomFichier»); } try { this.ouvrirFichier(); } catch(IOException ioe) { ioe.printStackTrace(); } La Classe Calendar attributs publics utiles: static int DAY_OF_MONTH //reference du champs 'jour du mois' static int MONTH //reference du champs 'mois' static int YEAR //reference du champs 'année' méthodes utiles: static Calendar getInstance()//retourne une instance de la classe Calendar int get (int champ) //retourne la valeur d'un champ donné du calendrier void set(int annee, int mois, int date)//fixe l'année, le mois, le jour pour l'instance courante du calendrier Obtenir la date courante Calendar now=Calendar.getInstance(); int year=now.get(Calendar.YEAR); System.out.println("current year: "+year); Créer une date spécifique Calendar then=Calendar.getInstance(); then.set(2005,8,30); int otherYear=then.get(Calendar.YEAR); System.out.println("Other year: "+otherYear); IUT Lumière, DUT STID 2 2007-2008 Programmation Orientée Objet, Pierre Parrend La Classe Vector méthodes utiles: boolean add(Object o);//ajoute un élement au vecteur Object get(int index);//renvoie l'objet d'index i int size();//renvoie le nombre d'objet dans le vecteur • Enregistrer des données dans un fichier La Classe FileOutputStream Méthodes utiles: void close() //ferme le fluw de données void flush() //force l'écriture des données du flux void write(byte[] b) //ecrit les données du tableau d'octets(byte) b Ecrire 'Bonjour' dans le fichier 'texte.txt' FileOutputStream fos=new FileOutputStream(«texte.txt»); fos.write(«Bonjour».getBytes()); fos.flush(); fos.close(); Exercice 1 – Gestion d'une base de client Coder l'application suivante, suivante les différentes étapes indiquées au cahier des charges. • Etape 1 Créer une classe Scenario, qui contienne une méthode 'main'. Dans cette méthode, un objet 'FichierClient' est créé. La classe FichierClient est contenue dans le package 'gestionclient.fichierclient'. C'est un singleton (cf. section 'Notion'). IUT Lumière, DUT STID 2 2007-2008 Programmation Orientée Objet, Pierre Parrend • Etape 2 Implémenter le Design Pattern 'Façade'. Dans cette première version, vous créerez des objets de type 'Client' (dans le package 'gestionclient.fichierclient'.). La classe Client est spécifiée comme suit: – le constructeur prend le nom, l'age et l'identifiant du client en paramètre – une réduction par défault est initialisée dans le constructeur de la classe: 2%. – afficheProprietes ecrit à l'écran les propriétés suivantes: identifiant, nom, reduction. La Classe FichierClient joue un rôle de Design Pattern 'Facade' vis-à-vis des opérations de management des clients. Implémenter les méthodes suivantes: – 'addClient(String nom, int age)', qui ajoute un client au vecteur 'clients'. Une variable globale 'idClientMax' permet de conserver l'identifiant maximal utilisé pour les clients. Elle est initialisée à '0', et incrémentée avant chaque création d'un nouveau client. – listerClient(), qui affiche les propriétés de chaque client, par appel à la méthode 'afficheProprietes()' de la classe Client. Enrichir le scénario en créant les clients suivants: – 2 adultes (age entre 18 et 64 ans inclus), – 2 enfants (moins de 18 ans) – 2 seniors (65 ans et plus) • Etape 3 Implémenter le Design Pattern 'Usine'. IUT Lumière, DUT STID 2 2007-2008 Programmation Orientée Objet, Pierre Parrend Modification: la classe Client ne doit pas être accessible directement par la Classe FichierClient. Effectuer les opérations suivantes: – Client doit être une classe abstraite, et non une classe concrête. – Compiler le code avec cette modification. Qu'observe-t-on ? Dans le package 'gestionclient.fichierclient.clientele', écrire les classes suivantes, qui héritent de Client (et qui ont donc les même paramètres): – Enfant – un enfant a par défaut 5 % de réduction – Adulte, - un adulte a par défaut 2 % de réduction, soit la valeur indiquée dans la Classe Mère Client – Senior – un Senior a par défaut 10 % de réduction. Les objets sont initialisés dans le constructeur par l'appel à 'super();'. Dans chacune des classes du package 'clientele', pensez à importer la Classe 'Client'. Ecrire un classe ClientFactory, qui ait les caractéristiques suivantes: – elle comprend une méthode static 'getClient', qui prend en paramètre le nom, l'âge et l'identifiant du client. – Les clients sont créés de la façon suivante: – si l'age est inférieur à 18 ans, créer un Objet de type 'Enfant', – si l'age est compris entre 18 et 64 ans, créer un objet de type 'Adulte' – si l'age est supérieur ou égal à 64 ans, créer un objet de type 'Senior'; Pensez ) importer les classes 'Enfant', 'Adulte' et 'Senior'. Modifier le code de 'FichierClient' pour prendre en compte ces modifications. • Etape 4 Modification de programme Modifier votre programme pour pouvoir prendre en compte la carte Vermeil pour les seniors: – ajouter dans la classe 'Senior' une methode 'addCarteVermeil()', qui ajoute 5% à la réduction existante, – Modifier la Classe FichierClient pour que la méthode 'addClient' renvoie un objet de type Client, et non plus 'void', – ajouter dans le scénario une carte vermeil pour le deuxième senior créé. • Etape 5 Implémenter le Design Pattern 'Inversion du Contrôle' Le Design Pattern 'Inversion du Contrôle' est utilisé dans le contexte suivant: l'ajout d'enfants peut avoir lieu directement par le biais de la classe Adulte, sans passer par la 'ClientFactory'. Ajouter les éléments suivants au programme: – le constructeur de la Classe Adulte prend en paramètre additionel un objet de type 'FichierClient', qu'il stocke comme variable globale. – Par conséquent, la méthode 'ClientFactory.getClient' doit prendre en paramètre un objet de type 'FichierClient' IUT Lumière, DUT STID 2 2007-2008 Programmation Orientée Objet, Pierre Parrend – – • méthode 'addEnfant', dans la classe Adulte: – les paramètres sont le nom (de type String) et la date de naissance (de type Calendar) de l'enfant, – le nombre d'enfant est incrémenté, – l'age de l'enfant est calculé à partir de sa date de naissance et de la date courante (classe Calendrier – voir la section 'Notions') le scénario est étendu en conséquence: – un enfant, né le 30.08 2005, est ajouté par le biais du deuxième adulte dans la classe 'Scenario'. Etape 6 En plus de l'affichage des réductions à l'écran, effectuer l'enregistrement des données dans un fichier 'clients.txt'. – ajouter une méthode 'getProprietes()' sur la classe Client, qui renvoie le même message que la méthode actuelle 'afficheProprietes'. – enregister les messages dans le fichier à l'aide d'un 'FileOutputStream' – sauter une ligne entre chaque message a – ne pas oublier de fermer correctement le fichier (appel aux méthodes flush() et close()). IUT Lumière, DUT STID 2 2007-2008