Pattern État PowerPoint 2003, télécharger la visionneuse PowerPoint Viewer dernière édition si vous ne lavez pas…télécharger la visionneuse PowerPoint.

Slides:



Advertisements
Présentations similaires
La programmation orientée objet avec Java L3-MIAGE Plan
Advertisements

Spécialisation/généralisation Héritage Polymorphisme.
Introspection et Réflexion Manipulation dynamique de code Java.
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Introduction à la programmation objet Langage Java
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
(Classes prédéfinies – API Java)
JAV - TD 6 Structures de données JAVA
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
Principes de programmation (suite)
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
JavaBeans Réalise par: EL KHADRAOUY TARIK AOUTIL SAFOWAN.
POO-L3 H. Fauconnier1 Chapitre IV 1. classe Object, clonage 2. interfaces 3. classes internes et imbriquées.
Langage Oriente Objet Cours 4.
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,
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)
1 Objectifs de ce cours (I21) Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Résumé du cours précédent.
Langage Oriente Objet Cours 2.
Interfaces : comment classifier ?
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
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)
Gestion et levée dexception. Une exception est un message envoyé par une méthode à une autre méthode. La méthode qui la reçoit a le choix de soccuper.
Un patron de conception
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.
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 :
COURS DE PROGRAMMATION ORIENTEE OBJET :
CSI1502 Introduction au génie logiciel
CSI 1502 Principes fondamentaux de conception de logiciels
CSI1502 Principes fondamentaux en conception des logiciels
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é.
Une introduction à Java
2.1 - Historique Chapitre 2 : Introduction au langage C++
4 Introduction des objets. Les chaînes et tableaux
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
La notion de type revisitée en POO
Factory Design Patterns. Contents Factory patterns: principesFactory patterns: principes The Factory Method patternThe Factory Method pattern The Abstract.
Cours 7 Classes locales Clonage Divers: tableaux.
Cours C++ Fonctions Surcharge d’opérateurs Passage d’arguments
© 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.
Réaliser par: Sadok Amel Cheboui hassiba
Strings et Tableaux en Java
Les sockets.
Les classes présenté par: RAHMOUNE RIME / ZEKRI SELMA.
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.
C# de plus près.  Ce sont globalement les mêmes que Java : ◦ Int(int16, int32), float, double, bool,…  Les classe « communes » sont également les mêmes.
Le polymorphisme.
Cours du 5 novembre.
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.
Héritage Conception par Objet et programmation Java
Philippe Gandy - 15 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
BlueJ_VII 1 Java, les objets : tout de suite ! Conception de classes (1) Notes de cours associées au chapitre 7 tutorial BlueJ
LES CLASSES ET LES OBJETS
Java Réalisé par: Mouna POKORA. PLAN: Définition : Historique: Caractéristiques: un langage orienté objet: un langage interprété : un langage portable:
Transcription de la présentation:

Pattern État PowerPoint 2003, télécharger la visionneuse PowerPoint Viewer dernière édition si vous ne lavez pas…télécharger la visionneuse PowerPoint Viewer dernière édition si vous ne lavez pas…

EtatConcret Chaque sous-classe implémente un comportement associé avec létat de contexte. Définition : Le pattern état permet à un objet de modifier son comportement quand son état interne change. Tout se passera comme si lobjet changeait de classe. > Etat +méthode1() +méthode2() +méthode3() +méthode4() EtatConcret +méthode1() +méthode2() +méthode3() +méthode4() EtatConcret +méthode1() +méthode2() +méthode3() +méthode4() EtatConcret +méthode1() +méthode2() +méthode3() +méthode4() EtatConcret +méthode1() +méthode2() +méthode3() +méthode4() Contexte +méthode1() +méthode2() +méthode3() +méthode4() Contexte - Définit linterface intéressant les clients. - Gère une instance dune sous-classe EtatConcret qui définit létat en cours. Etat -Définit une interface qui encapsule le comportement associé avec un état en particulier de contexte.

Machine à bonbons

Pas de pièce A une pièce Bonbon vendu Plus de bonbons Remplir Insérer pièce éjecter pièce Tourner poignée délivrer bonbon Bonbon > 0 Bonbon = 0

Une méthode par action Variable dinstance détat courant Voici les 4 états Constructeur Bloc conditionnelle servant à tester les états Public class Distributeur { final static int EPUISE = 0; final static int SANS_PIECE = 1; final static int A_PIECE = 2; final static int VENDU = 3; int etat = EPUISE; int nombre = 0; public Distributeur (int nombre) { this.nombre = nombre; if (nombre > 0) { etat = SANS_PIECE; } public void insererPiece() { if (etat == A_PIECE) { System.out.println("Vous ne pouvez plus inséré de pièces"); } else if (etat == SANS_PIECE) { etat = A_PIECE; System.out.println("Vous avez inséré une pièce"); } else if (etat == EPUISE) { System.out.println("Rupture de stock, ne pas insérer de pièce"); } else if (etat == VENDU) { System.out.println(« Veuillez patienter, le bonbon va tomber"); } public void ejecterPiece() { …… } public void tournerPoignee() { …… } public void delivrer() { …… } … }

Public class TestDisributeur { public static void main (String[ ] args) { Distributeur distributeur = new Distributeur(5); distributeur.insererPiece(); distributeur.tournerPoignee(); distributeur.insererPiece(); distributeur.ejecterPiece(); distributeur.tournerPoignee(); distributeur.insererPiece(); distributeur.tournerPoignee(); distributeur.insererPiece(); distributeur.tournerPoignee(); distributeur.ejecterPiece(); %java TestDistributeur Vous avez inséré une pièce Vous avez tourné… Un bonbon va sortir… System.out.println(distributeur); Stock 5 bonbons Lappareil attend une pièce Stock 4 bonbons Lappareil attend une pièce Vous avez inséré une pièce Pièce retournée Vous avez tourné mais il ny a pas de pièce Il faut payer dabord Stock 4 bonbons Lappareil attend une pièce Vous avez inséré une pièce Vous avez tourné... Un bonbon va sortir... Vous avez inséré une pièce Vous avez tourné... Un bonbon va sortir... Vous n'avez pas inséré de pièce Stock 2 bonbons Lappareil attend une pièce …

Public class TestDisributeur { public static void main (String[ ] args) { Distributeur distributeur = new Distributeur(5); distributeur.insererPiece(); distributeur.tournerPoignee(); distributeur.insererPiece(); distributeur.ejecterPiece(); distributeur.tournerPoignee(); distributeur.insererPiece(); distributeur.tournerPoignee(); distributeur.insererPiece(); distributeur.tournerPoignee(); distributeur.ejecterPiece(); distributeur.insererPiece(); distributeur.tournerPoignee(); distributeur.insererPiece(); distributeur.tournerPoignee(); distributeur.insererPiece(); distributeur.tournerPoignee(); Vous avez inséré une pièce Vous ne pouvez pas insérer d'autres pièces Vous avez tourné... Un bonbon va sortir... Vous avez inséré une pièce Vous avez tourné... Un bonbon va sortir... Aïe, plus de bonbons ! Vous ne pouvez pas insérer de pièce, nous sommes en rupture de stock Vous avez tourné, mais il n'y a pas de bonbons Pas de bonbon délivré System.out.println(distributeur); Stock 2 bonbons Lappareil attend une pièce Stock 0 bonbons Lappareil est en rupture de stock …

Indication dutilisation Le comportement dun objet dépend de son état, et ce changement de comportement doit intervenir dynamiquement Les opérations comportent de grand pans entiers de déclarations conditionnelles en fonctions de létats de lobjet. Cet état est généralement désigné par une ou plusieurs constantes dénumération. Souvent, plusieurs opérations différentes, contiendront la même structure conditionnelle. public void insererPiece() { if (etat == A_PIECE) { … } else if (etat == SANS_PIECE) { … } else if (etat == EPUISE) { … } else if (etat == VENDU) { … } public void ejecterPiece() { if (etat == A_PIECE) { … } else if (etat == SANS_PIECE) { … } else if (etat == EPUISE) { … } else if (etat == VENDU) { … } public void tournerPoignee() { if (etat == A_PIECE) { … } else if (etat == SANS_PIECE) { … } else if (etat == EPUISE) { … } else if (etat == VENDU) { … } Le modèle état place dans une classe séparée, chacune des branches de la condition. Ceci permet de traiter létat de lobjet, comme un objet à part entière, qui peut varier indépendamment des autres objets. Public class etatPiece { … }Public class etatEpuiser { … }Public class etatVendu { … }Public class etatSensPiece { … } Public interface etat { … }

> public interface Etat { public void insererPiece(); public void ejecterPiece(); public void tournerPoignee(); public void delivrer(); } public class EtatAPiece implements Etat { Distributeur distributeur public EtatAPiece(Distributeur distributeur) { this.distributeur = distributeur; } public void insererPiece() { System.out.println("Vous ne pouvez pas insérer d'autre pièce"); } public void ejecterPiece() { System.out.println("Pièce retournée"); distributeur.setEtat(distributeur.getEtatSansPiece()); } public void tournerPoignee() { System.out.println("Vous avez tourné..."); distributeur.setEtat(distributeur.getEtatVendu()); } public void delivrer() { System.out.println("Pas de bonbon délivré"); } public class EtatEpuise implements Etat { Distributeur distributeur; public EtatEpuise(Distributeur distributeur) { this.distributeur = distributeur; } public void insererPiece() { System.out.println("Vous ne pouvez pas insérer de pièce, nous sommes en rupture de stock"); } public void ejecterPiece() { System.out.println("Ejection impossible, vous n'avez pas inséré de pièce"); } public void tournerPoignee() { System.out.println("Vous avez tourné, mais il n'y a pas de bonbons"); } public void delivrer() { System.out.println("Pas de bonbon délivré"); } Implémentation de linterface Etat et des classes EtatConcret

Distributeur insererPiece() ejecterPiece() tournerPoignee() remplir(…) setEtat(…) liberer() … EtatEpuise insererPiece() ejecterPiece() tournerPoignee() delivrer() EtatSansPiece insererPiece() ejecterPiece() tournerPoignee() delivrer() EtatAPiece insererPiece() ejecterPiece() tournerPoignee() delivrer() EtatVendu insererPiece() ejecterPiece() tournerPoignee() delivrer() > Etat insererPiece() ejecterPiece() tournerPoignee() delivrer()

Transformation de la classe Distributeur Public class Distributeur { final static int EPUISE = 0; final static int SANS_PIECE = 1; final static int A_PIECE = 2; final static int VENDU = 3; int etat = EPUISE; int nombre = 0; public Distributeur (int nombre) { this.nombre = nombre; if (nombre > 0) { etat = SANS_PIECE; } } public class Distributeur { Etat etatEpuise; Etat etatSansPiece; Etat etatAPiece; Etat etatVendu; Etat etat = etatEpuise; int nombre = 0; public Distributeur(int nombreBonbons) { etatEpuise = new EtatEpuise(this); etatSansPiece = new EtatSansPiece(this); etatAPiece = new EtatAPiece(this); etatVendu = new EtatVendu(this); this.nombre = nombreBonbons; if (nombreBonbons > 0) { etat = etatSansPiece; } Lobjet distributeur crée les objets état et les instancie dans son constructeur, puis la variable etat contiendra une référence vers létat dorigine, soit SansPiece, soit Epuiser, suivant quil est rempli ou vide Etats du Distributeur Sans Piece APiece Vendu Epuiser Distributeur.etat

public void insererPiece() { etat.insererPiece(); } public void ejecterPiece() { etat.ejecterPiece(); } public void tournerPoignee() { etat.tournerPoignee(); etat.delivrer(); } void setEtat(Etat etat) { this.etat = etat; } public Etat getEtatSansPiece() { return this.etatSansPiece; } public Etat getEtatVendu() { return this.etatVendu; } public Etat getEtatAPiece() { return this.etatAPiece; } public Etat getEtatEpuise() { return this.etatEpuise; } public int getNombre() { return this.nombre; } public String toString() { return "\nDistribonbon, SARL.\n Distributeur compatible Java, modèle 2007 \n Stock "+ nombre +" bonbons \n"+ ((nombre > 0)? "L'appareil attand une piece\n": "L'appareil est en rupture de stock\n") ; void liberer() { System.out.println("Un Bonbon va sortir..."); if (nombre != 0) { nombre = nombre -1; } Void remplir(int nombre) { this.nombre = nombre; etat = etatSansPiece; } On remarque que le contexte, ici le distributeur, Peut aussi changer son état. => Létat peut être changé soit : -D-Dans les états concrets - Dans le contexte

public void tournerPoignee() { etat.tournerPoignee(); etat.delivrer(); } Etats du Distributeur SansPiece APiece Vendu Epuiser tournerPoignee() etatAPiece public void tournerPoignee() { System.out.println("Vous avez tourné..."); distributeur.setEtat(distributeur.getEtatVendu()); } Vous avez tourné… Un bonbon va sortir etatVendu public void delivrer() { distributeur.liberer(); if (distributeur.getNombre() > 0) { distributeur.setEtat(distributeur.getEtatSansPiece()); } else { System.out.println("Ae, plus de bonbons !"); distributeur.setEtat(distributeur.getEtatEpuise()); } etat tournerPoignee() Delivrer() Nombre = 5Nombre = 4 Distributeur

- rend le code plus lisible car il enlève les grandes déclarations de type conditionnel qui ne sont pas souhaitables car elles ont un éffet monolithique qui à tendance à rendre le code moins explicite - rend les transitions détat plus explicite car il introduit des objets distincts pour chaque état

Exemple prit dans le livre : Voir le site Tête la premièreVoir le site Tête la première OU voir le site OReillyvoir le site OReilly