Design Pattern: Decorator

Slides:



Advertisements
Présentations similaires
Spécialisation/généralisation Héritage Polymorphisme.
Advertisements

Spécialisation/généralisation Héritage Polymorphisme
Introspection et Réflexion Manipulation dynamique de code Java.
Introduction à la programmation objet Langage Java
(Classes prédéfinies – API Java)
F. Voisin : Introduction à Java 1 Introduction à Java - lhéritage - Frédéric VOISIN FIIFO - « Remise à Niveau »
Tarak Chaari, Stéphane Frénot, Frédérique Laforest, Frédéric Le-Mouël JAV1 JAV – TD 5 Lhéritage en Java.
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
Leçon 3 : Héritage IUP 2 Génie Informatique
Programmation orientée objet
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
Faculté I&C, Claude Petitpierre, André Maurer 1 Java.
Écouteurs de click d'une fenêtre
Langage Oriente Objet Cours 4.
COURS DE PROGRAMMATION ORIENTEE OBJET :
POO-L3 H. Fauconnier1 C) Méthodes: Redéfinition Un classe hérite des méthodes des classes ancêtres Elle peut ajouter de nouvelles méthodes Elle peut surcharger.
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java et les Exceptions Peter Van Roy Département dIngénierie Informatique,
Java Héritage, interfaces.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Classes abstraites et Interfaces
POO : Objets et classes (Rappels)
Le patron de conception « Strategy » Simon Durocher ( )
Langage Oriente Objet Cours 2.
Structures de données IFT-2000
Introduction à la programmation objet Langage Java
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Introduction au paradigme orienté-objet (suite)
P. Van Roy, LINF1251 LINF1251: Le Langage Java Peter Van Roy Département dIngénierie Informatique, UCL
POO-L3 H. Fauconnier1 Supplément gratuit…. POO-L3 H. Fauconnier2 Entrée-sortie public static void main(String[] args) { // sortie avec printf ou double.
Design Pattern Memento. Principe : Enregistrer les changements d'états d'un objet Objectif : Pouvoir restituer les états précédents d'un objet.
1 Les paquetages («packages»). 2 L'objectif avec les paquetages («packages») est de rendre accessibles aux utilisateurs des classes définies par d'autres.
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Chapitre III Héritage. POO-L3 H. Fauconnier2 Chapitre III: Héritage A) Extensions généralités Affectation et transtypage B) Méthodes Surcharge et signature.
Cours 4 Héritage (suite).
Cours 5 Héritage, Interfaces, classes internes. POO-L3 H. Fauconnier2 La classe Object Toutes les classes héritent de la classe Object Object méthodes:
COURS DE PROGRAMMATION ORIENTEE OBJET :
Héritage Lhéritage permet de spécialiser une classe en définissant une relation de type « est une sorte de ». #include comptebancaire.h class CompteEpargne.
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier.
Héritage et composition
Intention Séparer et extraire les traitements appliquées à différents type de nœuds d’une structure.
4 Introduction des objets. Les chaînes et tableaux
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
Copyright © SUPINFO. All rights reserved La Programmation Orientée Objet en C# 2.0.
Cours n°3 rappels. POO-L3 H. Fauconnier2 Entrée-sortie public static void main(String[] args) { // sortie avec printf ou double a = 5.6d ; double b =
Factory Design Patterns. Contents Factory patterns: principesFactory patterns: principes The Factory Method patternThe Factory Method pattern The Abstract.
11/04/ L'héritage Cours 7 Cours 7.
Cours 7 Classes locales Clonage Divers: tableaux.
© 2005 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java Peter Van Roy Département d’Ingénierie Informatique, UCL
Tutorat en bio-informatique
Constructeurs H Batatia. Variable statique Une variable statique est partagée par tous les objets d’une classe.
Un visiteur… …venu d’ailleurs
Les classes présenté par: RAHMOUNE RIME / ZEKRI SELMA.
Un peu de Design Pattern Quelques modèles pour développer vite et bien.
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Schéma de conception Factory Method Exemple Sylvain Giroux.
Le polymorphisme.
Cours du 5 novembre.
IUT du Limousin L.U.P Michel Vergnaud Programmation Objet - Java.
Héritage H. Batatia. plan Notion (que signifie l’héritage) Ecriture en java Héritage multiple (interdit) Instanciation (partie propre et partie héritée)
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Introduction à la programmation objet avec java
Héritage Conception par Objet et programmation Java
BlueJ_III 1 Java, les objets : tout de suite ! Interaction entre objets Notes de cours associées au chapitre 3 tutorial BlueJ
Introduction à l'orienté objet. Définition Le terme orienté objet siginifie que l'on organise le logiciel comme une collection d'objets organisée en graphe.
Transcription de la présentation:

Design Pattern: Decorator Vinoth Soundirarassou

Nécessité Comment peut-on ajouter une nouvelle fonctionnalité à une classe sans la modifier? En programmation objet : on utilise l’héritage. Problème: - Explosion du nombre de classe. - Héritage = mécanisme statique. Solution: Design pattern Decorator

Design pattern Decorator Quand l’utiliser? Pour des classes sujettes à évoluer fortement. Que fait-il? Ajout /modification dynamique de fonctionnalités. Etendre les fonctionnalités. Principe: Utilise à la fois l’ héritage et la composition. Exemple: Vente de desserts.

Diagramme UML

Exemple:vente de dessert Application: affiche le nom du dessert +prix Deux types de desserts: crêpes et gaufres Ingrédients: chocolat et chantilly Tarification: crêpe (1.50€),gaufre(1.80€) ajout chocolat: 0.20 € ajout chantilly : 0.50 € Problématique: Comment faire pour ajouter dynamiquement de nouveaux ingrédients?

Une solution via l’héritage

Solution basée sur Décorateur

Classe abstraite Dessert // Classe abstraite dessert. public abstract class Dessert {         private String libelle;// Libellé du dessert.         private double prix;// Prix du dessert.                 // Accesseurs en lecture pour le libellé et le prix.         Public String getLibelle()         {                 return libelle;         }         public double getPrix()         {                 return prix;         }                 // Accesseurs en écriture pour le libellé et le prix.         protected void setLibelle(String libelle)         {                 this.libelle = libelle;         }         protected void setPrix(double prix)         {                 this.prix = prix;         }                 // Méthode utilisée pour l'affichage d'un dessert.         public String toString()         {                 NumberFormat format=NumberFormat.getInstance();                 format.setMinimumFractionDigits(2);// 2 chiffres après la virgule suffisent pour l'affichage.                 return getLibelle()+" : "+format.format(getPrix())+"€";         } }

Gaufre,Crepe,DecorateurIngredient // Classe gaufre qui hérite de dessert public class Gaufre extends Dessert {         // Constructeur qui intialise le libellé et le prix.         public Gaufre()         {                 setLibelle("Gaufre");                 setPrix(1.80);         } } // Classe crêpe qui hérite de dessert. public class Crepe extends Dessert {         // Constructeur qui initialise le libellé et le prix.         public Crepe()         {                 setLibelle("Crêpe");                 setPrix(1.50);         } } // Classe abstraite decorateurIngredient qui hérite de dessert. public abstract class DecorateurIngredient extends Dessert {         protected Dessert dessert;// Dessert sur leuquel on applique l'ingrédient.                 // On oblige les ingrédients à implémenter la méthode getLibelle().         public abstract String getLibelle();         // On oblige les ingrédients à implémenter la méthode getPrix().         public abstract double getPrix(); }

Chantilly/Chocolat //Classe chantily qui hérite de decorateurIngredient et donc indirectement de dessert. public class Chantilly extends DecorateurIngredient {         // Constructeur qui prend en paramètre le dessert.         public Chantilly(Dessert d)         {                 dessert = d;         }                 // On affiche le libellé du dessert et on rajoute le libellé de l'ingrédient chantilly.         public String getLibelle()         {                 return dessert.getLibelle()+", chantilly";         }                 // On additionne le prix du dessert et le prix de l'ingrédient chantilly.         public double getPrix()         {                 return dessert.getPrix()+0.50;         } } // Classe chocolat qui hérite de decorateurIngredient et donc indirectement de dessert. public class Chocolat extends DecorateurIngredient {         // Constructeur qui prend en paramètre le dessert.         public Chocolat(Dessert d)         {                 dessert = d;         }                 // On affiche le libellé du dessert et on rajoute le libellé de l'ingrédient chocolat.         public String getLibelle()         {                 return dessert.getLibelle()+", chocolat";         }                 // On additionne le prix du dessert et le prix de l'ingrédient chocolat.         public double getPrix()         {                 return dessert.getPrix()+0.20;         } }

Classe principale de l'application. public class Main {         // Méthode principale.         public static void main(String[] args)         {                 // Création et affichage d'une gaufre au chocolat.                 Dessert d1 = new Gaufre();                 d1 = new Chocolat(d1);                 System.out.println(d1);                 // Création et affichage d'une crêpe au chocolat et chantilly.                 Dessert d2 = new Crepe();                 d2 = new Chocolat(d2);                 d2 = new Chantilly(d2);                 System.out.println(d2);         } } Résultat Gaufre, chocolat : 2,00€ Crêpe, chocolat, chantilly : 2,20€