Design patterns par la pratique

Documents pareils
Patrons de Conception (Design Patterns)

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

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)

Information utiles. webpage : Google+ : digiusto/

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

IFT2255 : Génie logiciel

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

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

Introduction au Génie Logiciel

Présentation du PL/SQL

Projet Active Object

Rappel sur les bases de données

DA MOTA Anthony - Comparaison de technologies : PhoneGap VS Cordova

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

Ce document décrit la démarche à suivre pour installer les outils de développement et compiler le projet TANAGRA.

Traduction des Langages : Le Compilateur Micro Java

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Chapitre VI- La validation de la composition.

Les structures. Chapitre 3

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

OASIS Date de publication

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

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

Chapitre 2. Classes et objets

TP1 : Initiation à Java et Eclipse

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Développement d un interpréteur OCL pour une machine virtuelle UML.

Premiers Pas en Programmation Objet : les Classes et les Objets

INTERSYSTEMS CACHÉ COMME ALTERNATIVE AUX BASES DE DONNÉES RÉSIDENTES EN MÉMOIRE

Méthode de Test. Pour WIKIROUTE. Rapport concernant les méthodes de tests à mettre en place pour assurer la fiabilité de notre projet annuel.

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

Méthodes d évolution de modèle produit dans les systèmes du type PLM

2.4 Représentation graphique, tableau de Karnaugh

GOL502 Industries de services

Programmer en JAVA. par Tama

Initiation à JAVA et à la programmation objet.

Cours Ephec Niv. 2 : Technique et gestion de projet. Par Monsieur Bertieaux Année Académique Quelles sont les 4 valeurs Agiles?

MODELISATION UN ATELIER DE MODELISATION «RATIONAL ROSE»

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

Les frameworks au coeur des applications web

THÉORIE ET PRATIQUE DE L AUDIT INTERNE

Classes et Objets en Ocaml.

POUR LA PHASE PILOTE INITIALE, MINUSTAH. Congé spécial (avec ou sans traitement)

Archivage. des dossiers

Cycle de vie du logiciel. Unified Modeling Language UML. UML: définition. Développement Logiciel. Salima Hassas. Unified Modeling Language

F. Barthélemy. 17 mai 2005

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

L équilibre Ressources Emplois de biens et services schématisé par une balance

Ordinateurs, Structure et Applications

Machines virtuelles Cours 1 : Introduction

Bases de données. Chapitre 1. Introduction

CORBA. (Common Request Broker Architecture)

CONSEIL NATIONAL DE LA COMPTABILITÉ Remplacement d instruments

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

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

INITIATION AU LANGAGE JAVA

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

Cours de Systèmes d Exploitation

Guide No.2 de la Recommandation Rec (2009).. du Comité des Ministres aux États membres sur la démocratie électronique

Le développement d'applications informatiques

Simplifier l intégration des systèmes RH et garantir une version unique des données de l employé. D

Meta Object Facility. Plan

CA Mainframe Application Tuner r8.5

Cours de Java. Sciences-U Lyon. Java - Introduction Java - Fondamentaux Java Avancé.

Vérifier la qualité de vos applications logicielle de manière continue

TD n o 8 - Domain Name System (DNS)

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

Programmation Orientée Objet

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Manuel du logiciel PrestaTest.

Circuits RL et RC. Chapitre Inductance

Etude de fonctions: procédure et exemple

Sélection d un moteur de recherche pour intranet : Les sept points à prendre en compte

En ce qui concerne les marques figuratives, vous devez contrôler la similarité sur deux plans: qu est-il représenté?

UML Diagramme de communication (communication diagram) Emmanuel Pichon 2013

( ) Fax : ( ) Courriel : Veuillez annexer une liste des adresses de toutes les succursales ou bureaux du proposant.

Mesurer le succès Service Desk Guide d évaluation pour les moyennes entreprises :

Déployer une application cliente avec le Framework.NET 3.5 Client Profile

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

Cours 1 : La compilation

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

PREMIERE UTILISATION D IS-LOG

10 problèmes de réseau courants que PRTG Network Monitor vous aide à résoudre

Modélisation de Lignes de Produits en UML *

Solution A La Gestion Des Objets Java Pour Des Systèmes Embarqués

GUIDE DE CONSOLIDATION D ÉQUIPE POUR LES ÉQUIPES DE SOINS PRIMAIRES DE L ONTARIO

Architecture à base de composants pour le déploiement adaptatif des applications multicomposants

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

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

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

Créer le schéma relationnel d une base de données ACCESS

Générer du trafic sur son site gratuitement

MegaStore Manager ... Simulation de gestion d un hypermarché. Manuel du Participant

Projet Viticulture - TP 3 : bases de données distantes BTS Services informatiques aux organisations

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

Ordinateurs, Structure et Applications

Bien architecturer une application REST

Formula Negator, Outil de négation de formule.

Allocation de l adressage IP à l aide du protocole DHCP.doc

Transcription:

Alan SHALLOWAY James TROTT Design patterns par la pratique Groupe Eyrolles, 2002 ISBN : 2-212-11139-8

7 Le pattern Adaptateur Sommaire Nous allons poursuivre notre étude des design patterns par la présentation du pattern Adaptateur qui est utilisé en combinaison avec de nombreux autres patterns. Ce chapitre abordera les thèmes suivants : description du pattern Adaptateur, de son utilisation et de son implémentation ; caractéristiques principales du pattern Adaptateur ; illustration du polymorphisme par le pattern Adaptateur ; utilisation du langage UML à différents niveaux de détail ; remarques d ordre pratique sur le pattern Adaptateur, et notamment comparaison avec le pattern Façade ; rôle du pattern Adaptateur dans notre exemple de CFAO. L exemple figurant dans le corps du chapitre est en Java. Vous trouverez son équivalent en C++ à la fin de ce chapitre. Présentation du pattern Adaptateur La bande des quatre indique que le pattern Adaptateur :

70 Design patterns par la pratique «Convertit l interface d une classe en une autre conforme à l attente du client. L Adaptateur permet à des classes de collaborer, qui n auraient pu le faire du fait d interfaces incompatibles.» 1 Concrètement, ce pattern nous permet de créer une interface pour un objet effectuant les actions dont nous avons besoin, mais n utilisant pas l interface qui nous convient. Le pattern Adaptateur en contexte L objet client ignore les détails L exemple suivant vous permettra de mieux comprendre le rôle du pattern Adaptateur. Supposons que vous deviez respecter les spécifications suivantes : créer des classes pour des points, des lignes et des carrés ayant un comportement «afficher» ; les objets clients n ont pas besoin de savoir s ils ont un point, une ligne ou un carré, mais uniquement qu ils possèdent l une de ces formes. En d autres termes, il s agit d inclure ces formes dans un concept de niveau supérieur que nous appellerons «forme affichable». Vous avez probablement déjà rencontré des situations similaires, par exemple : vous aviez besoin d utiliser une sous-routine ou une méthode écrite par quelqu un d autre parce qu elle contenait des fonctions qui vous intéressaient ; vous ne pouviez pas intégrer une routine directement dans votre programme ; l interface ou la méthode d appel du code ne correspondait pas exactement à celle dont les objets associés ont besoin. Pour en revenir à notre exemple, bien que le système soit conçu pour avoir des points, des lignes et des carrés, les objets clients doivent penser qu ils ont simplement des formes pour les raisons suivantes : cela leur permet de traiter tous ces objets de la même façon, sans s arrêter sur leurs différences ; cela vous permettra d ajouter ultérieurement d autres types de formes sans modifier les clients (voir la figure 7-1). 1. Gamma, E., Helm, R., Johnson, R., Vlissides, J., Design Patterns: Elements of Reusable Object-Oriented Software, Reading, Mass.:Addison-Wesley, 1995, page 139 (page 163 dans l édition française).

Le pattern Adaptateur CHAPITRE 7 71 Figure 7-1 Les objets ne sont que des formes Polymorphisme et classes dérivées Pour ce type de conception, nous utiliserons le polymorphisme, c est-à-dire que nous aurons plusieurs objets dans le système, mais les clients correspondants agiront envers eux d une seule et même façon. Dans le cas présent, l objet client indique simplement au point, à la ligne ou au carré qu il doit effectuer une action, par exemple s afficher ou annuler son affichage. Chaque point, ligne ou carré doit ensuite savoir comment se comporter en fonction de son type. Pour cela, nous devons créer une classe Forme et en dériver les classes des points, des lignes et des carrés, comme illustré dans la figure 7-2. Figure 7-2 Classes dérivées de la classe Forme : Point, Ligne et Carre Client Forme Point Ligne Carré Tous les diagrammes de classes de ce livre utilisent la notation UML (langage de modélisation unifié). Reportez-vous au chapitre 2 pour plus d informations sur ce sujet. Définition de l interface et implémentation des classes dérivées Tout d abord, nous devons spécifier le comportement des formes. Pour cela, nous définissons une interface dans la classe Forme, puis nous implémentons ce comportement dans chaque classe dérivée.

72 Design patterns par la pratique La classe Forme aura les comportements suivants : définir un emplacement pour la forme ; obtenir un emplacement pour la forme ; afficher une forme ; remplir une forme ; définir la couleur d une forme ; annuler l affichage d une forme. Ces méthodes sont illustrées dans la figure 7-3 suivante : Forme +définiremplacement() +obteniremplacement() +définircouleur() Point Figure 7-3 Classes Point, Lignes et Carre avec leurs méthodes Ligne Carré Supposons maintenant que vous deviez implémenter un nouveau type de forme tel que le cercle (n oubliez pas que les spécifications changent sans cesse!). Vous créez alors une classe Cercle qui implémente la forme correspondante et qui est dérivée de la classe Forme de façon à bénéficier du polymorphisme. Vous devez ensuite écrire les méthodes afficher, remplir et annuleraffichage de la classe Cercle. Supposons maintenant qu il existe déjà une classe CercleXX et que vous décidiez d utiliser les méthodes qu elle contient : affichercercle remplircercle

Le pattern Adaptateur CHAPITRE 7 73 annuleraffichagecercle Figure 7-4 Classe CercleXX existante CercleXX +définiremplacement() +obteniremplacement() +affichercercle() +remplircercle() +définircouleurcercle() +annuleraffichagecercle() Dans le cas présent, vous ne pouvez pas utiliser CercleXX directement si vous souhaitez conserver le polymorphisme de Forme pour les deux raisons suivantes : les noms des méthodes et les listes de paramètres diffèrent de ceux de la classe Forme ; la nouvelle classe doit être dérivée de Forme. À ce stade, vous vous demandez donc probablement comment utiliser le code existant sans modifier toutes les méthodes de CercleXX, ce qui risquerait d entraîner des effets secondaires imprévus. La solution est simple : il suffit de créer une nouvelle classe qui sera dérivée de Forme et implémentera son interface mais en évitant de réécrire l implémentation du cercle fournie dans CercleXX, comme illustré dans la figure 7-5. Pour résumer : la classe Cercle est dérivée de Forme ; elle contient CercleXX ; elle passe les requêtes effectuées à l objet Cercle via l objet CercleXX. Le losange situé sur la droite du schéma, entre Cercle et CercleXX, indique que cette première classe contient la seconde. Lorsqu un objet Cercle est instancié, il doit également instancier un objet CercleXX correspondant. Si tout ce que l objet Cercle fait est systématiquement transmis à l objet CercleXX et que ce dernier possède toutes les fonctionnalités nécessaires à l objet Cercle, l objet CercleXX peut effectuer les actions demandées. Ce processus d encapsulation serait traduit de la façon suivante dans le code :

74 Design patterns par la pratique Client Forme +définiremplacement() +obteniremplacement() +définircouleur() Point Ligne Carré Cercle CercleXX +définiremplacement() +obteniremplacement() +définircouleur() 1 1 +affichercercle() +remplircercle() +annuleraffichagecercle() +définiremplacement() +obteniremplacement() +définircouleurcercle() Figure 7-5 Le pattern Adaptateur : Cercle encapsule CercleXX Listing 7-1 Extrait de code Java : implémenter le pattern Adaptateur class Cercle extends Forme {... private CercleXX pcx;... public Cercle () { pcx= new CercleXX(); void public afficher() { pcx.affichercercle(); Comme vous avez pu le constater, le pattern Adaptateur est surtout utile dans un contexte de polymorphisme. Nous verrons d ailleurs plus tard qu il sert également lorsque d autres design patterns ont recours au polymorphisme.

Le pattern Adaptateur CHAPITRE 7 75 Le pattern Adaptateur : caractéristiques Objectif Problème Solution Participants et collaborateurs Conséquences Implémentation Référence Gof Faire correspondre à une interface donnée un objet existant que vous ne contrôlez pas. Un système a les bonnes données et les bonnes méthodes, mais la mauvaise interface. Généralement utilisé lorsque vous devez créer des dérivées d une classe abstraite en cours de définition ou déjà définie. L adaptateur fournit un encapsuleur avec l interface voulue. La classe Adaptateur adapte l interface à la classe Adaptee pour qu elle corresponde à celle de la Cible de l Adaptateur (c est-à-dire la classe à partir de laquelle elle est dérivée). Cela permet au Client d utiliser la classe Adaptee comme s il s agissait d un type de Cible. Grâce au pattern Adaptateur, des objets existants peuvent être intégrés à de nouvelles structures de classes sans être limités par leur interface. Intégrer la classe existante dans une autre classe. La classe qui encapsule doit être compatible avec l interface voulue et appeler les méthodes de la classe encapsulée. Pages 139 à 150 (Pages 163 à 176 dans l édition française). Client Cible ClasseAdaptée +requête() +requêtespécifique() classeadaptée ClasseAdaptée -> requêtespécifique() Adaptateur +requête() Figure 7-6 Vue standard simplifiée du pattern Adaptateur Le pattern Adaptateur : notes pratiques Au-delà de l encapsulation Vous vous retrouverez souvent dans le genre de situation que nous venons de voir, mais l objet adapté n aura pas nécessairement toutes les fonctions dont vous aurez besoin. Le cas échéant, vous pourrez tout de même avoir recours au pattern Adaptateur, qui ne sera pas parfait, mais grâce auquel : les fonctions implémentées dans la classe existante pourront être adaptées ; les fonctions absentes pourront être implémentées dans l objet encapsuleur.

76 Design patterns par la pratique L interface des classes existantes n est plus une contrainte Grâce au pattern Adaptateur, vous n avez plus à vous préoccuper des interfaces des classes existantes lors de la conception. Si vous disposez d une classe avec les fonctions dont vous avez besoin, tout au moins sur le plan conceptuel, vous pouvez utiliser le pattern Adaptateur afin de lui donner l interface qui vous convient. Ce concept sera d autant plus important après l étude d autres patterns. Adaptateur d objet et Adaptateur de classe Il existe deux types de pattern Adaptateur : Adaptateur d objet Il s agit du pattern que nous venons d utiliser. Il s appuie sur un objet encapsuleur qui contient un autre objet adapté. Adaptateur de classe Ce pattern est implémenté avec l héritage multiple. Le choix de l un ou l autre de ces patterns s imposera surtout au moment de l implémentation, en fonction des éléments impliqués. Si vous souhaitez plus d informations sur ce choix, reportez-vous aux pages 142 à 144 du livre de la bande des quatre (166 à 169 dans l édition française). Comparaison entre le pattern Adaptateur et le pattern Façade De prime abord, ces deux patterns semblent similaires : ils impliquent tous les deux une ou plusieurs classes existantes n ayant pas l interface voulue et la création d un objet avec cette interface souhaitée, comme illustré dans la figure 7-7. Figure 7-7 Un objet client utilisant un objet préexistant avec la mauvaise interface Client? Quel pattern? Objet préexistant Cependant, même si tous deux sont des encapsuleurs, leur méthode d encapsulation diffère, comme le démontre le tableau 7-1 qui vous révèle les propriétés de ces patterns. Tableau 7-1 Comparaison entre le pattern Façade et le pattern Adaptateur Façade Adaptateur Existe-t-il des classes préexistantes? Oui Oui Une interface spécifique doit-elle être utilisée Non Oui pour la conception

Le pattern Adaptateur CHAPITRE 7 77 Tableau 7-1 Comparaison entre le pattern Façade et le pattern Adaptateur (suite) Façade Adaptateur Le polymorphisme est-il nécessaire? Non Probablement Une interface plus simple est-elle nécessaire? Oui Non Ce tableau nous permet de tirer les conclusions suivantes : les deux patterns utilisent des classes préexistantes ; contrairement au pattern Adaptateur, le pattern Façade n implique pas la prise en compte d une interface spécifique lors de la conception ; le polymorphisme n intervient pas dans la façade, alors qu il est utile dans l adaptateur, sauf si vous devez simplement concevoir une API spécifique ; le pattern Façade a pour but de simplifier l interface tandis que l adaptateur cherche d abord à concevoir une solution pour une interface existante. Certains programmeurs ont tendance à conclure que le pattern Façade diffère de l adaptateur parce qu il masque plusieurs classes, contre une seule pour l adaptateur. Cette conclusion se vérifie souvent, même si elle ne dépend pas du pattern lui-même. En outre, il peut arriver qu une façade soit utilisée pour un objet excessivement complexe, tandis qu un adaptateur peut encapsuler plusieurs petits objets implémentant la fonction voulue. En bref, nous pouvons dire qu une façade simplifie une interface alors qu un adaptateur la convertit en une interface préexistante. Rôle du pattern Adaptateur dans notre exemple de CFAO Dans le cadre de notre problème de CFAO (voir le chapitre 3), les motifs du système V2 sont représentés par des objets MotifGOO. Malheureusement, étant donné que ces objets ont été conçus par un autre programmeur, ils ne disposent pas d une interface appropriée et il est impossible de les dériver de la classe Motif. Dans ce cas, nous n avons même pas la possibilité d écrire de nouvelles classes pour implémenter cette fonction. Nous devons communiquer avec les objets MotifGOO. Le pattern Adaptateur est parfait pour nous aider à résoudre ce problème.

78 Design patterns par la pratique Exemple de code en C++ Listing 7-2 Extrait de code en C++ : implémenter le pattern Adaptateur class Cercle : public Forme {... private: CercleXX *pcx;... Cercle::Cercle () {... pcx= new CercleXX(); void Cercle::afficher () { pcx->affichercercle();