Patterns Modèles de Conception Orientée Objets



Documents pareils
Programmation Par Objets

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

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

Chapitre VI- La validation de la composition.

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

Chapitre 10. Les interfaces Comparable et Comparator 1

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

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

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

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

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

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

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

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

RMI le langage Java XII-1 JMF

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

Package Java.util Classe générique

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

Programmer en JAVA. par Tama

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Java - RMI Remote Method Invocation. Java - RMI

Calcul Parallèle. Cours 5 - JAVA RMI

Auto-évaluation Programmation en Java

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

Analyse,, Conception Objet

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

Une introduction à Java

Présentation. Au programme. Fonctionnement. A l issue de ce module vous devriez...

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

Remote Method Invocation en Java (RMI)

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)

Corrigé des exercices sur les références

TD/TP PAC - Programmation n 3

Projet de programmation (IK3) : TP n 1 Correction

Remote Method Invocation Les classes implémentant Serializable

4. Groupement d objets

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

LOG4430 : Architecture logicielle et conception avancée

Interfaces graphiques avec l API Swing

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

Java Naming and Directory Interface

as Architecture des Systèmes d Information

Conception de serveurs d'applications ouverts

Remote Method Invocation (RMI)

Programmation par les Objets en Java

TP1 : Initiation à Java et Eclipse

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 )

Initiation à JAVA et à la programmation objet.

Introduction. Les méthodes. Les méthodes. Identité et égalité. Identité et égalité. La copie d'objets. Identité et égalité.

Java Licence Professionnelle CISII,

Programmation avec des objets : Cours 7. Menu du jour

Langage Java. Classe de première SI

Programmation Objet I

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

Threads. Threads. USTL routier 1

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

Exercices sur les interfaces

Architecture Orientée Service, JSON et API REST

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

Gestion distribuée (par sockets) de banque en Java

Arbres binaires de recherche

TD/TP PAC - Programmation n 3

INITIATION AU LANGAGE JAVA

Alfstore workflow framework Spécification technique

Bases Java - Eclipse / Netbeans

Développement Logiciel

Cours 1: Java et les objets

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

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

Apache Camel. Entreprise Integration Patterns. Raphaël Delaporte BreizhJUG

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

Patrons de Conception (Design Patterns)

Composants Logiciels. Le modèle de composant de CORBA. Plan

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

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

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7

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

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Développement d'applications Web HTML5 L'art et la manière avec Visual Studio 2015 et TFS

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Notes de cours Practical BigData

Premiers Pas en Programmation Objet : les Classes et les Objets

Corrigés des premiers exercices sur les classes

LE PROBLEME DU PLUS COURT CHEMIN

Certificat Big Data - Master MAthématiques

Chapitre 2. Classes et objets

F. Barthélemy. 17 mai 2005

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

OCL - Object Constraint Language

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

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

La carte à puce. Jean-Philippe Babau

Environnements de Développement

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Transcription:

Patterns Modèles de Conception Orientée Objets Bibliographie: Design Patterns E.Gamma et International Thomson Publishing Patterns in Java (tomes 1 et 2) M. Grang Wiley -1-

Les bonnes pratiques de la Conception Objet Qu'est-ce qu'une bonne conception Objet? Une conception qui permet l'évolution du logiciel sans re-programmations excessives! Solution Séparer du reste ce qui est susceptible de changer Utiliser des interfaces et non des implémentations pour typer les données. -2-

Strategy Exemples de patterns: leur raison d'être Le client ne dépend plus de l'algorithme qui peut changer Observer Le client ne dépend plus du nombre des observateurs Decorator Le client n'est pas concerné par d'éventuelles extensions Factory Le client ne dépend plus du choix des objets de service Visitor Le code de la structure de donnée n'est plus perturbé par les nouvelles opérations -3-

Commencer par le simple Les patterns (bonnes pratiques) peuvent relever du bon sens Comme par exemple la Façade ou le 'pattern Adapter' Ils peuvent également relever des propriétés des langages de POO Comme le 'pattern Template' ou le 'pattern Strategy' -4-

Pattern Facade Problème: Un sous-système est fait de n interfaces différentes compliquant son utilisation Solution: Créer une seule façade pour ce sous-système. -5-

Pattern FACADE client classes Facade Subsystem classes -6-

Autre Pattern : Adapter les différences Problème On dispose de deux logiciels non prévus l'un pour l'autre! Solution Mettre entre les deux un Adapteur!? -7-

Adapter? Client m(){ p(); }? q() Adapté On veut utiliser une classe existante dont l interface ne convient pas -8-

Pattern Adapter Client m(){ p(); } p() <<interface>> I q() Adapté Adapteur p() { q(); } On peut faire cela en utilisant une interface par exemple -9-

Encore un pattern simple Permettre l'évolution du code d'une méthode? Application + m(a obj) {..obj.p();..} A + p(){ q(); } + q() Notre application appelle la méthode p() Comment faire évoluer à l'avenir le code de p() si celui-ci doit changer? -10-

Utiliser les classes abstraites A peut être rendue abstraite relativement à q() Application + m(a obj) {..obj.p();..} <<abstract>> A + p(){ q(); } <<abstract>> + q() -11-

Pattern Template Et l'héritage avec liaison dynamique Application + m(a obj) {..obj.p();..} <<abstract>> A + p(){ q(); } <<abstract>> + q() Application.m(new A1()); A1 + q() A2 + q() Le code de q et donc de p dépend de la sous-classe de A qui est passée en paramètre -12-

Template : application Ordre max(ordre o){ return this.inf(o)? o : this; } <<abstract>>ordre Ordre max(ordre o){...} abstract inf(ordre); ClasseConcrète inf(ordre){... }... -13-

Application à Java abstract class Ordre { Ordre max(ordre o) { return this.inf(o)? o : this; } } abstract boolean inf(ordre autre); class Entier extends Ordre { int i;... public boolean inf(ordre autre){ return (i<=((entier)autre).i)?true:false; } } class Chaine extends Ordre { String s;... public boolean inf(ordre autre){ return (s.compareto(((chaine)autre).s)<=0)?true:false; } } -14-

Une autre façon de faire! Au lieu d'une classe abstraite on peut aussi utiliser une interface Au lieu de la liaison dynamique utiliser la composition A + T obj + A(T obj) +p(){..obj.q();..} + q() <<interface>> T A a = new A( new T1() ); T1 T2 + q() + q() -15-

Pattern Strategy A a= new A( new T1() ); Application.m(a); Application + m(a obj) {..obj.p();..} A + T obj + A(T obj) +p(){ obj.q();..} + q() <<interface>> T T1 + q() T2 + q() -16-

Stratégie A + Tri algo + A(Tri algo) +p(){..algo.trier();..} <<interface>> Tri + trier() new A( new QuickSort() ) BubbleSort QuickSort + trier() + trier() -17-

Stratégie A + Ordre algo + A(Ordre algo) +Ordre max(..){..o1.inf(o2);..} <<interface>> Ordre + inf() new A( new Chaine() ) Entier Chaine + inf() + inf() -18-

Stratégie public class Contexte {... Ordre max(ordre o1, Ordre o2) { return o1.inf(o2)? o2 : o1; } } interface Ordre { boolean inf(ordre autre); } class Entier implements Ordre { int i;... public boolean inf(ordre autre){ return (i<=((entier)autre).i)?true:false;} } class Chaine implements Ordre { String s;... public boolean inf(ordre autre){ return (s.compareto(((chaine)autre).s)<=0)?true:false;} } -19-

Statégie et Awt Container setlayout (...); add(component);... LayoutManager addlayoutcomponent(...); FlowLayout addlayoutcomponent(); BorderLayout addlayoutcomponent(); -20-

Un autre pattern? Rendre notre code indépendant de l'objet à créer? Application + m():t {..return new T1();} + q() <<interface>> T Ici l'application fait explicitement référence à new T1() T1 + q() T2 + q() -21-

Pattern Factory On combine le pattern template et le pattern strategy Application + m(a a):t { return a.creert(a);..} T t = m(newa1()); Pattern Template <<abstract>> A A + creert(a : A):T {..return a.creer()} <<abstract>>fabriquer():t Pattern Stratégie <<interface>> T + q() A1 + fabriquer():t { return new T1()} T1 + q() T2 + q() Utilisé quand on souhaite déléguer à un producteur la création d'objets de types différents -22-

Abstract Factory et Toolkit AWT Client Toolkit ButtonPeer createbutton(); createcanvas();... MotifButton WindowsButton MotifToolkit createbutton();{ return new MotifButtonPeer(); } WindowsToolkit CanvasPeer MotifCanvas WindowsCanvas -23-

Abstract Factory (Fabrique Abstraite p.101) Fabriquer de cette façon une famille d'objets cohérents FabriqueAbstraite Client ProduitAbstraitA créerproduita(); créerproduitb... ProduitA1 ProduitA2 FabriqueConcrete1 FabriqueConcrete2 ProduitAbstraitB créerproduita(); créerproduitb... créerproduita(); créerproduitb... Portabilité ProduitB1 ProduitB2-24-

Un pattern de plus Modéliser un graphe état transition Application action1 action2 + m(a a) { a.transition();..} initial e1 e2 A, un automate à états A chaque état son action! -25-

Pattern State (Etat) A a= new A( new EtatInitial() ); Proche du pattern stratégie, mais but et comportement différent! Application.m(a); Application + m(a a) {..a.transition();..} A + Etat e + A(Etat e) +transition(){..e.action(this);..} <<interface>> Etat + action(a a) EtatInitial + action(a a) Etat2 + action(a a) + action() e1 e2 a.e est modifié par l'action ce qui modifie la prochaine action -26-

Construire des structures de données complexes : T1 Application + T sd + A(T sd) : T2 Exemples: : Noeud : Noeud : T1 : T1 : T2 Je souhaite que ma structure de donnée ( ici sd) soit aussi bien une donnée élémentaire qu'une donnée complexe -27-

Pattern Composite structures de données complexes Appli + T sd + Appli(T sd) <<abstract>> T 1..* T1 T2 Noeud T[] T sd = new Nœud(new T[]{new T1(), new Noeud( )}); -28-

le modèle Composite dans AWT Component paint(graphics); getparent();... * Button setlabel()... Choice additem()... Container add(component); getcomponents();... -29-

Pattern Iterator Parcourir les éléments d'une donnée complexe sans s'occuper de sa structure interne <<interface>> iterateur A + T sd <<abstract>> T 1..* crée + hasmoreelements() + next() + A(T sd) + creeriterateur(iterateur it) parcours Profondeur Largeur T1 T2 Noeud T[] A une structure de donnée, on associe différents parcours des éléments -30-

itérateur java: Enumeration public interface java.util.enumeration { } public abstract boolean hasmoreelements(); public abstract Object nextelement(); -31-

Java: itérateurs sur une Hashtable public class java.util.hashtable public Hashtable(); extends java.util.dictionary implements java.lang.cloneable { } public void clear(); public Object clone(); public boolean contains(object value); public boolean containskey(object key); public Enumeration elements(); public Object get(object key); public boolean isempty(); public Enumeration keys(); public Object put(object key, Object value); public Object remove(object key); public int size(); public String tostring(); -32-

Exécuter des opérations lors d'un parcours de structure de données <<interface>> iterateur Application + T sd <<abstract>> T 1..* crée + hasmoreelements() + next() + A(T sd) m(){ it.next().op()} + creeriterateur(iterateur it) + <<abstract>>op() parcours Profondeur Largeur T1 T2 Noeud T[] Op(){ } Op(){ } Op(){ } Mais comment faire si l'on veut ajouter de nouvelles opérations sur un parcours de la structure? -33-

Pattern Visitor <<interface>> Visiteur <<interface>> iterateur + op(t1 t) + op(t2 t) + op(nœud t) <<abstract>> T 1..* crée + hasmoreelements() + next() Visiteur1 op(t1 t) op(nœud t) Visiteur2 op(t1 t) op(nœud t) T1 + creeriterateur(iterateur it) + op(visiteur v) {.. V.op(this); } Profondeur Largeur T2 parcours Noeud T[] Si l'on doit parcourir une structure pour différents calcul sur les nœuds, plutôt que de polluer la structure de donnée, mieux vaut créer les opérations dans un visiteur. -34-

Call back Passer une méthode en paramètre à différents clients qui devront ensuite l'appeler Problème! On ne peut passer que des objet Solution Encapsuler la méthode dans un Objet Commande -35-

Pattern Command La commande encapsule une Action Invocateur Commande c; c.doit(); <<abstract>> Commande + Action a + doit(){.. a.action();.} <<interface>> Action + action() new C1(new Action1()) C1 Action1 + C1(Action a) appelle + action() Passer une méthode en paramètre par le biais d'un objet -36-

Responsabilité d'un traitement Problème: Ne pas lier strictement l'émetteur d'une requète de traitement et son récepteur Solution Chaîner entre eux les objets récepteurs et leur laisser choisir celui qui traitera la requête. -37-

Pattern Chaîne de responsabilité L'appel de m est confié à une liste d'objets. L'un de ceux-ci se reconnaît compétent et traite m A + A() +op(t t){..t.m();..} <<abstract>> T + m() # <<abstract>> respdem() successeur T1 + m() # respdem() Tn + m() # respdem() -38-

Exemple abstract class T { private protected t successor; public void m() { if(responsabilitédem()) return; else if( successor!= null) successor.m(); } } abstract protected boolean responsabilitédem(); -39-

Pattern Observer java.util Observable addobserver(observer) notifyobservers(object) * * <observe Observer update(observable,object); ClasseObservable valeurobservable changementetat(){.notifyobservers(.);.} < accède à la valeur observable ObservateurConcret update(observable,object);... -40-

Subrogation Problème Ne pas fournir l'objet demandé mais un représentant Solution Soit par soucis de sécurité Soit pour des raisons de durée d'attente Soit pour implémenter un protocole d'accès distant masqué Le proxy! -41-

Proxy (ou Procuration) Client Sujet requete() SujetRéel requete()... sujetreel Proxy requete() { sujetreel.requete(); } Création d objets lourds à la demande (Image) Fourniture d un représentant local d un objet distant -42-

Proxy Rmi <<interface>> Remote RemoteObject hashcode( ) equals( ) tostring( ) Appel distant votre Client RemoteStub RemoteStub( ) setref( ) RemoteServer RemoteServer( ) RemoteServer( ) getclienthost( ) getlog( ) setlog( ) UnicastRemoteObject votre objet serveur UnicastRemoteObject( ) clone( ) -43-

Décorer un objet! Problème: Etendre les fonctionnalités d'un objet sans sous-classer Solution Emballer l'objet dans un autre qui ajoutera cette fonctionnalité! -44-

Exemple ascrolldecorator aborderdecorator atextview Some allplications would benefit from using objects to modes every aspect of their functionality, but a naive design approach would be prohibitively expensive. For example, most document editors modularize their text formatting and editing facilities to some extent. However, they invariably stop short of using objects to represent each character and graphical element in the document. Doing so would promote flexibility at the finest level in the application. Text and graphics could be treated uniformly with aborderdecorator component ascrolldecorator component atextview -45-

DECORATOR - Motivation VisualComponent Draw() TextView Decorator component Draw() Draw() compnent -> Draw() ScrollDecorator Draw() ScrollTo() scrollposition BorderDecorator Draw() DrawBorder() borderwidth Decorator :: Draw(); DrawBorder(); -46-

DECORATOR Structure Component Operation() ConcreteComponent Decorator component Operation() Operation() component -> Operation() ConcreteDecoratorA Operation() addedstate ConcreteDecoratorB Operation() AddedBehavior() Decorator :: Operation(); AddedBehavior(); -47-