Les Designs Patterns

  • Upload
    ghaghni

  • View
    276

  • Download
    0

Embed Size (px)

Citation preview

Rfrence

design patterns en JavaLes 23 modles de conception fondamentauxSteven John Metsker William C. Wake

Les

Rseaux et tlcom Programmation

Gnie logiciel

Scurit Systme dexploitation

pattern Livre Page I Vendredi, 9. octobre 2009 10:31 10

Les Design Patterns en JavaLes 23 modles de conception fondamentauxSteven John Metsker et William C. Wake

pattern Livre Page II Vendredi, 9. octobre 2009 10:31 10

Pearson Education France a apport le plus grand soin la ralisation de ce livre an de vous fournir une information complte et able. Cependant, Pearson Education France nassume de responsabilits, ni pour son utilisation, ni pour les contrefaons de brevets ou atteintes aux droits de tierces personnes qui pourraient rsulter de cette utilisation. Les exemples ou les programmes prsents dans cet ouvrage sont fournis pour illustrer les descriptions thoriques. Ils ne sont en aucun cas destins une utilisation commerciale ou professionnelle. Pearson Education France ne pourra en aucun cas tre tenu pour responsable des prjudices ou dommages de quelque nature que ce soit pouvant rsulter de lutilisation de ces exemples ou programmes. Tous les noms de produits ou marques cits dans ce livre sont des marques dposes par leurs propritaires respectifs.Publi par Pearson Education France 47 bis, rue des Vinaigriers 75010 PARIS Tl. : 01 72 74 90 00 www.pearson.fr Mise en pages : TyPAO ISBN : 978-2-7440-4097-9 Copyright 2009 Pearson Education France Tous droits rservs ISBN original : 0-321-33302-0 Copyright 2006 by Addison-Wesley Tous droits rservs Titre original : Design Patterns in Java

Traduit de lamricain par Freenet Sofor ltd

Aucune reprsentation ou reproduction, mme partielle, autre que celles prvues larticle L. 122-5 2 et 3 a) du code de la proprit intellectuelle ne peut tre faite sans lautorisation expresse de Pearson Education France ou, le cas chant, sans le respect des modalits prvues larticle L. 122-10 dudit code. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from Pearson Education, Inc.

pattern Livre Page III Vendredi, 9. octobre 2009 10:31 10

Table des matiresPrface .............................................................................................................................. Conventions de codage ................................................................................................. Remerciements ............................................................................................................. Chapitre 1. Introduction ................................................................................................. Quest-ce quun pattern ? .............................................................................................. Quest-ce quun pattern de conception ? ...................................................................... Liste des patterns dcrits dans louvrage ................................................................ Java ............................................................................................................................... UML ............................................................................................................................. Exercices ....................................................................................................................... Organisation du livre ..................................................................................................... Oozinoz ......................................................................................................................... Rsum ......................................................................................................................... 1 1 2 3 3 4 5 7 7 8 9 10 11

Partie I Patterns dinterface Chapitre 2. Introduction aux interfaces ........................................................................ Interfaces et classes abstraites ....................................................................................... Interfaces et obligations ................................................................................................ Rsum ......................................................................................................................... Au-del des interfaces ordinaires .................................................................................. Chapitre 3. ADAPTER .................................................................................................... Adaptation une interface ............................................................................................ Adaptateurs de classe et dobjet ................................................................................... 15 16 17 19 19 21 21 25

pattern Livre Page IV Vendredi, 9. octobre 2009 10:31 10

IV

Table des matires

Adaptation de donnes pour un widget JTable .......................................................... Identication dadaptateurs .......................................................................................... Rsum ......................................................................................................................... Chapitre 4. FACADE ....................................................................................................... Faades, utilitaires et dmos ......................................................................................... Refactorisation pour appliquer FACADE ....................................................................... Rsum ......................................................................................................................... Chapitre 5. COMPOSITE .............................................................................................. Un composite ordinaire ................................................................................................. Comportement rcursif dans les objets composites ...................................................... Objets composites, arbres et cycles .............................................................................. Des composites avec des cycles .................................................................................... Consquences des cycles .............................................................................................. Rsum ......................................................................................................................... Chapitre 6. BRIDGE ....................................................................................................... Une abstraction ordinaire .............................................................................................. De labstraction au pattern BRIDGE ............................................................................. Des drivers en tant que BRIDGE ................................................................................... Drivers de base de donnes ........................................................................................... Rsum .........................................................................................................................

29 33 34 35 36 37 46 47 47 48 50 55 59 60 61 61 64 66 67 69

Partie II Patterns de responsabilit Chapitre 7. Introduction la responsabilit ................................................................. Responsabilit ordinaire ............................................................................................... Contrle de la responsabilit grce la visibilit ......................................................... Rsum ......................................................................................................................... Au-del de la responsabilit ordinaire .......................................................................... 73 73 75 77 77

pattern Livre Page V Vendredi, 9. octobre 2009 10:31 10

Table des matires

V

Chapitre 8. SINGLETON ............................................................................................... Le mcanisme de SINGLETON ..................................................................................... Singletons et threads ..................................................................................................... Identication de singletons ........................................................................................... Rsum ......................................................................................................................... Chapitre 9. OBSERVER ................................................................................................. Un exemple classique : OBSERVER dans les interfaces utilisateurs ............................... Modle-Vue-Contrleur ................................................................................................ Maintenance dun objet Observable ......................................................................... Rsum ......................................................................................................................... Chapitre 10. MEDIATOR ............................................................................................... Un exemple classique : mdiateur de GUI ................................................................... Mdiateur dintgrit relationnelle ............................................................................... Rsum ......................................................................................................................... Chapitre 11. PROXY ....................................................................................................... Un exemple classique : proxy dimage ......................................................................... Reconsidration des proxies dimage ........................................................................... Proxy distant ................................................................................................................. Proxy dynamique .......................................................................................................... Rsum ......................................................................................................................... Chapitre 12. CHAIN OF RESPONSABILITY ............................................................. Une chane de responsabilits ordinaire ....................................................................... Refactorisation pour appliquer CHAIN OF RESPONSABILITY ................................... Ancrage dune chane de responsabilits ...................................................................... CHAIN OF RESPONSABILITY sans COMPOSITE ......................................................... Rsum ......................................................................................................................... Chapitre 13. FLYWEIGHT ............................................................................................ Immuabilit ................................................................................................................... Extraction de la partie immuable dun yweight ......................................................... Partage des objets yweight ......................................................................................... Rsum .........................................................................................................................

79 79 81 82 84 85 85 90 96 99 101 101 106 112 115 115 120 122 128 133 135 135 137 140 142 142 143 143 144 146 149

pattern Livre Page VI Vendredi, 9. octobre 2009 10:31 10

VI

Table des matires

Partie III Patterns de construction Chapitre 14. Introduction la construction .................................................................. Quelques ds de construction ..................................................................................... Rsum ......................................................................................................................... Au-del de la construction ordinaire ............................................................................. Chapitre 15. BUILDER ................................................................................................... Un objet constructeur ordinaire .................................................................................... Construction avec des contraintes ................................................................................. Un builder tolrant ........................................................................................................ Rsum ......................................................................................................................... Chapitre 16. FACTORY METHOD ............................................................................... Un exemple classique : des itrateurs ........................................................................... Identication de FACTORY METHOD ............................................................................. Garder le contrle sur le choix de la classe instancier ............................................... Application de FACTORY METHOD dans une hirarchie parallle ................................. Rsum ......................................................................................................................... Chapitre 17. ABSTRACT FACTORY ........................................................................... Un exemple classique : le kit de GUI ........................................................................... Classe FACTORY abstraite et pattern FACTORY METHOD .............................................. Packages et classes factory abstraites ........................................................................... Rsum ......................................................................................................................... Chapitre 18. PROTOTYPE ............................................................................................ Des prototypes en tant quobjets factory ...................................................................... Prototypage avec des clones ......................................................................................... Rsum ......................................................................................................................... Chapitre 19. MEMENTO ............................................................................................... Un exemple classique : dfaire une opration .............................................................. Dure de vie des mmentos .......................................................................................... 153 153 155 155 157 157 160 163 164 165 165 166 167 169 171 173 173 178 182 182 183 183 185 187 189 189 196

pattern Livre Page VII Vendredi, 9. octobre 2009 10:31 10

Table des matires

VII

Persistance des mmentos entre les sessions ................................................................ Rsum ......................................................................................................................... Partie IV Patterns dopration Chapitre 20. Introduction aux oprations ..................................................................... Oprations et mthodes ................................................................................................. Signatures ..................................................................................................................... Exceptions ..................................................................................................................... Algorithmes et polymorphisme .................................................................................... Rsum ......................................................................................................................... Au-del des oprations ordinaires ................................................................................ Chapitre 21. TEMPLATE METHOD ........................................................................... Un exemple classique : algorithme de tri ...................................................................... Compltion dun algorithme ......................................................................................... Hooks ............................................................................................................................ Refactorisation pour appliquer TEMPLATE METHOD .................................................... Rsum ......................................................................................................................... Chapitre 22. STATE ........................................................................................................ Modlisation dtats ...................................................................................................... Refactorisation pour appliquer STATE ......................................................................... Etats constants .............................................................................................................. Rsum ......................................................................................................................... Chapitre 23. STRATEGY ............................................................................................... Modlisation de stratgies ............................................................................................ Refactorisation pour appliquer STRATEGY ................................................................... Comparaison de STRATEGY et STATE .......................................................................... Comparaison de STRATEGY et TEMPLATE METHOD ..................................................... Rsum .........................................................................................................................

197 200

203 203 205 205 206 208 209 211 211 215 218 219 221 223 223 227 231 233 235 236 238 242 243 243

pattern Livre Page VIII Vendredi, 9. octobre 2009 10:31 10

VIII

Table des matires

Chapitre 24. COMMAND ............................................................................................... Un exemple classique : commandes de menus ............................................................. Emploi de COMMAND pour fournir un service ................................................................ Hooks ............................................................................................................................ COMMAND en relation avec dautres patterns .................................................................. Rsum ......................................................................................................................... Chapitre 25. INTERPRETER ........................................................................................ Un exemple de INTERPRETER ..................................................................................... Interprteurs, langages et analyseurs syntaxiques ........................................................ Rsum ......................................................................................................................... Partie V Patterns dextension Chapitre 26. Introduction aux extensions ..................................................................... Principes de la conception oriente objet ..................................................................... Le principe de substitution de Liskov ........................................................................... La loi de Demeter ......................................................................................................... Elimination des erreurs potentielles .............................................................................. Au-del des extensions ordinaires ................................................................................ Rsum ......................................................................................................................... Chapitre 27. DECORATOR ........................................................................................... Un exemple classique : ux dE/S et objets Writer ................................................... Enveloppeurs de fonctions ............................................................................................ DECORATOR en relation avec dautres patterns .............................................................. Rsum ......................................................................................................................... Chapitre 28. ITERATOR ................................................................................................ Itration ordinaire ......................................................................................................... Itration avec scurit inter-threads .............................................................................. Itration sur un objet composite ................................................................................... Ajout dun niveau de profondeur un numrateur ............................................... Enumration des feuilles ......................................................................................... Rsum .........................................................................................................................

245 245 248 249 251 252 253 254 265 266

269 269 270 271 273 273 274 277 277 285 292 293 295 295 297 303 310 311 313

pattern Livre Page IX Vendredi, 9. octobre 2009 10:31 10

Table des matires

IX

Chapitre 29. VISITOR .................................................................................................... Application de VISITOR .............................................................................................. Un VISITOR ordinaire .................................................................................................. Cycles et VISITOR ....................................................................................................... Risques de VISITOR .................................................................................................... Rsum ......................................................................................................................... Partie VI Annexes Annexe A. Recommandations ........................................................................................ Tirer le meilleur parti du livre ....................................................................................... Connatre ses classiques ............................................................................................... Appliquer les patterns ................................................................................................... Continuer dapprendre .................................................................................................. Annexe B. Solutions ......................................................................................................... Introduction aux interfaces ........................................................................................... Solution 2.1 ............................................................................................................. Solution 2.2 ............................................................................................................. Solution 2.3 ............................................................................................................. ADAPTER .................................................................................................................... Solution 3.1 ............................................................................................................. Solution 3.2 ............................................................................................................. Solution 3.3 ............................................................................................................. Solution 3.4 ............................................................................................................. Solution 3.5 ............................................................................................................. Solution 3.6 ............................................................................................................. FACADE ....................................................................................................................... Solution 4.1 ............................................................................................................. Solution 4.2 ............................................................................................................. Solution 4.3 ............................................................................................................. Solution 4.4 .............................................................................................................

315 315 318 323 328 330

333 333 334 334 336 337 337 337 338 338 338 338 339 340 341 341 342 342 342 343 343 344

pattern Livre Page X Vendredi, 9. octobre 2009 10:31 10

X

Table des matires

COMPOSITE ................................................................................................................ Solution 5.1 ............................................................................................................. Solution 5.2 ............................................................................................................. Solution 5.3 ............................................................................................................. Solution 5.4 ............................................................................................................. Solution 5.5 ............................................................................................................. Solution 5.6 ............................................................................................................. BRIDGE ....................................................................................................................... Solution 6.1 ............................................................................................................. Solution 6.2 ............................................................................................................. Solution 6.3 ............................................................................................................. Solution 6.4 ............................................................................................................. Solution 6.5 ............................................................................................................. Introduction la responsabilit ..................................................................................... Solution 7.1 ............................................................................................................. Solution 7.2 ............................................................................................................. Solution 7.3 ............................................................................................................. Solution 7.4 ............................................................................................................. SINGLETON ................................................................................................................ Solution 8.1 ............................................................................................................. Solution 8.2 ............................................................................................................. Solution 8.3 ............................................................................................................. Solution 8.4 ............................................................................................................ OBSERVER .................................................................................................................. Solution 9.1 ............................................................................................................. Solution 9.2 ............................................................................................................. Solution 9.3 ............................................................................................................. Solution 9.4 ............................................................................................................. Solution 9.5 ............................................................................................................. Solution 9.6 ............................................................................................................. Solution 9.7 ............................................................................................................. MEDIATOR .................................................................................................................. Solution 10.1 ........................................................................................................... Solution 10.2 ........................................................................................................... Solution 10.3 ........................................................................................................... Solution 10.4 ........................................................................................................... Solution 10.5 ...........................................................................................................

345 345 346 346 347 347 348 348 348 348 349 349 350 350 350 351 352 353 353 353 353 353 354 354 354 355 356 356 357 357 358 359 359 360 361 361 362

pattern Livre Page XI Vendredi, 9. octobre 2009 10:31 10

Table des matires

XI

PROXY ......................................................................................................................... Solution 11.1 ........................................................................................................... Solution 11.2 ........................................................................................................... Solution 11.3 ........................................................................................................... Solution 11.4 ........................................................................................................... Solution 11.5 ........................................................................................................... CHAIN OF RESPONSABILITY ................................................................................. Solution 12.1 ........................................................................................................... Solution 12.2 ........................................................................................................... Solution 12.3 ........................................................................................................... Solution 12.4 ........................................................................................................... Solution 12.5 ........................................................................................................... FLYWEIGHT ............................................................................................................... Solution 13.1 ........................................................................................................... Solution 13.2 ........................................................................................................... Solution 13.3 ........................................................................................................... Solution 13.4 ........................................................................................................... Introduction la construction ....................................................................................... Solution 14.1 ........................................................................................................... Solution 14.2 ........................................................................................................... Solution 14.3 ........................................................................................................... BUILDER ..................................................................................................................... Solution 15.1 ........................................................................................................... Solution 15.2 ........................................................................................................... Solution 15.3 ........................................................................................................... Solution 15.4 ........................................................................................................... FACTORY METHOD .................................................................................................. Solution 16.1 ........................................................................................................... Solution 16.2 ........................................................................................................... Solution 16.3 ........................................................................................................... Solution 16.4 ........................................................................................................... Solution 16.5 ........................................................................................................... Solution 16.6 ........................................................................................................... Solution 16.7 ........................................................................................................... ABSTRACT FACTORY ............................................................................................... Solution 17.1 ........................................................................................................... Solution 17.2 ...........................................................................................................

362 362 363 363 363 364 364 364 365 366 366 367 368 368 369 370 370 371 371 372 372 373 373 373 374 374 375 375 376 376 376 377 378 378 379 379 380

pattern Livre Page XII Vendredi, 9. octobre 2009 10:31 10

XII

Table des matires

Solution 17.3 ........................................................................................................... Solution 17.4 ........................................................................................................... Solution 17.5 ........................................................................................................... PROTOTYPE ................................................................................................................ Solution 18.1 ........................................................................................................... Solution 18.2 ........................................................................................................... Solution 18.3 ........................................................................................................... Solution 18.4 ........................................................................................................... MEMENTO .................................................................................................................. Solution 19.1 ........................................................................................................... Solution 19.2 ........................................................................................................... Solution 19.3 ........................................................................................................... Solution 19.4 ........................................................................................................... Solution 19.5 ........................................................................................................... Introduction aux oprations .......................................................................................... Solution 20.1 ........................................................................................................... Solution 20.2 ........................................................................................................... Solution 20.3 ........................................................................................................... Solution 20.4 ........................................................................................................... Solution 20.5 ........................................................................................................... TEMPLATE METHOD ................................................................................................ Solution 21.1 ........................................................................................................... Solution 21.2 ........................................................................................................... Solution 21.3 ........................................................................................................... Solution 21.4 ........................................................................................................... STATE ........................................................................................................................... Solution 22.1 ........................................................................................................... Solution 22.2 ........................................................................................................... Solution 22.3 ........................................................................................................... Solution 22.4 ........................................................................................................... STRATEGY .................................................................................................................. Solution 23.1 ........................................................................................................... Solution 23.2 ........................................................................................................... Solution 23.3 ........................................................................................................... Solution 23.4 ...........................................................................................................

380 381 381 382 382 383 383 384 384 384 385 385 386 386 387 387 387 388 388 388 389 389 389 390 390 390 390 390 391 391 392 392 392 392 393

pattern Livre Page XIII Vendredi, 9. octobre 2009 10:31 10

Table des matires

XIII

COMMAND ................................................................................................................. Solution 24.1 ........................................................................................................... Solution 24.2 ........................................................................................................... Solution 24.3 ........................................................................................................... Solution 24.4 ........................................................................................................... Solution 24.5 ........................................................................................................... Solution 24.6 ........................................................................................................... INTERPRETER ............................................................................................................ Solution 25.1 396 Solution 25.2 ........................................................................................................... Solution 25.3 ........................................................................................................... Solution 25.4 ........................................................................................................... Introduction aux extensions .......................................................................................... Solution 26.1 398 Solution 26.2 ........................................................................................................... Solution 26.3 ........................................................................................................... Solution 26.4 ........................................................................................................... DECORATOR .............................................................................................................. Solution 27.1 399 Solution 27.2 ........................................................................................................... Solution 27.3 ........................................................................................................... Solution 27.4 ........................................................................................................... ITERATOR ................................................................................................................... Solution 28.1 401 Solution 28.2 ........................................................................................................... Solution 28.3 ........................................................................................................... Solution 28.4 ........................................................................................................... VISITOR ....................................................................................................................... Solution 29.1 403 Solution 29.2 ........................................................................................................... Solution 29.3 ........................................................................................................... Solution 29.4 ........................................................................................................... Solution 29.5 ........................................................................................................... Annexe C. Code source dOozinoz ............................................................................... Obtention et utilisation du code source ........................................................................ Construction du code dOozinoz ..................................................................................

393 393 393 395 395 396 396 396 397 397 397 398 398 398 399 399 400 401 401 401 402 402 402 403 403 403 404 404 405 405 406

pattern Livre Page XIV Vendredi, 9. octobre 2009 10:31 10

XIV

Table des matires

Test du code avec JUnit ................................................................................................ Localiser les chiers ..................................................................................................... Rsum ......................................................................................................................... Annexe D. Introduction UML ..................................................................................... Classes .......................................................................................................................... Relations entre classes .................................................................................................. Interfaces ....................................................................................................................... Objets ............................................................................................................................ Etats .............................................................................................................................. Glossaire ............................................................................................................................ Bibliographie ..................................................................................................................... Index ..................................................................................................................................

406 406 407 409 409 412 414 414 416 417 425 427

pattern Livre Page 1 Vendredi, 9. octobre 2009 10:31 10

PrfaceLes patterns de conception sont des solutions de niveaux classe et mthode des problmes courants dans le dveloppement orient objet. Si vous tes dj un programmeur Java intermdiaire et souhaitez devenir avanc, ou bien si vous tes avanc mais navez pas encore tudi les patterns de conception, ce livre est pour vous. Il adopte une approche de cahier dexercices, chaque chapitre tant consacr un pattern particulier. En plus dexpliquer le pattern en question, chaque chapitre inclut un certain nombre dexercices vous demandant dexpliquer quelque chose ou de dvelopper du code pour rsoudre un problme. Nous vous recommandons vivement de prendre le temps deffectuer chaque exercice lorsque vous tombez dessus plutt que de lire le livre dune traite. En mettant en pratique vos connaissances au fur et mesure de leur acquisition, vous apprendrez mieux, mme si vous ne faites pas plus dun ou deux chapitres par semaine.

Conventions de codageLe code des exemples prsents dans ce livre est disponible en ligne. Voyez lAnnexe C pour savoir comment lobtenir. Nous avons utilis le plus souvent un style cohrent avec les conventions de codage de Sun. Les accolades ont t omises lorsque ctait possible. Nous avons d faire quelques compromis pour nous adapter au format du livre. Pour respecter les colonnes troites, les noms de variables sont parfois plus courts que ceux que nous employons habituellement. Et pour viter les complications du contrle de code source, nous avons distingu les multiples versions dun mme chier en accolant un chiffre son nom (par exemple, ShowBallistics2). Vous devriez normalement utiliser le contrle de code source et travailler seulement avec la dernire version dune classe.

pattern Livre Page 2 Vendredi, 9. octobre 2009 10:31 10

2

Prface

RemerciementsNous tenons remercier le dfunt John Vlissides pour ses encouragements et ses recommandations concernant ce livre et dautres. John, diteur de la collection Software Patterns Series et coauteur de louvrage original Design Patterns, tait pour nous un ami et une inspiration. En plus de nous appuyer largement sur Design Patterns, nous nous sommes aussi inspirs de nombreux autres livres. Voyez pour cela la bibliographie en n douvrage. En particulier, The Unied Modeling Language User Guide (le Guide de lutilisateur UML) [Booch, Rambaugh, et Jacobsen 1999] donne une explication claire dUML, et JavaTM in a Nutshell (Java en concentr : Manuel de rfrence pour Java) [Flanagan 2005] constitue une aide concise et prcise sur Java. The Chemistry of Fireworks [Russell 2000] nous a servi de source dinformations pour laborer nos exemples pyrotechniques ralistes. Enn, nous sommes reconnaissants toute lquipe de production pour son travail acharn et son dvouement. Steve Metsker ([email protected]) Bill Wake ([email protected])

pattern Livre Page 3 Vendredi, 9. octobre 2009 10:31 10

1IntroductionCe livre couvre le mme ensemble de techniques que louvrage de rfrence Design Patterns, dErich Gamma, Richard Helm, Ralph Johnson et John Vlissides [Gamma et al. 1995], et propose des exemples en Java. Il inclut de nombreux exercices conus pour vous aider dvelopper votre aptitude appliquer les patterns de conception dans vos programmes. Il sadresse aux dveloppeurs qui connaissent Java et souhaitent amliorer leurs comptences en tant que concepteurs.

Quest-ce quun pattern ?Un pattern, ou modle, est un moyen daccomplir quelque chose, un moyen datteindre un objectif, une technique. Le principe est de compiler les mthodes prouves qui sappliquent de nombreux types defforts, tels que la fabrication daliments, dartices, de logiciels, ou autres. Dans nimporte quel art ou mtier nouveau en voie de maturation, ses pratiquants commencent, un moment donn, laborer des mthodes communes efcaces pour parvenir leurs buts et rsoudre des problmes dans diffrents contextes. Cette communaut invente aussi gnralement un jargon pour pouvoir discuter de son savoir-faire. Une partie de cette terminologie a trait aux modles, ou techniques tablies, permettant dobtenir certains rsultats. A mesure que cet art se dveloppe et que son jargon stoffe, les auteurs commencent jouer un rle important. En documentant les modles de cet art, ils contribuent standardiser son jargon et faire connatre ses techniques.

pattern Livre Page 4 Vendredi, 9. octobre 2009 10:31 10

4

Les Design Patterns en Java

Les 23 modles de conception fondamentaux

Christopher Alexander a t un des premiers auteurs compiler les meilleures pratiques dun mtier en documentant ses modles. Son travail concerne larchitecture, celle des immeubles et non des logiciels. Dans A Pattern Language: Towns, Buildings Construction (Alexander, Ishikouwa, et Silverstein 1977), il dcrit des modles permettant de btir avec succs des immeubles et des villes. Cet ouvrage est puissant et a inuenc la communaut logicielle notamment en raison du sens quil donne au terme objectif (intent). Vous pourriez penser que les modles architecturaux servent principalement concevoir des immeubles. En fait, Alexander tablit clairement que leur objectif est de servir et dinspirer les gens qui occuperont les immeubles et les villes conus daprs ces modles. Son travail a montr que les modles sont un excellent moyen de saisir et de transmettre le savoir-faire et la sagesse dun art. Il prcise galement que comprendre et documenter correctement cet objectif est essentiel, philosophique et difcile. La communaut informatique a fait sienne cette approche en crant de nombreux ouvrages qui documentent des modles de dveloppement logiciel. Ces livres consignent les meilleures pratiques en matire de processus logiciels, danalyse logicielle, darchitecture de haut niveau, et de conception de niveau classe. Il en apparat de nouveaux chaque anne. Lisez les critiques et les commentaires de lecteurs pour faire un choix judicieux.

Quest-ce quun pattern de conception ?Un pattern de conception (design pattern) est un modle qui utilise des classes et leurs mthodes dans un langage orient objet. Les dveloppeurs commencent souvent sintresser la conception seulement lorsquils matrisent un langage de programmation et crivent du code depuis longtemps. Il vous est probablement dj arriv de remarquer que du code crit par quelquun dautre semblait plus simple et plus efcace que le vtre, auquel cas vous avez d vous demander comment son dveloppeur tait parvenu une telle simplicit. Les patterns de conception interviennent un niveau au-dessus du code et indiquent typiquement comment atteindre un but en nutilisant que quelques classes. Un pattern reprsente une ide, et non une implmentation particulire. Dautres dveloppeurs ont dcouvert avant vous comment programmer efcacement dans les langages orients objet. Si vous souhaitez devenir un programmeur

pattern Livre Page 5 Vendredi, 9. octobre 2009 10:31 10

Chapitre 1

Introduction

5

Java avanc, vous devriez tudier les patterns de conception, surtout ceux de ce livre les mmes que ceux expliqus dans Design Patterns. Louvrage Design Patterns dcrit vingt-trois patterns de conception (pour plus de dtails, voir section suivante). De nombreux autres livres ont suivi sur le sujet, aussi dnombre-t-on au moins cent patterns qui valent la peine dtre connus. Les vingttrois patterns recenss par Gamma, Helm, Johnson et Vlissides ne sont pas forcment les plus importants, mais ils sont nanmoins proches du haut de la liste. Ces auteurs ont donc bien choisi et les patterns quils documentent valent certainement la peine que vous les appreniez. Ils vous serviront de rfrence lorsque commencerez tudier les patterns exposs par dautres sources.Liste des patterns dcrits dans louvrage

Patterns dinterface

ADAPTER (17) fournit linterface quun client attend en utilisant les services dune classe dont linterface est diffrente. FACADE (33) fournit une interface simpliant lemploi dun sous-systme. COMPOSITE (47) permet aux clients de traiter de faon uniforme des objets individuels et des compositions dobjets. BRIDGE (63) dcouple une classe qui sappuie sur des oprations abstraites de limplmentation de ces oprations, permettant ainsi la classe et son implmentation de varier indpendamment.Patterns de responsabilit

SINGLETON (81) garantit quune classe ne possde quune seule instance, et fournit un point daccs global celle-ci. OBSERVER (87) dnit une dpendance du type un--plusieurs (1,n) entre des objets de manire ce que lorsquun objet change dtat, tous les objets dpendants en soient notis et soient actualiss an de pouvoir ragir conformment. MEDIATOR (103) dnit un objet qui encapsule la faon dont un ensemble dobjets interagissent. Cela promeut un couplage lche, vitant aux objets davoir se rfrer explicitement les uns aux autres, et permet de varier leur interaction indpendamment.

pattern Livre Page 6 Vendredi, 9. octobre 2009 10:31 10

6

Les Design Patterns en Java

Les 23 modles de conception fondamentaux

PROXY (117) contrle laccs un objet en fournissant un intermdiaire pour cet objet. CHAIN OF RESPONSABILITY (137) vite de coupler lmetteur dune requte son rcepteur en permettant plus dun objet dy rpondre. FLYWEIGHT (145) utilise le partage pour supporter efcacement un grand nombre dobjets forte granularit.Patterns de construction

BUILDER (159) dplace la logique de construction dun objet en-dehors de la classe instancier, typiquement pour permettre une construction partielle ou pour simplier lobjet. FACTORY METHOD (167) laisse un autre dveloppeur dnir linterface permettant de crer un objet, tout en gardant un contrle sur le choix de la classe instancier. ABSTRACT FACTORY (175) permet la cration de familles dobjets ayant un lien ou interdpendants. PROTOTYPE (187) fournit de nouveaux objets par la copie dun exemple. MEMENTO (193) permet le stockage et la restauration de ltat dun objet.Patterns dopration

TEMPLATE METHOD (217) implmente un algorithme dans une mthode, laissant dautres classes le soin de dnir certaines tapes de lalgorithme. STATE (229) distribue la logique dpendant de ltat dun objet travers plusieurs classes qui reprsentent chacune un tat diffrent.STRATEGY (241) encapsule des approches, ou stratgies, alternatives dans des classes distinctes qui implmentent chacune une opration commune.

COMMAND (251) encapsule une requte en tant quobjet, de manire pouvoir paramtrer des clients au moyen de divers types de requtes (de le dattente, de temps ou de journalisation) et de permettre un client de prparer un contexte spcial dans lequel mettre la requte. INTERPRETER (261) permet de composer des objets excutables daprs un ensemble de rgles de composition que vous dnissez.

pattern Livre Page 7 Vendredi, 9. octobre 2009 10:31 10

Chapitre 1

Introduction

7

Patterns dextension

DECORATOR (287) permet de composer dynamiquement le comportement dun objet. ITERATOR (305) fournit un moyen daccder de faon squentielle aux lments dune collection. VISITOR (325) permet de dnir une nouvelle opration pour une hirarchie sans changer ses classes.

JavaLes exemples de ce livre utilisent Java, le langage orient objet (OO) dvelopp par Sun. Ce langage, ses bibliothques et ses outils associs forment une suite de produits pour le dveloppement et la gestion de systmes aux architectures multiniveaux et orientes objet. Limportance de Java tient en partie au fait quil sagit dun langage de consolidation, cest--dire conu pour intgrer les points forts des langages prcdents. Cette consolidation est la cause de son succs et garantit que les langages futurs tendront sinscrire dans sa continuit au lieu de sen loigner radicalement. Votre investissement dans Java ne perdra assurment pas de sa valeur, quel que soit le langage qui lui succde. Les patterns de Design Patterns sappliquent Java, car, comme Smalltalk, C++ et C#, ils se fondent sur un paradigme classe/instance. Java ressemble beaucoup plus Smalltalk et C++ qu Prolog ou Self par exemple. Mme sil ne faut pas ngliger limportance de paradigmes concurrents, le paradigme classe/instance constitue une avance concrte en informatique applique. Le prsent livre emploie Java en raison de sa popularit et parce que son volution suit le chemin des langages que nous utiliserons dans les annes venir.

UMLLorsque les solutions des exercices contiennent du code, ce livre utilise Java. Mais nombre dexercices vous demandent de dessiner un diagramme illustrant les relations entre des classes, des packages et dautres lments. Vous pouvez choisir la notation que vous prfrez, mais sachez que ce livre utilise la notation UML (Unied Modeling Language). Mme si vous la connaissez dj, il peut tre utile

pattern Livre Page 8 Vendredi, 9. octobre 2009 10:31 10

8

Les Design Patterns en Java

Les 23 modles de conception fondamentaux

davoir une rfrence porte de main. Vous pouvez consulter deux ouvrages de qualit : The Unied Modeling Language User Guide (le Guide de lutilisateur UML) [Booch, Rumbaugh, et Jacobsen 1999] et UML Distilled [Fowler et Scott 2003]. Les connaissances minimales dont vous avez besoin pour ce livre sont donnes dans lAnnexe D consacre UML.

ExercicesMme si vous lisez de nombreux ouvrages sur un sujet, vous naurez le sentiment de le matriser vraiment quen le pratiquant. Tant que vous nappliquerez pas concrtement les connaissances acquises, certaines subtilits et approches alternatives vous chapperont. Le seul moyen de gagner de lassurance avec les patterns de conception est de les appliquer dans le cadre dexercices pratiques. Le problme lorsque lon apprend en faisant est que lon peut causer des dgts. Vous ne pouvez pas appliquer les patterns de conception dans du code en production si vous ne les matrisez pas. Mais il faut bien que vous commenciez les appliquer pour acqurir ce savoir-faire. La solution est de vous familiariser avec les patterns au travers dexemples de problmes, o vos erreurs seront sans consquence mais instructives. Chaque chapitre de ce livre dbute par une courte introduction puis prsente progressivement une srie dexercices. Lorsque vous avez trouv une solution, vous pouvez la comparer aux rponses proposes dans lAnnexe B. Il se peut que la solution du livre adopte une approche diffrente de la vtre, vous faisant voir les choses sous une autre perspective. Vous ne pouvez probablement pas prvoir le temps quil vous faudra pour trouver les rponses aux exercices. Si vous consultez dautres livres, travaillez avec un collgue et crivez des chantillons de code pour vrier votre solution, cest parfait ! Vous ne regretterez pas lnergie et le temps investis. Un avertissement : si vous vous contentez de lire les solutions immdiatement aprs avoir lu un exercice, vous ne tirerez pas un grand enseignement de ce livre. Ces solutions ne vous seront daucune utilit si vous nlaborez pas dabord les vtres pour pouvoir ensuite les leur comparer et tirer les leons de vos erreurs.

pattern Livre Page 9 Vendredi, 9. octobre 2009 10:31 10

Chapitre 1

Introduction

9

Organisation du livreIl existe de nombreuses faons dorganiser et de classer les patterns de conception. Vous pourriez les organiser en fonction de leurs similitudes sur le plan structurel, ou bien suivre lordre de Design Patterns. Mais laspect le plus important dun pattern est son objectif, cest--dire la valeur potentielle lie son application. Le prsent livre organise les vingt-trois patterns de Design Patterns en fonction de leur objectif. Reste ensuite dterminer comment catgoriser ces objectifs. Nous sommes partis du principe que lobjectif dun pattern de conception peut gnralement tre exprim comme tant le besoin daller plus loin que les fonctionnalits ordinaires intgres Java. Par exemple, Java offre un large support pour la dnition des interfaces implmentes par les classes. Mais si vous disposez dj dune classe dont vous aimeriez modier linterface pour quelle corresponde aux exigences dun client, vous pourriez dcider dappliquer le pattern ADAPTER. Lobjectif de ce pattern est de vous aider complmenter les fonctionnalits dinterface intgres Java. Ce livre regroupe les patterns de conception en cinq catgories que voici : 1. Interfaces. 2. Responsabilit. 3. Construction. 4. Oprations. 5. Extensions. Ces cinq catgories correspondent aux cinq parties du livre. Chaque partie dbute par un chapitre qui prsente et remet en question les fonctionnalits Java lies au type dobjectif dont il est question. Par exemple, le premier chapitre de la Partie I traite des interfaces Java ordinaires. Il vous amne rchir sur la structure des interfaces Java, notamment en les comparant aux classes abstraites. Les autres chapitres de cette partie dcrivent les patterns qui ont pour principal objectif de dnir une interface, cest--dire lensemble des mthodes quun client peut appeler partir dun fournisseur de services. Chacun deux rpond un besoin que les interfaces Java ne peuvent satisfaire elles seules.

pattern Livre Page 10 Vendredi, 9. octobre 2009 10:31 10

10

Les Design Patterns en Java

Les 23 modles de conception fondamentaux

Ce classement des patterns par objectifs ne signie pas que chaque pattern supporte seulement un type dobjectif. Lorsquil en supporte plusieurs, il fait lobjet dun chapitre entier dans la premire partie laquelle il sapplique puis il est mentionn brivement dans les autres parties concernes. Le Tableau 1.1 illustre la catgorisation sous-jacente lorganisation du livre.Tableau 1.1 : Une catgorisation des patterns par objectifs

Objectif Interfaces Responsabilit Construction Oprations Extensions

Patterns

ADAPTER, FACADE, COMPOSITE, BRIDGE SINGLETON, OBSERVER, MEDIATOR, PROXY, CHAIN OF RESPONSIBILITY, FLYWEIGHT BUILDER, FACTORY METHOD, ABSTRACT FACTORY, PROTOTYPE, MEMENTO TEMPLATE METHOD, STATE, STRATEGY, COMMAND, INTERPRETER DECORATOR, ITERATOR, VISITOR

Nous esprons que ce classement vous amnera vous interroger. Pensez-vous aussi que SINGLETON a trait la responsabilit, et non la construction ? COMPOSITE est-il rellement un pattern dinterface ? Toute catgorisation est subjective. Mais vous conviendrez certainement que le fait de rchir lobjectif des patterns et la faon de les appliquer est un exercice trs utile.

Oozinoz Les exercices de ce livre citent tous des exemples dOozinoz Fireworks, une entreprise ctive qui fabrique et vend des pices pour feux dartice et organise des vnements pyrotechniques. Vous pouvez vous procurer le code de ces exemples ladresse www.oozinoz.com. Pour en savoir plus sur la compilation et le test du code, voyez lAnnexe C.

pattern Livre Page 11 Vendredi, 9. octobre 2009 10:31 10

Chapitre 1

Introduction

11

Rsum Les patterns de conception distillent une sagesse vieille de quelques dizaines dannes qui tablit un jargon standard, permettant aux dveloppeurs de nommer les concepts quils appliquent. Ceux abords dans louvrage de rfrence Design Patterns font partie des patterns de niveau classe les plus utiles et mritent que vous les appreniez. Le prsent livre reprend ces patterns mais utilise Java et ses bibliothques pour ses exemples et exercices. En ralisant les exercices proposs, vous apprendrez reconnatre et appliquer une part importante de la sagesse de la communaut logicielle.

pattern Livre Page 12 Vendredi, 9. octobre 2009 10:31 10

pattern Livre Page 13 Vendredi, 9. octobre 2009 10:31 10

IPatterns dinterface

pattern Livre Page 14 Vendredi, 9. octobre 2009 10:31 10

pattern Livre Page 15 Vendredi, 9. octobre 2009 10:31 10

2Introduction aux interfacesPour parler de manire abstraite, linterface dune classe est lensemble des mthodes et champs de la classe auxquels des objets dautres classes sont autoriss accder. Elle constitue gnralement un engagement que les mthodes accompliront lopration signie par leur nom et tel que spcie par les commentaires, les tests et autres documentations du code. Limplmentation dune classe est le code contenu dans ses mthodes. Java fait du concept dinterface une structure distincte, sparant expressment linterface ce quun objet doit faire de limplmentation comment un objet remplit cet engagement. Les interfaces Java permettent plusieurs classes doffrir la mme fonctionnalit et une mme classe dimplmenter plusieurs interfaces. Plusieurs patterns de conception emploient les fonctionnalits intgres Java. Par exemple, vous pourriez utiliser une interface pour adapter linterface dune classe an de rpondre aux besoins dun client en appliquant le pattern ADAPTER. Mais avant daborder certaines notions avances, il peut tre utile de sassurer que vous matrisez les fonctionnalits de base, commencer par les interfaces.

pattern Livre Page 16 Vendredi, 9. octobre 2009 10:31 10

16

Partie I

Patterns dinterface

Interfaces et classes abstraitesLe livre original Design Patterns [Gamma et al. 1995] mentionne frquemment lemploi de classes abstraites mais pas du tout lemploi dinterfaces. La raison en est que les langages C++ et Smalltalk, sur lesquels il sappuie pour ses exemples, ne possdent pas une telle structure. Cela ne remet toutefois pas en cause lutilit de ce livre pour les dveloppeurs Java, tant donn que les interfaces Java sont assez semblables aux classes abstraites. Exercice 2.1 Enumrez trois diffrences entre les classes abstraites et les interfaces Java.

b Les solutions des exercices de ce chapitre sont donnes dans lAnnexe B.Si les interfaces nexistaient pas, vous pourriez utiliser la place des classes abstraites, comme dans C++. Les interfaces jouent toutefois un rle essentiel dans le dveloppement dapplications multiniveaux, ce qui justie certainement leur statut particulier de structure distincte. Considrez la dnition dune interface que les classes de simulation de fuse doivent implmenter. Les ingnieurs conoivent toutes sortes de fuses, quelles soient combustible solide ou liquide, avec des caractristiques balistiques trs diverses. Indpendamment de sa composition, la simulation dune fuse doit fournir des chiffres pour la pousse (thrust) et la masse (mass). Voici le code quutilise Oozinoz pour dnir linterface de simulation de fuse :package com.oozinoz.simulation; public interface RocketSim { abstract double getMass(); public double getThrust(); void setSimTime(double t); }

pattern Livre Page 17 Vendredi, 9. octobre 2009 10:31 10

Chapitre 2

Introduction aux interfaces

17

Exercice 2.2 Parmi les afrmations suivantes, lesquelles sont vraies ? A. Les mthodes de linterface RocketSim sont toutes trois abstraites, mme si seulement getMass() dclare cela explicitement. B. Les trois mthodes de linterface sont publiques, mme si seulement getThrust() dclare cela explicitement. C. Linterface est dclare public interface, mais elle serait publique mme si le mot cl public tait omis. D. Il est possible de crer une autre interface, par exemple RocketSimSolid, qui tende RocketSim. E. Toute interface doit comporter au moins une mthode. F. Une interface peut dclarer des champs dinstance quune classe dimplmentation doit galement dclarer. G. Bien quil ne soit pas possible dinstancier une interface, une interface peut dclarer des mthodes constructeurs dont la signature sera donne par une classe dimplmentation.

Interfaces et obligationsUn avantage important des interfaces Java est quelles limitent linteraction entre les objets. Cette limitation savre tre un soulagement. En effet, une classe qui implmente une interface peut subir des changements considrables dans sa faon de remplir le contrat dni par linterface sans que cela affecte aucunement ses clients. Un dveloppeur qui cre une classe implmentant RocketSim a pour tche dcrire les mthodes getMass() et getThrust() qui retournent les mesures de performance dune fuse. Autrement dit, il doit remplir le contrat de ces mthodes. Parfois, les mthodes dsignes par une interface nont aucune obligation de fournir un service lappelant. Dans certains cas, la classe dimplmentation peut mme ignorer lappel, implmentant une mthode avec un corps vide.

pattern Livre Page 18 Vendredi, 9. octobre 2009 10:31 10

18

Partie I

Patterns dinterface

Exercice 2.3 Donnez un exemple dinterface avec des mthodes nimpliquant aucune responsabilit pour la classe dimplmentation de retourner une valeur ou daccomplir une quelconque action pour le compte de lappelant. Si vous crez une interface qui spcie un ensemble de mthodes de notication, vous pourriez envisager dutiliser une classe stub, cest--dire une classe qui implmente linterface avec des mthodes ne faisant rien. Les dveloppeurs peuvent driver des sous-classes de la classe stub, en rednissant uniquement les mthodes de linterface qui sont importantes pour leur application. La classe WindowAdapter dans java.awt.event est un exemple dune telle classe, comme illustr Figure 2.1 (pour une introduction rapide UML, voyez lAnnexe D). Cette classe implmente toutes les mthodes de linterface WindowListener mais les implmentations sont vides ; ces mthodes ne contiennent aucune instruction.

interface WindowListener

WindowAdapter

windowActivated() windowClosed() windowClosing() windowDeactivated() windowDeiconified() windowIconified() windowOpened() windowStateChanged() windowGainedFocus() windowLostFocus()

windowActivated() windowClosed() windowClosing() windowDeactivated() windowDeiconified() windowIconified() windowOpened() windowStateChanged() windowGainedFocus() windowLostFocus()

Figure 2.1La classe WindowAdapter facilite lenregistrement de listeners pour les vnements de fentre en vous permettant dignorer ceux qui ne vous intressent pas.

pattern Livre Page 19 Vendredi, 9. octobre 2009 10:31 10

Chapitre 2

Introduction aux interfaces

19

En plus de dclarer des mthodes, une interface peut dclarer des constantes. Dans lexemple suivant, ClassificationConstants dclare deux constantes auxquelles les classes implmentant cette interface auront accs :public interface ClassificationConstants { static final int CONSUMER = 1; static final int DISPLAY = 2; }

Une autre diffrence notable existe entre les interfaces et les classes abstraites. Tout en dclarant quelle tend (extends) une autre classe, une classe peut aussi dclarer quelle implmente (implements) une ou plusieurs interfaces.

RsumLa puissance des interfaces rside dans le fait quelles stipulent ce qui est attendu et ce qui ne lest pas en matire de collaboration entre classes. Elles sont semblables aux classes purement abstraites en ce quelles dnissent des attentes mais ne les implmentent pas. Matriser la fois les concepts et les dtails de lapplication des interfaces Java demande du temps, mais le sacrice en vaut la peine. Cette structure puissante est au cur de nombreuses conceptions robustes et de plusieurs patterns de conception.

Au-del des interfaces ordinairesVous pouvez simplier et renforcer vos conceptions grce une application approprie des interfaces Java. Parfois, cependant, la conception dune interface doit dpasser sa dnition et son utilisation ordinaires.Si vous envisagez de Adapter linterface dune classe pour quelle corresponde linterface attendue par un client Fournir une interface simple pour un ensemble de classes Dnir une interface qui sapplique la fois des objets individuels et des groupes dobjets Dcoupler une abstraction de son implmentation de sorte que les deux puissent varier indpendamment Appliquez le pattern

ADAPTER FACADE COMPOSITE BRIDGE

pattern Livre Page 20 Vendredi, 9. octobre 2009 10:31 10

20

Partie I

Patterns dinterface

Lobjectif de chaque pattern de conception est de rsoudre un problme dans un certain contexte. Les patterns dinterface conviennent dans des contextes o vous avez besoin de dnir ou de rednir laccs aux mthodes dune classe ou dun groupe de classes. Par exemple, lorsque vous disposez dune classe qui accomplit un service ncessaire, mais dont les noms de mthodes ne correspondent pas aux attentes dun client, vous pouvez appliquer le pattern ADAPTER.

pattern Livre Page 21 Vendredi, 9. octobre 2009 10:31 10

3ADAPTERUn objet est un client lorsquil a besoin dappeler votre code. Dans certains cas, votre code existe dj et le dveloppeur peut crer le client de manire ce quil utilise les interfaces de vos objets. Dans dautres, le client peut tre dvelopp indpendamment de votre code. Par exemple, un programme de simulation de fuse pourrait tre conu pour utiliser les informations techniques que vous fournissez, mais une telle simulation aurait sa propre dnition du comportement que doit avoir une fuse. Si une classe existante est en mesure dassurer les services requis par un client mais que ses noms de mthodes diffrent, vous pouvez appliquer le pattern ADAPTER. Lobjectif du pattern ADAPTER est de fournir linterface quun client attend en utilisant les services dune classe dont linterface est diffrente.

Adaptation une interfaceLe dveloppeur dun client peut avoir prvu les situations o vous aurez besoin dadapter votre code au sien. Cela est vident sil a fourni une interface qui dnit les services dont le code client a besoin, comme dans lexemple de la Figure 3.1. Une classe cliente invoque une mthode mthodeRequise() dclare dans une interface. Supposez que vous avez trouv une classe existante avec une mthode nomme par exemple mthodeUtile() capable de rpondre aux besoins du client. Vous pouvez alors adapter cette classe au client en crivant une classe qui tend ClasseExistante, implmente InterfaceRequise et rednit mthodeRequise() de sorte quelle dlgue ses demandes mthodeUtile(). La classe NouvelleClasse est un exemple de ADAPTER. Une instance de cette classe est une instance de InterfaceRequise. En dautres termes, NouvelleClasse rpond aux besoins du client.

pattern Livre Page 22 Vendredi, 9. octobre 2009 10:31 10

22

Partie I

Patterns dinterface

Figure 3.1Lorsque le dveloppeur du code client dnit prcisment les besoins du client, vous pouvez remplir le contrat dni par linterface en adaptant le code existant.

Client

interface InterfaceRequise ClasseExistante

mthodeRequise()

mthodeUtile()

NouvelleClasse

mthodeRequise()

Pour prendre un exemple plus concret, imaginez que vous travailliez avec un package qui simule le vol et le minutage de fuses comme celles fabriques par Oozinoz. Ce package inclut un simulateur dvnements qui couvre les effets du lancement de plusieurs fuses, ainsi quune interface qui spcie le comportement dune fuse. La Figure 3.2 illustre ce package. Vous disposez dune classe PhysicalRocket que vous voulez inclure dans la simulation. Cette classe possde des mthodes qui correspondent approximativement au comportement requis par le simulateur. Vous pouvez donc appliquer ADAPTER en drivant de PhysicalRocket une sous-classe qui implmente linterface RocketSim. La Figure 3.3 illustre partiellement cette conception. La classe PhysicalRocket contient les informations dont le simulateur a besoin, mais ses mthodes ne correspondent pas exactement celles que le programme de simulation dclare dans linterface RocketSim. Cette diffrence tient au fait que le simulateur possde une horloge interne et actualise occasionnellement les objets simuls en invoquant une mthode setSimTime(). Pour adapter la classe PhysicalRocket aux exigences du simulateur, un objet OozinozRocket pourrait utiliser une variable dinstance time et la passer aux mthodes de la classe PhysicalRocket lorsque ncessaire.

pattern Livre Page 23 Vendredi, 9. octobre 2009 10:31 10

Chapitre 3

ADAPTER

23

com.oozinoz.simulation

EventSim

interface RocketSim

getMass():double

Figure 3.2Le package Simulation dnit clairement ses exigences pour simuler le vol dune fuse.

PhysicalRocket interface RocketSim PhysicalRocket( burnArea:double, burnRate:double, fuelMass:double, totalMass:double) getBurnTime():double getMass(t:double):double getThrust(t:double):double

getMass():double getThrust():double setSimTime(t:double)

OozinozRocket

Figure 3.3Une fois complt, ce diagramme reprsentera la conception dune classe qui adapte la classe PhysicalRocket pour rpondre aux exigences de linterface RocketSim.

pattern Livre Page 24 Vendredi, 9. octobre 2009 10:31 10

24

Partie I

Patterns dinterface

Exercice 3.1 Compltez le diagramme de la Figure 3.3 en faisant en sorte que la classe OozinozRocket permette un objet PhysicalRocket de prendre part une simulation en tant quobjet RocketSim. Partez du principe que vous ne pouvez modier ni RocketSim ni PhysicalRocket.

b Les solutions des exercices de ce chapitre sont donnes dans lAnnexe B.Le code de PhysicalRocket est un peu complexe car il runit toutes les caractristiques physiques dont se sert Oozinoz pour modliser une fuse. Mais cest exactement la logique que nous voulons rutiliser. La classe adaptateur OozinozRocket traduit simplement les appels pour utiliser les mthodes de sa super-classe. Le code de cette nouvelle sous-classe pourrait ressembler ce qui suit :package com.oozinoz.firework; import com.oozinoz.simulation.*; public class OozinozRocket extends PhysicalRocket implements RocketSim { private double time; public OozinozRocket( double burnArea, double burnRate, double fuelMass, double totalMass) { super(burnArea, burnRate, fuelMass, totalMass); } public double getMass() { // Exercice ! } public double getThrust() { // Exercice ! } public void setSimTime(double time) { this.time = time; } }

Exercice 3.2 Compltez le code de la classe OozinozRocket en dnissant les mthodes getMass() et getThrust().

pattern Livre Page 25 Vendredi, 9. octobre 2009 10:31 10

Chapitre 3

ADAPTER

25

Lorsquun client dnit ses attentes dans une interface, vous pouvez appliquer ADAPTER en fournissant une classe qui implmente cette interface et tend une classe existante. Il se peut aussi que vous puissiez appliquer ce pattern mme en labsence dune telle interface, auquel cas il convient dutiliser un adaptateur dobjet.

Adaptateurs de classe et dobjetLes conceptions des Figures 3.1 et 3.3 sont des adaptateurs de classe, cest--dire que ladaptation procde de la drivation de sous-classes. Dans une telle conception, la nouvelle classe adaptateur implmente linterface dsire et tend une classe existante. Cette approche ne fonctionne pas toujours, notamment lorsque lensemble de mthodes que vous voulez adapter nest pas spci dans une interface. Dans ce cas, vous pouvez crer un adaptateur dobjet, cest--dire un adaptateur qui utilise la dlgation plutt que la drivation de sous-classes. La Figure 3.4 illustre cette conception (comparez-la aux diagrammes prcdents).

Client

ClasseRequise

ClasseExistante

mthodeRequise()

mthodeUtile()

NouvelleClasse

mthodeRequise()

Figure 3.4Vous pouvez crer un adaptateur dobjet en drivant la sous-classe dont vous avez besoin et en remplissant les contrats des mthodes en vous appuyant sur un objet dune classe existante.

pattern Livre Page 26 Vendredi, 9. octobre 2009 10:31 10

26

Partie I

Patterns dinterface

La classe NouvelleClasse est un exemple de ADAPTER. Une instance de cette classe est une instance de ClasseRequise. En dautres termes, NouvelleClasse rpond aux besoins du client. Elle peut adapter la classe ClasseExistante pour satisfaire le client en utilisant une instance de cette classe. Pour prendre un exemple plus concret, imaginez que le package de simulation fonctionne directement avec une classe Skyrocket, sans spcier dinterface dnissant les comportements ncessaires pour la simulation. La Figure 3.5 illustre cette classe.Figure 3.5Dans cette conception-ci, le package com.oozinoz.simulation ne spcie pas linterface dont il a besoin pour modliser une fuse.com.oozinoz.simulation

EventSim

Skyrocket

Skyrocket( mass:double, thrust:double burnTime:double) getMass():double getThrust():double setSimTime(t:double)

La classe Skyrocket utilise un modle physique assez rudimentaire. Par exemple, elle part du principe que la fuse se consume entirement mesure que son carburant brle. Supposez que vous vouliez appliquer le modle plus sophistiqu offert par la classe PhysicalRocket dOozinoz. Pour adapter la logique de cette classe la simulation, vous pourriez crer une classe OozinozSkyrocket en tant quadaptateur dobjet qui tend Skyrocket et utilise un objet PhysicalRocket, comme le montre la Figure 3.6.

pattern Livre Page 27 Vendredi, 9. octobre 2009 10:31 10

Chapitre 3

ADAPTER

27

Skyrocket #simTime:double ... Skyrocket( mass:double, thrust:double burnTime:double) getMass():double getThrust():double setSimTime(t:double)

PhysicalRocket

PhysicalRocket( burnArea:double, burnRate:double, fuelMass:double, totalMass:double) getBurnTime():double getMass(t:double):double getThrust(t:double):double

OozinozSkyrocket

Figure 3.6Une fois complt, ce diagramme reprsentera la conception dun adaptateur dobjet qui sappuie sur les informations dune classe existante pour satisfaire le besoin dun client dutiliser un objet Skyrocket.

En tant quadaptateur dobjet, la classe OozinozSkyrocket tend Skyrocket, et non PhysicalRocket. Cela permet un objet OozinozSkyrocket de servir de substitut chaque fois que le client requiert un objet Skyrocket. La classe Skyrocket supporte la drivation de sous-classes en dnissant sa variable simTime comme tant protected. Exercice 3.3 Compltez le diagramme de la Figure 3.6 en faisant en sorte que des objets OozinozSkyrocket puissent servir dobjets Skyrocket.

pattern Livre Page 28 Vendredi, 9. octobre 2009 10:31 10

28

Partie I

Patterns dinterface

Le code de la classe OozinozSkyrocket pourrait ressembler ce qui suit :package com.oozinoz.firework; import com.oozinoz.simulation.*; public class OozinozSkyrocket extends Skyrocket { private PhysicalRocket rocket; public OozinozSkyrocket(PhysicalRocket r) { super( r.getMass(0), r.getThrust(0), r.getBurnTime()); rocket = r; } public double getMass() { return rocket.getMass(simTime); } public double getThrust() { return rocket.getThrust(simTime); } }

La classe OozinozSkyrocket vous permet de fournir un objet OozinozSkyrocket chaque fois que le package requiert un objet Skyrocket. En gnral, les adaptateurs dobjet rsolvent, partiellement du moins, le problme pos par ladaptation dun objet une interface qui na pas t expressment dnie. Exercice 3.4 Citez une raison pour laquelle la conception dadaptateur dobjet utilise pa r la classe OozinozSkyrocket est plus fragile que lapproche avec adaptateur de classe. Ladaptateur dobjet pour la classe Skyrocket est une conception plus risque que ladaptateur de classe qui implmente linterface RocketSim. Mais il ne faut pas trop se plaindre. Au moins, aucune mthode na t dnie comme tant final, ce qui nous aurait empchs de la rednir.

pattern Livre Page 29 Vendredi, 9. octobre 2009 10:31 10

Chapitre 3

ADAPTER

29

Adaptation de donnes pour un widget JTableLafchage de donnes sous forme de table donne lieu un exemple courant dadaptateur dobjet. Swing fournit le widget JTable pour afcher des tables. Les concepteurs de ce widget ne savaient naturellement pas quelles donnes il servirait afcher. Aussi, plutt que de coder en dur certaines structures de donnes, ils ont prvu une interface appele TableModel (voir Figure 3.7) dont dpend le fonctionnement de JTable. Il vous revient ensuite de crer un adaptateur pour que vos donnes soient conformes TableModel.Figure 3.7La classe JTable est un composant Swing qui afche dans une table de GUI les donnes dune implmentation de TableModel.JTable TableModel addTableModelListener() getColumnClass() getColumnCount() getColumnName() getRowCount() getValueAt() isCellEditable() removeTableModelListener() setValueAt()

Nombre des mthodes de TableModel suggrent la possibilit dune implmentation par dfaut. Heureusement, le JDK (Java Development Kit) inclut une classe abstraite qui fournit des implmentations par dfaut pour toutes les mthodes de cette interface lexception de celles qui sont trs spciques un domaine. La Figure 3.8 illustre cette classe. Imaginez que vous souhaitiez lister quelques fuses dans une table en utilisant une interface utilisateur Swing. Comme le montre la Figure 3.9, vous pourriez crer une classe RocketTableModel qui adapte un tableau de fuses linterface attendue par TableModel. La classe RocketTableModel doit tendre AbstractTableModel puisque cette dernire est une classe et non une interface. Lorsque linterface cible de ladaptation est supporte par une classe abstraite que vous souhaitez utiliser, vous devez

pattern Livre Page 30 Vendredi, 9. octobre 2009 10:31 10

30

Partie I

Patterns dinterface

Figure 3.8La classe AbstractTableModel prvoit des implmentations par dfaut pour presque toutes les mthodes de TableModel.javax.swing.table

TableModel

AbstractTableModel

getColumnCount() getRowCount() getValueAt()

TableModel Rocket

AbstractTableModel

getName():String getPrice():Dollars getApogee():double

RocketTableModel #rockets[]:Rocket #columnNames[]:String RocketTableModel(rockets[]:Rocket) getColumnCount() getColumnName(i:int) getRowCount() getValueAt(row:int,col:int)

Figure 3.9La classe RocketTableModel adapte linterface TableModel la classe Rocket du domaine Oozinoz.

pattern Livre Page 31 Vendredi, 9. octobre 2009 10:31 10

Chapitre 3

ADAPTER

31

crer un adaptateur dobjet. Dans notre exemple, une autre raison qui justie de ne pas recourir un adaptateur de classe est que RocketTableModel nest ni un type ni un sous-type de Rocket. Lorsquune classe adaptateur doit tirer ses informations de plusieurs objets, elle est habituellement implmente en tant quadaptateur dobjet. Retenez la diffrence : un adaptateur de classe tend une classe existante et implmente une interface cible tandis quun adaptateur dobjet tend une classe cible et dlgue une classe existante. Une fois la classe RocketTableModel cre, vous pouvez facilement afcher des informations sur les fuses dans un objet Swing JTable, comme illustr Figure 3.10.Figure 3.10Une instance de JTable contenant des donnes sur les fuses.

package app.adapter; import javax.swing.table.*; import com.oozinoz.firework.Rocket; public class RocketTableModel extends AbstractTableModel { protected Rocket[] rockets; protected String[] columnNames = new String[] { "Name", "Price", "Apogee" }; public RocketTableModel(Rocket[] rockets) { this.rockets = rockets; } public int getColumnCount() { // Exercice ! } public String getColumnName(int i) { // Exercice ! } public int getRowCount() { // Exercice ! } public Object getValueAt(int row, int col) { // Exercice ! } }

pattern Livre Page 32 Vendredi, 9. octobre 2009 10:31 10

32

Partie I

Patterns dinterface

Exercice 3.5 Compltez le code des mthodes de RocketTableModel qui adaptent un tableau dobjets Rocket pour quil serve dinterface TableModel. Pour obtenir le rsultat de la Figure 3.10, vous pouvez crer deux objets fuse, les placer dans un tableau, crer une instance de RocketTableModel partir du tableau, et utiliser des classes Swing pour afcher ce dernier. La classe ShowRocketTable en donne un exemple :package app.adapter; import java.awt.Component; import java.awt.Font; import javax.swing.*; import com.oozinoz.firework.Rocket; import com.oozinoz.utility.Dollars; public class ShowRocketTable { public static void main(String[] args) { setFonts(); JTable table = new JTable(getRocketTable()); table.setRowHeight(36); JScrollPane pane = new JScrollPane(table); pane.setPreferredSize( new java.awt.Dimension(300, 100)); display(pane, " Rockets"); } public static void display(Component c, String title) { JFrame frame = new JFrame(title); frame.getContentPane().add(c); frame.setDefa