Les Design Pattern GoF Suite

Documents pareils
Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Héritage presque multiple en Java (1/2)

Par Laurent DESECHALLIERS. Mastère Spécialisé en Management de Projets en Milieu Industriel. CESI de Rouen Promotion 2002/2003.

Programmer en JAVA. par Tama

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Design patterns. Design patterns - définition. Design patterns - avantages

Objets et Programmation. origine des langages orientés-objet

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Package Java.util Classe générique

TP1 : Initiation à Java et Eclipse

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Généralités sur le Langage Java et éléments syntaxiques.

Premiers Pas en Programmation Objet : les Classes et les Objets

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Java Licence Professionnelle CISII,

Programmation Par Objets

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Alfstore workflow framework Spécification technique

Chapitre 10. Les interfaces Comparable et Comparator 1

Auto-évaluation Programmation en Java

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Threads. Threads. USTL routier 1

Exercices sur les interfaces

Programmation par les Objets en Java

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

TD/TP PAC - Programmation n 3

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

2. Comprendre les définitions de classes

Un ordonnanceur stupide

Corrigé des exercices sur les références

Support de cours et TD Programmation Orientée Objet

2 e édition JAVA 5 et 6. Jérôme Bougeault. TSoft et Groupe Eyrolles, 2003, 2008, ISBN :

Analyse,, Conception Objet

Langage Java. Classe de première SI

Programmation en Java IUT GEII (MC-II1) 1

Génie Logiciel avec Ada. 4 février 2013

TD/TP PAC - Programmation n 3

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

F. Barthélemy. 17 mai 2005

as Architecture des Systèmes d Information

Généricité. en Java. (polymorphisme paramétrique) Philippe GENOUD UJF Janvier

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Classe Interne, Anonyme & Enumération

GOL-502 Industrie de services. Travaux Pratique / Devoir #7

Programmation avec des objets : Cours 7. Menu du jour

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Une introduction à Java

Dis papa, c est quoi un bus logiciel réparti?

Cours 14 Les fichiers

Durée estimée :1 journée Date de la réalisation : Description Fournisseur Référence Nombre PU HT LM35CZ, LM35AZ LM35DZ

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Projet de programmation (IK3) : TP n 1 Correction

GOL502 Industries de services

Devenez un véritable développeur web en 3 mois!

Information utiles. webpage : Google+ : digiusto/

Chapitre VI- La validation de la composition.

OpenPaaS Le réseau social d'entreprise

Bases Java - Eclipse / Netbeans

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Plan. Patrons de conception. Motivations. Design Pattern : principe. Philippe Collet

Développement Logiciel

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Examen Médian - 1 heure 30

Les frameworks au coeur des applications web

INITIATION AU LANGAGE JAVA

Programmation Orientée Objet application au langage Java Version Novembre 2007

Synchro et Threads Java TM

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Architecture Orientée Service, JSON et API REST

RMI le langage Java XII-1 JMF

Modélisation UML. Christine Solnon INSA de Lyon - 3IF 1/140.

LOG4430 : Architecture logicielle et conception avancée

basée sur le cours de Bertrand Legal, maître de conférences à l ENSEIRB Olivier Augereau Formation UML

Aide mémoire UML & Java 1ère partie : Introduction. marc.lemaire@u-cergy.fr

Ingénérie logicielle dirigée par les modèles

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

TD3: tableaux avancées, première classe et chaînes

Bases de données et fournisseurs de contenu

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Programmation Objet Java Correction

Java Licence Professionnelle CISII,

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Formation, Audit, Conseil, Développement, UX WinRT Silverlight WPF Android Windows Phone

Diagramme de classes

Ingénierie des Modèles. Méta-modélisation

Programme Compte bancaire (code)

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Chapitre V. Les classes : Object, Vector, etc.

CPR Informatique. (poste 3159 ou 3164) Septembre 2002

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Java 1.5 : principales nouveautés

Transcription:

Les Design Pattern GoF Suite Dans le cours précédent, nous avons vu les Design Pattern suivants : Factory (Fabrication, qui crée des objets respectant une Interface) Stratégie (modification dynamique du comportement d'un objet) Singleton (limiter le nombre d'instance à un) Iterator (parcourir séquentiellement une collection) Observateur (découpler l'utilisation de la gestion des données) MVC (découplage affichage gestion et persistance)

Décorateur Extension des classes Comment permettre à une classe d'évoluer sans avoir une multitude d'héritages? Exemple : une classe Boisson (café par exemple) avec un prix, mais on veut pouvoir fournir des évolutions (avec de la chantilly, avec du chocolat, les deux ensemble, etc...ajoutons qu'il y a plusieurs types de café (robusta, arabica). Le résultat est aussi une Boisson... Idem avec des armes (épée, masse d'arme, etc) dans un jeu de rôle... Arme dont les caractéristiques sont modifiables par des sorts (feu, glace, poison, rapide).. mais toujours une arme...

Solution Décorateur Pour éviter l'explosion combinatoire des héritages...

Le décorateur Il s'agit au démarrage d'un composant abstrait, qui impose certaines méthodes (opération() dans l'exemple page précédente). Cela permet d'obtenir un composant Concret, qui résoud les abstractions. On peut ensuite fabriquer un Décorateur, qui EST un composant (il en hérite) et qui CONTIENT un Composant (qu'il décore). (on parle souvent des notions de is-a, et de has-a) On pourra ensuite hériter du Décorateur, pour décrire les options... qui se combineront à l'infini...

Exemple de Décorateur : Pizza Une pizza est une Interface, elle offre une description et un prix... public interface Pizza{ abstract public String getdescription(); abstract public double cost(); Et le Décorateur.. qui contient et implémente... public abstract class PizzaDecorator implements Pizza{ protected Pizza pizza; public PizzaDecorator(Pizza pizza){ this.pizza = pizza; public abstract String getdescription(); public abstract double cost();

Décorateur Pizza Une version normal... public class PizzaSolo extends Pizza{ public PizzaSolo(){ public String getdescription(){ return "Pizza Thin"; public double cost(){return 2.00; Une version avec Parmesan... public class Parmesan extends PizzaDecorator{ public Parmesan(Pizza p){super(p); public String getdescription(){ return pizza.getdescription() + ", parmesan"; public double cost(){return pizza.cost() + 0.75;

Encore d'autres... Une version avec Oeuf... public class Egg extends PizzaDecorator{ public Egg(Pizza p){super(p); public String getdescription(){ return pizza.getdescription() + ", egg"; public double cost(){return pizza.cost() + 1.00; Une version avec jambon... public class Ham extends PizzaDecorator{ public Ham(Pizza p){super(p); public String getdescription(){ return pizza.getdescription() + ", ham"; public double cost(){return pizza.cost() + 0.75;

Et on s'en sert... Utilisation de la pizza... Pizza p=new PizzaSolo(); System.out.println(p.getDescription()+ prix +p.cost()); On obtient : Pizza thin prix 2.00 et de 2 décorateurs Pizza p2=new Ham(new Egg(new PizzaSolo())); System.out.println(p2.getDescription()+ prix +p2.cost()); On obtient : Pizza thin, egg, ham prix 3.75 Version oeuf jambon avec double parmesan.. Pizza p3=new Parmesan(new Parmesan(p2)); System.out.println(p3.getDescription()+ prix +p3.cost());

Reflexions... Décorateur ressemble à un autre Design Pattern Quelles sont les différences?

Etat Permet d'éviter la multiplication des switch cases! L'idée est de déléguer à une classe la gestion de notre état. Si il y a plusieurs actions, chaque état en décrit le comportement. Certaines de ces actions vont faire changer d'état, et donc changer toutes les actions.

Etat avec une seule action Imaginons un appareil (tel un ventilateur de plafond) avec une chainette : vitesse lente, vitesse rapide, stop Obligation de faire des switchs. Si on ajoute une étape, obligation de modifier le code Si il y avait plusieurs actions, obligation de tout modifier partout.

Etat : la chainette en Java class CeilingFanPullChain { private State m_current_state; public CeilingFanPullChain() { m_current_state = new Off(); public void set_state(state s) { m_current_state = s; public void pull() { m_current_state.pull(this);

La chainette Une interface interface State{ void pull(ceilingfanpullchain wrapper); class Off implements State { public void pull(ceilingfanpullchain wrapper) { wrapper.set_state(new Low()); System.out.println(" low speed");

Chainette class Low implements State { public void pull(ceilingfanpullchain wrapper) { wrapper.set_state(new Quick()); System.out.println(" quick speed"); class Quick implements State { public void pull(ceilingfanpullchain wrapper) { wrapper.set_state(new Off()); System.out.println(" stop");

Visiteur Ce design pattern peut parfois être confondu avec Stragégie. L'idée est de permettre là aussi un comportement évolutif Par contre, Visiteur peut s'appliquer sur des classes différentes Le visité se passe en paramêtre et le visiteur peut alors le manipuler comme il le veut Stratégie permet de définir des comportements différents pour une classe, alors que Visiteur permet de définir des comportements différents selon les classes..

Diagramme UML du visiteur Interface Visité accept(visitor) Client Interface Visiteur visit(visité) ClasseA accept(visiteur) ClasseB accept(visiteur) ClasseC accept(visiteur) Visiteur.visit(this) Chaque objet, lors de l'accept, demande la visite du visiteur VisiteurA visit(visité) Cette methode peut exécuter des traitements sur le Visité, lors que celui ci l'appelle

Visiteur Exemple Lors de la conception d'un programme, vous voulez être capable de débugger à n'importe quel moment Mais vous ne voulez pas que le debug traine dans la version finale. Solution : Rendez vos objets importants visitables. Ecrivez un visiteur capable, selon les objets, d'afficher toutes sortes d'info sur lui (son contenu) Sans visiteur, plus de debug. Il sera ensuite possible d'écrire un autre visiteur pour sauvegarder vos objets par exemple.

Implémentation Interface Visitable { public void accept (Visiteur) public class Mage extends Personnage implements Visitable { public Mage(String name) { //constructeur // plein de méthodes pour les mages public void accept (Visiteur v) { v.visit(this); public class Dague extends Arme implements Visitable { public Dage(String name, Integer point) { //constructeur // plein d'autres méthodes d'arme public void accept (Visiteur v) { v.visit(this);

Le visiteur... public class Debug implements Visiteur { public void visit(visitable vv) { if (vv instanceof(mage)) { Mage m=(mage)vv; //on scanne l'objet, on imprime des infos Interface Visiteur { else { public void visit(visitable) Dague a=(dague)vv; //idem Et dans le main Dague ladague=new Dague('aiguille',100); Debug mydebug=new Debug();... LaDague.accept(myDebug); //déclenche le débug