Les Designs Patterns en Java 9782744040979

download Les Designs Patterns en Java 9782744040979

of 451

Transcript of Les Designs Patterns en Java 9782744040979

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    1/450

    Rfrence

    Rseauxet tlcom

    Programmation

    Gnie logiciel

    Scurit

    Systmedexploitation

    design pattern

    Java

    Les

    enLes 23 modlesde conceptionfondamentaux

    Steven John Metsker

    William C. Wake

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    2/450

    Les DesignPatterns en JavaLes 23 modles de conception fondamentaux

    Steven John Metsker

    et William C. Wake

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    3/450

    Pearson Education France a apport le plus grand soin la ralisation de ce livre afin de vous four-

    nir une information complte et fiable. Cependant, Pearson Education France nassume de respon-

    sabilits, 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.

    Aucune reprsentation ou reproduction, mme partielle, autre que celles prvues larticle L. 122-5 2 et 3 a) du code de laproprit intellectuelle ne peut tre faite sans lautorisation expresse de Pearson Education France ou, le cas chant, sansle 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 ormechanical, including photocopying, recording or by any information storage retrieval system, without permission fromPearson Education, Inc.

    Publi par Pearson Education France

    47 bis, rue des Vinaigriers

    75010 PARISTl. : 01 72 74 90 00

    www.pearson.fr

    Mise en pages : TyPAO

    Copyright 2009 Pearson Education France

    Tous droits rservs

    Titre original : Design Patterns in Java

    Traduit de lamricain par Freenet Sofor ltd

    ISBN original : 0-321-33302-0

    Copyright 2006 by Addison-Wesley

    Tous droits rservs

    ISBN : 978-2-7440-4097-9

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    4/450

    Table des matires

    Prface .............................................................................................................................. 1

    Conventions de codage ................................................................................................. 1

    Remerciements ............................................................................................................. 2

    Chapitre 1. Introduction ................................................................................................. 3

    Quest-ce quun pattern ? .............................................................................................. 3

    Quest-ce quun pattern de conception ? ...................................................................... 4

    Liste des patterns dcrits dans louvrage ................................................................ 5

    Java ............................................................................................................................... 7

    UML ............................................................................................................................. 7

    Exercices ....................................................................................................................... 8

    Organisation du livre ..................................................................................................... 9

    Oozinoz ......................................................................................................................... 10

    Rsum ......................................................................................................................... 11

    Partie I

    Patterns dinterface

    Chapitre 2. Introduction aux interfaces ........................................................................ 15

    Interfaces et classes abstraites ....................................................................................... 16

    Interfaces et obligations ................................................................................................ 17

    Rsum ......................................................................................................................... 19

    Au-del des interfaces ordinaires .................................................................................. 19

    Chapitre 3. ADAPTER .................................................................................................... 21

    Adaptation une interface ............................................................................................ 21

    Adaptateurs de classe et dobjet ................................................................................... 25

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    5/450

    IV Table des matires

    Adaptation de donnes pour un widget JTable .......................................................... 29

    Identification dadaptateurs .......................................................................................... 33

    Rsum ......................................................................................................................... 34

    Chapitre 4. FACADE ....................................................................................................... 35

    Faades, utilitaires et dmos ......................................................................................... 36

    Refactorisation pour appliquer FACADE ....................................................................... 37

    Rsum ......................................................................................................................... 46

    Chapitre 5. COMPOSITE .............................................................................................. 47

    Un composite ordinaire ................................................................................................. 47

    Comportement rcursif dans les objets composites ...................................................... 48

    Objets composites, arbres et cycles .............................................................................. 50

    Des composites avec des cycles .................................................................................... 55

    Consquences des cycles .............................................................................................. 59

    Rsum ......................................................................................................................... 60

    Chapitre 6. BRIDGE ....................................................................................................... 61

    Une abstraction ordinaire .............................................................................................. 61

    De labstraction au pattern BRIDGE ............................................................................. 64

    Des drivers en tant que BRIDGE ................................................................................... 66

    Drivers de base de donnes ........................................................................................... 67Rsum ......................................................................................................................... 69

    Partie II

    Patterns de responsabilit

    Chapitre 7. Introduction la responsabilit ................................................................. 73

    Responsabilit ordinaire ............................................................................................... 73

    Contrle de la responsabilit grce la visibilit ......................................................... 75

    Rsum ......................................................................................................................... 77

    Au-del de la responsabilit ordinaire .......................................................................... 77

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    6/450

    Table des matires V

    Chapitre 8. SINGLETON ............................................................................................... 79

    Le mcanisme de SINGLETON ..................................................................................... 79

    Singletons et threads ..................................................................................................... 81

    Identification de singletons ........................................................................................... 82

    Rsum ......................................................................................................................... 84

    Chapitre 9. OBSERVER ................................................................................................. 85

    Un exemple classique : OBSERVER dans les interfaces utilisateurs ............................... 85

    Modle-Vue-Contrleur ................................................................................................ 90

    Maintenance dun objet Observable ......................................................................... 96

    Rsum ......................................................................................................................... 99

    Chapitre 10. MEDIATOR ............................................................................................... 101

    Un exemple classique : mdiateur de GUI ................................................................... 101Mdiateur dintgrit relationnelle ............................................................................... 106

    Rsum ......................................................................................................................... 112

    Chapitre 11. PROXY ....................................................................................................... 115

    Un exemple classique : proxy dimage ......................................................................... 115

    Reconsidration des proxies dimage ........................................................................... 120

    Proxy distant ................................................................................................................. 122

    Proxy dynamique .......................................................................................................... 128

    Rsum ......................................................................................................................... 133

    Chapitre 12. CHAIN OF RESPONSABILITY ............................................................. 135

    Une chane de responsabilits ordinaire ....................................................................... 135

    Refactorisation pour appliquer CHAIN OF RESPONSABILITY ................................... 137

    Ancrage dune chane de responsabilits ...................................................................... 140

    CHAIN OF RESPONSABILITY sans COMPOSITE ......................................................... 142

    Rsum ......................................................................................................................... 142

    Chapitre 13. FLYWEIGHT ............................................................................................ 143

    Immuabilit ................................................................................................................... 143Extraction de la partie immuable dun flyweight ......................................................... 144

    Partage des objets flyweight ......................................................................................... 146

    Rsum ......................................................................................................................... 149

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    7/450

    VI Table des matires

    Partie III

    Patterns de construction

    Chapitre 14. Introduction la construction .................................................................. 153

    Quelques dfis de construction ..................................................................................... 153

    Rsum ......................................................................................................................... 155

    Au-del de la construction ordinaire ............................................................................. 155

    Chapitre 15. BUILDER ................................................................................................... 157

    Un objet constructeur ordinaire .................................................................................... 157

    Construction avec des contraintes ................................................................................. 160

    Un builder tolrant ........................................................................................................ 163

    Rsum ......................................................................................................................... 164

    Chapitre 16. FACTORY METHOD ............................................................................... 165

    Un exemple classique : des itrateurs ........................................................................... 165

    Identification de FACTORY METHOD ............................................................................. 166

    Garder le contrle sur le choix de la classe instancier ............................................... 167

    Application de FACTORY METHOD dans une hirarchie parallle ................................. 169

    Rsum ......................................................................................................................... 171

    Chapitre 17. ABSTRACT FACTORY ........................................................................... 173

    Un exemple classique : le kit de GUI ........................................................................... 173

    Classe FACTORY abstraite et pattern FACTORY METHOD .............................................. 178

    Packages et classes factory abstraites ........................................................................... 182

    Rsum ......................................................................................................................... 182

    Chapitre 18. PROTOTYPE ............................................................................................ 183

    Des prototypes en tant quobjets factory ...................................................................... 183

    Prototypage avec des clones ......................................................................................... 185

    Rsum ......................................................................................................................... 187

    Chapitre 19. MEMENTO ............................................................................................... 189

    Un exemple classique : dfaire une opration .............................................................. 189

    Dure de vie des mmentos .......................................................................................... 196

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    8/450

    Table des matires VII

    Persistance des mmentos entre les sessions ................................................................ 197

    Rsum ......................................................................................................................... 200

    Partie IV

    Patterns dopration

    Chapitre 20. Introduction aux oprations ..................................................................... 203

    Oprations et mthodes ................................................................................................. 203

    Signatures ..................................................................................................................... 205

    Exceptions ..................................................................................................................... 205

    Algorithmes et polymorphisme .................................................................................... 206

    Rsum ......................................................................................................................... 208Au-del des oprations ordinaires ................................................................................ 209

    Chapitre 21. TEMPLATE METHOD ........................................................................... 211

    Un exemple classique : algorithme de tri ...................................................................... 211

    Compltion dun algorithme ......................................................................................... 215

    Hooks ............................................................................................................................ 218

    Refactorisation pour appliquer TEMPLATE METHOD .................................................... 219

    Rsum ......................................................................................................................... 221

    Chapitre 22. STATE ........................................................................................................ 223

    Modlisation dtats ...................................................................................................... 223

    Refactorisation pour appliquer STATE ......................................................................... 227

    Etats constants .............................................................................................................. 231

    Rsum ......................................................................................................................... 233

    Chapitre 23. STRATEGY ............................................................................................... 235

    Modlisation de stratgies ............................................................................................ 236

    Refactorisation pour appliquer STRATEGY ................................................................... 238

    Comparaison de STRATEGY et STATE .......................................................................... 242

    Comparaison de STRATEGY et TEMPLATE METHOD ..................................................... 243

    Rsum ......................................................................................................................... 243

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    9/450

    VIII Table des matires

    Chapitre 24. COMMAND ............................................................................................... 245

    Un exemple classique : commandes de menus ............................................................. 245

    Emploi de COMMAND pour fournir un service ................................................................ 248

    Hooks ............................................................................................................................ 249

    COMMAND en relation avec dautres patterns .................................................................. 251

    Rsum ......................................................................................................................... 252

    Chapitre 25. INTERPRETER ........................................................................................ 253

    Un exemple de INTERPRETER ..................................................................................... 254

    Interprteurs, langages et analyseurs syntaxiques ........................................................ 265

    Rsum ......................................................................................................................... 266

    Partie V

    Patterns dextension

    Chapitre 26. Introduction aux extensions ..................................................................... 269

    Principes de la conception oriente objet ..................................................................... 269

    Le principe de substitution de Liskov ........................................................................... 270

    La loi de Demeter ......................................................................................................... 271

    Elimination des erreurs potentielles .............................................................................. 273

    Au-del des extensions ordinaires ................................................................................ 273

    Rsum ......................................................................................................................... 274

    Chapitre 27. DECORATOR ........................................................................................... 277

    Un exemple classique : flux dE/S et objetsWriter ................................................... 277

    Enveloppeurs de fonctions ............................................................................................ 285

    DECORATOR en relation avec dautres patterns .............................................................. 292

    Rsum ......................................................................................................................... 293

    Chapitre 28. ITERATOR ................................................................................................ 295

    Itration ordinaire ......................................................................................................... 295

    Itration avec scurit inter-threads .............................................................................. 297

    Itration sur un objet composite ................................................................................... 303Ajout dun niveau de profondeur un numrateur ............................................... 310

    Enumration des feuilles ......................................................................................... 311

    Rsum ......................................................................................................................... 313

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    10/450

    Table des matires IX

    Chapitre 29. VISITOR .................................................................................................... 315

    Application de VISITOR .............................................................................................. 315

    Un VISITOR ordinaire .................................................................................................. 318

    Cycles et VISITOR ....................................................................................................... 323

    Risques de VISITOR .................................................................................................... 328

    Rsum ......................................................................................................................... 330

    Partie VI

    Annexes

    Annexe A. Recommandations ........................................................................................ 333

    Tirer le meilleur parti du livre ....................................................................................... 333Connatre ses classiques ............................................................................................... 334

    Appliquer les patterns ................................................................................................... 334

    Continuer dapprendre .................................................................................................. 336

    Annexe B. Solutions ......................................................................................................... 337

    Introduction aux interfaces ........................................................................................... 337

    Solution 2.1 ............................................................................................................. 337

    Solution 2.2 ............................................................................................................. 338

    Solution 2.3 ............................................................................................................. 338ADAPTER .................................................................................................................... 338

    Solution 3.1 ............................................................................................................. 338

    Solution 3.2 ............................................................................................................. 339

    Solution 3.3 ............................................................................................................. 340

    Solution 3.4 ............................................................................................................. 341

    Solution 3.5 ............................................................................................................. 341

    Solution 3.6 ............................................................................................................. 342

    FACADE ....................................................................................................................... 342

    Solution 4.1 ............................................................................................................. 342Solution 4.2 ............................................................................................................. 343

    Solution 4.3 ............................................................................................................. 343

    Solution 4.4 ............................................................................................................. 344

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    11/450

    X Table des matires

    COMPOSITE ................................................................................................................ 345

    Solution 5.1 ............................................................................................................. 345

    Solution 5.2 ............................................................................................................. 346

    Solution 5.3 ............................................................................................................. 346

    Solution 5.4 ............................................................................................................. 347

    Solution 5.5 ............................................................................................................. 347

    Solution 5.6 ............................................................................................................. 348

    BRIDGE ....................................................................................................................... 348

    Solution 6.1 ............................................................................................................. 348

    Solution 6.2 ............................................................................................................. 348

    Solution 6.3 ............................................................................................................. 349

    Solution 6.4 ............................................................................................................. 349

    Solution 6.5 ............................................................................................................. 350

    Introduction la responsabilit ..................................................................................... 350

    Solution 7.1 ............................................................................................................. 350

    Solution 7.2 ............................................................................................................. 351

    Solution 7.3 ............................................................................................................. 352

    Solution 7.4 ............................................................................................................. 353

    SINGLETON ................................................................................................................ 353

    Solution 8.1 ............................................................................................................. 353

    Solution 8.2 ............................................................................................................. 353

    Solution 8.3 ............................................................................................................. 353

    Solution 8.4 ............................................................................................................ 354

    OBSERVER .................................................................................................................. 354Solution 9.1 ............................................................................................................. 354

    Solution 9.2 ............................................................................................................. 355

    Solution 9.3 ............................................................................................................. 356

    Solution 9.4 ............................................................................................................. 356

    Solution 9.5 ............................................................................................................. 357

    Solution 9.6 ............................................................................................................. 357

    Solution 9.7 ............................................................................................................. 358

    MEDIATOR .................................................................................................................. 359

    Solution 10.1 ........................................................................................................... 359

    Solution 10.2 ........................................................................................................... 360Solution 10.3 ........................................................................................................... 361

    Solution 10.4 ........................................................................................................... 361

    Solution 10.5 ........................................................................................................... 362

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    12/450

    Table des matires XI

    PROXY ......................................................................................................................... 362

    Solution 11.1 ........................................................................................................... 362

    Solution 11.2 ........................................................................................................... 363

    Solution 11.3 ........................................................................................................... 363

    Solution 11.4 ........................................................................................................... 363

    Solution 11.5 ........................................................................................................... 364

    CHAIN OF RESPONSABILITY ................................................................................. 364

    Solution 12.1 ........................................................................................................... 364

    Solution 12.2 ........................................................................................................... 365

    Solution 12.3 ........................................................................................................... 366

    Solution 12.4 ........................................................................................................... 366

    Solution 12.5 ........................................................................................................... 367

    FLYWEIGHT ............................................................................................................... 368

    Solution 13.1 ........................................................................................................... 368

    Solution 13.2 ........................................................................................................... 369

    Solution 13.3 ........................................................................................................... 370

    Solution 13.4 ........................................................................................................... 370

    Introduction la construction ....................................................................................... 371

    Solution 14.1 ........................................................................................................... 371

    Solution 14.2 ........................................................................................................... 372

    Solution 14.3 ........................................................................................................... 372

    BUILDER ..................................................................................................................... 373

    Solution 15.1 ........................................................................................................... 373

    Solution 15.2 ........................................................................................................... 373Solution 15.3 ........................................................................................................... 374

    Solution 15.4 ........................................................................................................... 374

    FACTORY METHOD .................................................................................................. 375

    Solution 16.1 ........................................................................................................... 375

    Solution 16.2 ........................................................................................................... 376

    Solution 16.3 ........................................................................................................... 376

    Solution 16.4 ........................................................................................................... 376

    Solution 16.5 ........................................................................................................... 377

    Solution 16.6 ........................................................................................................... 378

    Solution 16.7 ........................................................................................................... 378ABSTRACT FACTORY ............................................................................................... 379

    Solution 17.1 ........................................................................................................... 379

    Solution 17.2 ........................................................................................................... 380

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    13/450

    XII Table des matires

    Solution 17.3 ........................................................................................................... 380

    Solution 17.4 ........................................................................................................... 381

    Solution 17.5 ........................................................................................................... 381

    PROTOTYPE ................................................................................................................ 382

    Solution 18.1 ........................................................................................................... 382

    Solution 18.2 ........................................................................................................... 383

    Solution 18.3 ........................................................................................................... 383

    Solution 18.4 ........................................................................................................... 384

    MEMENTO .................................................................................................................. 384

    Solution 19.1 ........................................................................................................... 384

    Solution 19.2 ........................................................................................................... 385

    Solution 19.3 ........................................................................................................... 385

    Solution 19.4 ........................................................................................................... 386

    Solution 19.5 ........................................................................................................... 386

    Introduction aux oprations .......................................................................................... 387

    Solution 20.1 ........................................................................................................... 387

    Solution 20.2 ........................................................................................................... 387

    Solution 20.3 ........................................................................................................... 388

    Solution 20.4 ........................................................................................................... 388

    Solution 20.5 ........................................................................................................... 388

    TEMPLATE METHOD ................................................................................................ 389

    Solution 21.1 ........................................................................................................... 389

    Solution 21.2 ........................................................................................................... 389Solution 21.3 ........................................................................................................... 390

    Solution 21.4 ........................................................................................................... 390

    STATE ........................................................................................................................... 390

    Solution 22.1 ........................................................................................................... 390

    Solution 22.2 ........................................................................................................... 390

    Solution 22.3 ........................................................................................................... 391

    Solution 22.4 ........................................................................................................... 391

    STRATEGY .................................................................................................................. 392

    Solution 23.1 ........................................................................................................... 392Solution 23.2 ........................................................................................................... 392

    Solution 23.3 ........................................................................................................... 392

    Solution 23.4 ........................................................................................................... 393

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    14/450

    Table des matires XIII

    COMMAND ................................................................................................................. 393

    Solution 24.1 ........................................................................................................... 393

    Solution 24.2 ........................................................................................................... 393

    Solution 24.3 ........................................................................................................... 395

    Solution 24.4 ........................................................................................................... 395

    Solution 24.5 ........................................................................................................... 396

    Solution 24.6 ........................................................................................................... 396

    INTERPRETER ............................................................................................................ 396

    Solution 25.1 396

    Solution 25.2 ........................................................................................................... 397

    Solution 25.3 ........................................................................................................... 397

    Solution 25.4 ........................................................................................................... 397

    Introduction aux extensions .......................................................................................... 398

    Solution 26.1 398

    Solution 26.2 ........................................................................................................... 398

    Solution 26.3 ........................................................................................................... 398

    Solution 26.4 ........................................................................................................... 399

    DECORATOR .............................................................................................................. 399

    Solution 27.1 399

    Solution 27.2 ........................................................................................................... 400

    Solution 27.3 ........................................................................................................... 401

    Solution 27.4 ........................................................................................................... 401

    ITERATOR ................................................................................................................... 401

    Solution 28.1 401Solution 28.2 ........................................................................................................... 402

    Solution 28.3 ........................................................................................................... 402

    Solution 28.4 ........................................................................................................... 402

    VISITOR ....................................................................................................................... 403

    Solution 29.1 403

    Solution 29.2 ........................................................................................................... 403

    Solution 29.3 ........................................................................................................... 403

    Solution 29.4 ........................................................................................................... 404

    Solution 29.5 ........................................................................................................... 404

    Annexe C. Code source dOozinoz ............................................................................... 405

    Obtention et utilisation du code source ........................................................................ 405

    Construction du code dOozinoz .................................................................................. 406

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    15/450

    XIV Table des matires

    Test du code avec JUnit ................................................................................................ 406

    Localiser les fichiers ..................................................................................................... 406

    Rsum ......................................................................................................................... 407

    Annexe D. Introduction UML ..................................................................................... 409Classes .......................................................................................................................... 409

    Relations entre classes .................................................................................................. 412

    Interfaces ....................................................................................................................... 414

    Objets ............................................................................................................................ 414

    Etats .............................................................................................................................. 416

    Glossaire ............................................................................................................................ 417

    Bibliographie ..................................................................................................................... 425

    Index .................................................................................................................................. 427

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    16/450

    Prface

    Les patterns de conception sont des solutions de niveaux classe et mthode desproblmes courants dans le dveloppement orient objet. Si vous tes dj unprogrammeur Java intermdiaire et souhaitez devenir avanc, ou bien si vous tesavanc mais navez pas encore tudi les patterns de conception, ce livre est pourvous.

    Il adopte une approche de cahier dexercices, chaque chapitre tant consacr unpattern particulier. En plus dexpliquer le pattern en question, chaque chapitre

    inclut un certain nombre dexercices vous demandant dexpliquer quelque chose oude dvelopper du code pour rsoudre un problme.

    Nous vous recommandons vivement de prendre le temps deffectuer chaque exer-cice lorsque vous tombez dessus plutt que de lire le livre dune traite. En mettanten pratique vos connaissances au fur et mesure de leur acquisition, vous apprendrezmieux, mme si vous ne faites pas plus dun ou deux chapitres par semaine.

    Conventions de codage

    Le code des exemples prsents dans ce livre est disponible en ligne. VoyezlAnnexe C pour savoir comment lobtenir.

    Nous avons utilis le plus souvent un style cohrent avec les conventions de codagede Sun. Les accolades ont t omises lorsque ctait possible. Nous avons d fairequelques compromis pour nous adapter au format du livre. Pour respecter les colonnestroites, les noms de variables sont parfois plus courts que ceux que nousemployons habituellement. Et pour viter les complications du contrle de codesource, nous avons distingu les multiples versions dun mme fichier en accolantun chiffre son nom (par exemple, ShowBallistics2). Vous devriez normalementutiliser le contrle de code source et travailler seulement avec la dernire version

    dune classe.

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    17/450

    2 Prface

    Remerciements

    Nous tenons remercier le dfunt John Vlissides pour ses encouragements et sesrecommandations concernant ce livre et dautres. John, diteur de la collection

    Software Patterns Series et coauteur de louvrage original Design Patterns, taitpour nous un ami et une inspiration.

    En plus de nous appuyer largement sur Design Patterns, nous nous sommes aussiinspirs de nombreux autres livres. Voyez pour cela la bibliographie en findouvrage. En particulier, The Unified Modeling Language User Guide (le Guide delutilisateur UML) [Booch, Rambaugh, et Jacobsen 1999] donne une explicationclaire dUML, et JavaTM in a Nutshell (Java en concentr : Manuel de rfrence

    pour Java) [Flanagan 2005] constitue une aide concise et prcise sur Java. TheChemistry of Fireworks [Russell 2000] nous a servi de source dinformations pour

    laborer nos exemples pyrotechniques ralistes.Enfin, nous sommes reconnaissants toute lquipe de production pour son travailacharn et son dvouement.

    Steve Metsker ([email protected])

    Bill Wake ([email protected])

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    18/450

    1

    Introduction

    Ce livre couvre le mme ensemble de techniques que louvrage de rfrenceDesign

    Patterns, dErich Gamma, Richard Helm, Ralph Johnson et John Vlissides [Gammaet al. 1995], et propose des exemples en Java. Il inclut de nombreux exercicesconus pour vous aider dvelopper votre aptitude appliquer les patterns deconception 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, dartifices, 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 efficaces pour parvenir leurs buts et rsoudre

    des problmes dans diffrents contextes. Cette communaut invente aussi gnra-

    lement 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, lesauteurs commencent jouer un rle important. En documentant les modles de cet

    art, ils contribuent standardiser son jargon et faire connatre ses techniques.

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    19/450

    4 Les Design Patterns en Java Les 23 modles de conception fondamentaux

    Christopher Alexander a t un des premiers auteurs compiler les meilleures prati-

    ques dun mtier en documentant ses modles. Son travail concerne larchitecture,

    celle des immeubles et non des logiciels. DansA 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 puis-

    sant et a influenc 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, philosophiqueet difficile.

    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 efficace que le vtre, auquel cas vous avez d vous demander comment son

    dveloppeur tait parvenu une telle simplicit. Les patterns de conception inter-

    viennent un niveau au-dessus du code et indiquent typiquement comment atteindre

    un but en nutilisant que quelques classes. Un pattern reprsente une ide, et nonune implmentation particulire.

    Dautres dveloppeurs ont dcouvert avant vous comment programmer efficace-

    ment dans les langages orients objet. Si vous souhaitez devenir un programmeur

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    20/450

    Chapitre 1 Introduction 5

    Java avanc, vous devriez tudier les patterns de conception, surtout ceux de celivre les mmes que ceux expliqus dansDesign 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, aussidnombre-t-on au moins cent patterns qui valent la peine dtre connus. Les vingt-

    trois patterns recenss par Gamma, Helm, Johnson et Vlissides ne sont pas forc-

    ment 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 simplifiant lemploi dun sous-systme.

    COMPOSITE (47) permet aux clients de traiter de faon uniforme des objets indivi-

    duels 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 implmen-tation 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) dfinit 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 notifis et soient actualiss afin de pouvoir ragir conformment.

    MEDIATOR (103) dfinit 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 ind-

    pendamment.

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    21/450

    6 Les Design Patterns en Java Les 23 modles de conception fondamentaux

    PROXY (117) contrle laccs un objet en fournissant un intermdiaire pour cetobjet.

    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 efficacement un grand nombredobjets 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 simplifierlobjet.

    FACTORY METHOD (167) laisse un autre dveloppeur dfinir linterface permettant decrer 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 ouinterdpendants.

    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 dfinir certaines tapes de lalgorithme.

    STATE (229) distribue la logique dpendant de ltat dun objet travers plusieursclasses qui reprsentent chacune un tat diffrent.

    STRATEGY (241) encapsule des approches, ou stratgies, alternatives dans des classesdistinctes qui implmentent chacune une opration commune.

    COMMAND (251) encapsule une requte en tant quobjet, de manire pouvoir para-mtrer des clients au moyen de divers types de requtes (de file dattente, de temps

    ou de journalisation) et de permettre un client de prparer un contexte spcial danslequel mettre la requte.

    INTERPRETER (261) permet de composer des objets excutables daprs un ensemblede rgles de composition que vous dfinissez.

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    22/450

    Chapitre 1 Introduction 7

    Patterns dextension

    DECORATOR (287) permet de composer dynamiquement le comportement dunobjet.

    ITERATOR (305) fournit un moyen daccder de faon squentielle aux lmentsdune collection.

    VISITOR (325) permet de dfinir une nouvelle opration pour une hirarchie sanschanger ses classes.

    Java

    Les exemples de ce livre utilisent Java, le langage orient objet (OO) dvelopp parSun. Ce langage, ses bibliothques et ses outils associs forment une suite de

    produits pour le dveloppement et la gestion de systmes aux architectures multi-niveaux et orientes objet.

    Limportance de Java tient en partie au fait quil sagit dun langage de consoli-dation, cest--dire conu pour intgrer les points forts des langages prcdents.Cette consolidation est la cause de son succs et garantit que les langages futurstendront sinscrire dans sa continuit au lieu de sen loigner radicalement. Votreinvestissement dans Java ne perdra assurment pas de sa valeur, quel que soit lelangage qui lui succde.

    Les patterns deDesign Patterns sappliquent Java, car, comme Smalltalk, C++ etC#, 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 ngli-ger limportance de paradigmes concurrents, le paradigme classe/instance constitueune avance concrte en informatique applique. Le prsent livre emploie Java enraison de sa popularit et parce que son volution suit le chemin des langages quenous utiliserons dans les annes venir.

    UML

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

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    23/450

    8 Les Design Patterns en Java Les 23 modles de conception fondamentaux

    davoir une rfrence porte de main. Vous pouvez consulter deux ouvrages dequalit : The Unified 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 danslAnnexe D consacre UML.

    Exercices

    Mme si vous lisez de nombreux ouvrages sur un sujet, vous naurez le sentimentde le matriser vraiment quen le pratiquant. Tant que vous nappliquerez pas

    concrtement les connaissances acquises, certaines subtilits et approches alterna-

    tives vous chapperont. Le seul moyen de gagner de lassurance avec les patterns deconception 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 produc-

    tion si vous ne les matrisez pas. Mais il faut bien que vous commenciez les appliquerpour 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, vouspouvez la comparer aux rponses proposes dans lAnnexe B. Il se peut que la solu-

    tion du livre adopte une approche diffrente de la vtre, vous faisant voir les chosessous 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 uncollgue et crivez des chantillons de code pour vrifier 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 vtrespour pouvoir ensuite les leur comparer et tirer les leons de vos erreurs.

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    24/450

    Chapitre 1 Introduction 9

    Organisation du livre

    Il 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 dunpattern est son objectif, cest--dire la valeur potentielle lie son application. Le

    prsent livre organise les vingt-trois patterns deDesign 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 dfinition des

    interfaces implmentes par les classes. Mais si vous disposez dj dune classe

    dont vous aimeriez modifier linterface pour quelle corresponde aux exigences

    dun client, vous pourriez dcider dappliquer le patternADAPTER. 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 rflchir sur la structure des

    interfaces Java, notamment en les comparant aux classes abstraites. Les autreschapitres de cette partie dcrivent les patterns qui ont pour principal objectif de

    dfinir une interface, cest--dire lensemble des mthodes quun client peut appe-

    ler partir dun fournisseur de services. Chacun deux rpond un besoin que les

    interfaces Java ne peuvent satisfaire elles seules.

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    25/450

    10 Les Design Patterns en Java Les 23 modles de conception fondamentaux

    Ce classement des patterns par objectifs ne signifie pas que chaque pattern supporteseulement un type dobjectif. Lorsquil en supporte plusieurs, il fait lobjet dunchapitre entier dans la premire partie laquelle il sapplique puis il est mentionnbrivement dans les autres parties concernes. Le Tableau 1.1 illustre la catgo-risation sous-jacente lorganisation du livre.

    Nous esprons que ce classement vous amnera vous interroger. Pensez-vousaussi que SINGLETON a trait la responsabilit, et non la construction ? COMPO-SITE est-il rellement un pattern dinterface ? Toute catgorisation est subjective.Mais vous conviendrez certainement que le fait de rflchir 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 entre-prise fictive qui fabrique et vend des pices pour feux dartifice et organise desvnements pyrotechniques. Vous pouvez vous procurer le code de ces exemples ladresse www.oozinoz.com. Pour en savoir plus sur la compilation et le test ducode, voyez lAnnexe C.

    Tableau 1.1 : Une catgorisation des patterns par objectifs

    Objectif Patterns

    Interfaces ADAPTER, FACADE, COMPOSITE, BRIDGE

    Responsabilit SINGLETON, OBSERVER, MEDIATOR, PROXY, CHAIN OF RESPONSIBILITY,

    FLYWEIGHT

    Construction BUILDER, FACTORYMETHOD,ABSTRACT FACTORY, PROTOTYPE, MEMENTOOprations TEMPLATE METHOD, STATE, STRATEGY, COMMAND, INTERPRETER

    Extensions DECORATOR, ITERATOR, VISITOR

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    26/450

    Chapitre 1 Introduction 11

    Rsum

    Les patterns de conception distillent une sagesse vieille de quelques dizainesdannes qui tablit un jargon standard, permettant aux dveloppeurs de nommer

    les concepts quils appliquent. Ceux abords dans louvrage de rfrence DesignPatterns font partie des patterns de niveau classe les plus utiles et mritent que vousles appreniez. Le prsent livre reprend ces patterns mais utilise Java et ses biblio-thques pour ses exemples et exercices. En ralisant les exercices proposs, vousapprendrez reconnatre et appliquer une part importante de la sagesse de lacommunaut logicielle.

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    27/450

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    28/450

    IPatterns dinterface

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    29/450

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    30/450

    2

    Introduction aux interfaces

    Pour 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 accomplirontlopration signifie par leur nom et tel que spcifie par les commentaires, les testset autres documentations du code. Limplmentation dune classe est le codecontenu dans ses mthodes.

    Java fait du concept dinterface une structure distincte, sparant expressmentlinterface ce quun objet doit faire de limplmentation comment unobjet remplit cet engagement. Les interfaces Java permettent plusieurs classesdoffrir la mme fonctionnalit et une mme classe dimplmenter plusieurs inter-

    faces.Plusieurs patterns de conception emploient les fonctionnalits intgres Java. Parexemple, vous pourriez utiliser une interface pour adapter linterface dune classeafin de rpondre aux besoins dun client en appliquant le patternADAPTER. Maisavant daborder certaines notions avances, il peut tre utile de sassurer que vousmatrisez les fonctionnalits de base, commencer par les interfaces.

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    31/450

    16 Partie I Patterns dinterface

    Interfaces et classes abstraites

    Le 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, nepossdent 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.

    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 dve-

    loppement dapplications multiniveaux, ce qui justifie certainement leur statut

    particulier de structure distincte.

    Considrez la dfinition 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 fournirdes chiffres pour la pousse (thrust) et la masse (mass). Voici le code quutilise

    Oozinoz pour dfinir linterface de simulation de fuse :

    package com.oozinoz.simulation;

    public interface RocketSim {

    abstract double getMass();

    public double getThrust();

    void setSimTime(double t);

    }

    Exercice 2.1

    Enumrez trois diffrences entre les classes abstraites et les interfaces Java.

    bLes solutions des exercices de ce chapitre sont donnes dans lAnnexe B.

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    32/450

    Chapitre 2 Introduction aux interfaces 17

    Interfaces et obligations

    Un avantage important des interfaces Java est quelles limitent linteraction entreles objets. Cette limitation savre tre un soulagement. En effet, une classe quiimplmente une interface peut subir des changements considrables dans sa faonde remplir le contrat dfini par linterface sans que cela affecte aucunement sesclients.

    Un dveloppeur qui cre une classe implmentant RocketSim a pour tche dcrireles mthodes getMass() et getThrust() qui retournent les mesures de perfor-mance dune fuse. Autrement dit, il doit remplir le contrat de ces mthodes.

    Parfois, les mthodes dsignes par une interface nont aucune obligation de fournirun service lappelant. Dans certains cas, la classe dimplmentation peut mmeignorer lappel, implmentant une mthode avec un corps vide.

    Exercice 2.2

    Parmi les affirmations suivantes, lesquelles sont vraies ?

    A. Les mthodes de linterface RocketSim sont toutes trois abstraites, mmesi seulement getMass() dclare cela explicitement.

    B. Les trois mthodes de linterface sont publiques, mme si seulementgetThrust() dclare cela explicitement.

    C. Linterface est dclare public interface, mais elle serait publiquemme 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 dimpl-mentation doit galement dclarer.

    G. Bien quil ne soit pas possible dinstancier une interface, une interfacepeut dclarer des mthodes constructeurs dont la signature sera donnepar une classe dimplmentation.

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    33/450

    18 Partie I Patterns dinterface

    Si vous crez une interface qui spcifie un ensemble de mthodes de notification,vous pourriez envisager dutiliser une classe stub, cest--dire une classe qui impl-mente linterface avec des mthodes ne faisant rien. Les dveloppeurs peuvent dri-ver des sous-classes de la classe stub, en redfinissant uniquement les mthodes delinterface qui sont importantes pour leur application. La classeWindowAdapterdans java.awt.event est un exemple dune telle classe, comme illustr Figure 2.1

    (pour une introduction rapide UML, voyez lAnnexe D). Cette classe implmentetoutes les mthodes de linterfaceWindowListener mais les implmentations sontvides ; ces mthodes ne contiennent aucune instruction.

    Exercice 2.3

    Donnez un exemple dinterface avec des mthodes nimpliquant aucune respon-

    sabilit pour la classe dimplmentation de retourner une valeur ou daccomplirune quelconque action pour le compte de lappelant.

    Figure 2.1

    La classe WindowAdapter facilite lenregistrement de listeners pour les vnements de fentre

    en vous permettant dignorer ceux qui ne vous intressent pas.

    interface

    WindowListener

    windowActivated()

    windowClosed()

    windowClosing()windowDeactivated()

    windowDeiconified()

    windowIconified()

    windowOpened()

    windowActivated()

    windowClosed()

    windowClosing()windowDeactivated()

    windowDeiconified()

    windowIconified()

    windowOpened()

    WindowAdapter

    windowStateChanged()

    windowGainedFocus()

    windowLostFocus()

    windowStateChanged()

    windowGainedFocus()

    windowLostFocus()

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    34/450

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    35/450

    20 Partie I Patterns dinterface

    Lobjectif de chaque pattern de conception est de rsoudre un problme dans uncertain contexte. Les patterns dinterface conviennent dans des contextes o vousavez besoin de dfinir ou de redfinir laccs aux mthodes dune classe ou dun groupede classes. Par exemple, lorsque vous disposez dune classe qui accomplit unservice ncessaire, mais dont les noms de mthodes ne correspondent pas aux attentesdun client, vous pouvez appliquer le patternADAPTER.

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    36/450

    3

    ADAPTER

    Un 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 quilutilise les interfaces de vos objets. Dans dautres, le client peut tre dvelopp ind-pendamment de votre code. Par exemple, un programme de simulation de fusepourrait tre conu pour utiliser les informations techniques que vous fournissez,mais une telle simulation aurait sa propre dfinition du comportement que doit avoir unefuse. Si une classe existante est en mesure dassurer les services requis par un clientmais que ses noms de mthodes diffrent, vous pouvez appliquer le patternADAPTER.

    Lobjectif du patternADAPTER est de fournir linterface quun client attend en

    utilisant les services dune classe dont linterface est diffrente.

    Adaptation une interface

    Le dveloppeur dun client peut avoir prvu les situations o vous aurez besoindadapter votre code au sien. Cela est vident sil a fourni une interface qui dfinitles services dont le code client a besoin, comme dans lexemple de la Figure 3.1.Une classe cliente invoque une mthode mthodeRequise() dclare dans uneinterface. Supposez que vous avez trouv une classe existante avec une mthodenomme 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 redfinit mthode-Requise() de sorte quelle dlgue ses demandes mthodeUtile().

    La classe NouvelleClasse est un exemple deADAPTER. Une instance de cetteclasse est une instance de InterfaceRequise. En dautres termes, NouvelleClasserpond aux besoins du client.

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    37/450

    22 Partie I Patterns dinterface

    Pour prendre un exemple plus concret, imaginez que vous travailliez avec unpackage qui simule le vol et le minutage de fuses comme celles fabriques parOozinoz. Ce package inclut un simulateur dvnements qui couvre les effets dulancement de plusieurs fuses, ainsi quune interface qui spcifie le comportement

    dune fuse. La Figure 3.2 illustre ce package.Vous disposez dune classe PhysicalRocket que vous voulez inclure dans la simu-lation. Cette classe possde des mthodes qui correspondent approximativement aucomportement requis par le simulateur. Vous pouvez donc appliquerADAPTER endrivant de PhysicalRocket une sous-classe qui implmente linterface Rocket-Sim. 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 desimulation dclare dans linterface RocketSim. Cette diffrence tient au fait que le simu-

    lateur possde une horloge interne et actualise occasionnellement les objets simulsen invoquant une mthode setSimTime(). Pour adapter la classe PhysicalRocket auxexigences du simulateur, un objet OozinozRocket pourrait utiliser une variabledinstance time et la passer aux mthodes de la classe PhysicalRocket lorsquencessaire.

    Figure 3.1

    Lorsque le dve-loppeur du codeclient dfinit prci-

    sment les besoinsdu client, vous pouvezremplir le contrat

    dfini par linterfaceen adaptant le code

    existant. InterfaceRequise

    interface

    NouvelleClasse

    mthodeRequise()

    mthodeRequise()

    ClasseExistante

    mthodeUtile()

    Client

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    38/450

    Chapitre 3 ADAPTER 23

    Figure 3.2

    Le package Simulationdfinit clairement ses exigences pour simuler le vol dune fuse.

    Figure 3.3

    Une fois complt, ce diagramme reprsentera la conception dune classe qui adapte

    la classe PhysicalRocket pour rpondre aux exigences de linterfaceRocketSim.

    EventSim

    com.oozinoz.simulation

    RocketSim

    interface

    getMass():double

    OozinozRocket

    PhysicalRocket

    getMass(t:double):double

    getThrust(t:double):double

    PhysicalRocket(burnArea:double,burnRate:double,fuelMass:double,totalMass:double)

    getBurnTime():double

    RocketSim

    interface

    getMass():double

    getThrust():doublesetSimTime(t:double)

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    39/450

    24 Partie I Patterns dinterface

    Le code de PhysicalRocket est un peu complexe car il runit toutes les caractris-tiques physiques dont se sert Oozinoz pour modliser une fuse. Mais cest exac-tement la logique que nous voulons rutiliser. La classe adaptateur OozinozRockettraduit simplement les appels pour utiliser les mthodes de sa super-classe. Le codede cette nouvelle sous-classe pourrait ressembler ce qui suit :

    package com.oozinoz.firework;import com.oozinoz.simulation.*;

    public class OozinozRocketextends 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.1

    Compltez le diagramme de la Figure 3.3 en faisant en sorte que la classe Oozino-zRocket permette un objet PhysicalRocket de prendre part une simulation

    en tant quobjet RocketSim. Partez du principe que vous ne pouvez modifier niRocketSim ni PhysicalRocket.

    bLes solutions des exercices de ce chapitre sont donnes dans lAnnexe B.

    Exercice 3.2

    Compltez le code de la classe OozinozRocket en dfinissant les mthodesgetMass() et getThrust().

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    40/450

    Chapitre 3 ADAPTER 25

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

    Adaptateurs de classe et dobjet

    Les conceptions des Figures 3.1 et 3.3 sont des adaptateurs de classe, cest--dire queladaptation procde de la drivation de sous-classes. Dans une telle conception, lanouvelle classe adaptateur implmente linterface dsire et tend une classe exis-tante. Cette approche ne fonctionne pas toujours, notamment lorsque lensemble demthodes que vous voulez adapter nest pas spcifi dans une interface. Dans cecas, vous pouvez crer un adaptateur dobjet, cest--dire un adaptateur qui utilisela dlgation plutt que la drivation de sous-classes. La Figure 3.4 illustre cetteconception (comparez-la aux diagrammes prcdents).

    Figure 3.4

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

    ClasseRequise

    NouvelleClasse

    mthodeRequise()

    mthodeRequise()

    Client

    ClasseExistante

    mthodeUtile()

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    41/450

    26 Partie I Patterns dinterface

    La classe NouvelleClasse est un exemple deADAPTER. Une instance de cetteclasse est une instance de ClasseRequise. En dautres termes, NouvelleClasserpond aux besoins du client. Elle peut adapter la classe ClasseExistante poursatisfaire le client en utilisant une instance de cette classe.

    Pour prendre un exemple plus concret, imaginez que le package de simulation fonc-tionne directement avec une classe Skyrocket, sans spcifier dinterface dfi-nissant les comportements ncessaires pour la simulation. La Figure 3.5 illustrecette classe.

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

    Figure 3.5

    Dans cette conception-ci, le

    package com.oozinoz.simu-lation ne spcifie pas linter-

    face dont il a besoin pourmodliser une fuse. EventSim

    Skyrocket

    getMass():doublegetThrust():double

    setSimTime(t:double)

    Skyrocket(mass:double,thrust:doubleburnTime:double)

    com.oozinoz.simulation

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    42/450

    Chapitre 3 ADAPTER 27

    En tant quadaptateur dobjet, la classe OozinozSkyrocket tend Skyrocket, etnon PhysicalRocket. Cela permet un objet OozinozSkyrocket de servir desubstitut chaque fois que le client requiert un objet Skyrocket. La classe Skyrocketsupporte la drivation de sous-classes en dfinissant sa variable simTime commetant protected.

    Figure 3.6

    Une fois complt, ce diagramme reprsentera la conception dun adaptateur dobjet

    qui sappuie sur les informations dune classe existante pour satisfaire le besoin dun clientdutiliser un objetSkyrocket.

    Exercice 3.3Compltez le diagramme de la Figure 3.6 en faisant en sorte que des objetsOozinozSkyrocket puissent servir dobjets Skyrocket.

    Skyrocket

    OozinozSkyrocket

    getMass():double

    getThrust():double

    setSimTime(t:double)

    Skyrocket(mass:double,thrust:doubleburnTime:double)

    PhysicalRocket

    getMass(t:double):double

    getThrust(t:double):double

    PhysicalRocket(burnArea:double,burnRate:double,fuelMass:double,totalMass:double)

    getBurnTime():double

    #simTime:double

    ...

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    43/450

    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 OozinozSkyrocketchaque fois que le package requiert un objet Skyrocket. En gnral, les adaptateursdobjet rsolvent, partiellement du moins, le problme pos par ladaptation dunobjet une interface qui na pas t expressment dfinie.

    Ladaptateur dobjet pour la classe Skyrocket est une conception plus risque queladaptateur de classe qui implmente linterface RocketSim. Mais il ne faut pastrop se plaindre. Au moins, aucune mthode na t dfinie comme tant final, cequi nous aurait empchs de la redfinir.

    Exercice 3.4

    Citez une raison pour laquelle la conception dadaptateur dobjet utilise parla classe OozinozSkyrocket est plus fragile que lapproche avec adaptateur declasse.

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    44/450

    Chapitre 3 ADAPTER 29

    Adaptation de donnes pour un widget JTable

    Laffichage de donnes sous forme de table donne lieu un exemple courant

    dadaptateur dobjet. Swing fournit le widget JTable pour afficher des tables. Les

    concepteurs de ce widget ne savaient naturellement pas quelles donnes il servirait afficher. 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 fonction-

    nement de JTable. Il vous revient ensuite de crer un adaptateur pour que vos

    donnes soient conformes TableModel.

    Nombre des mthodes de TableModel suggrent la possibilit dune implmen-

    tation 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 spcifiques 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 atten-

    due par TableModel.

    La classe RocketTableModel doit tendreAbstractTableModel puisque cette

    dernire est une classe et non une interface. Lorsque linterface cible de ladapta-

    tion est supporte par une classe abstraite que vous souhaitez utiliser, vous devez

    Figure 3.7

    La classe JTableest un composant

    Swing qui affiche

    dans une table de GUIles donnes duneimplmentationde TableModel.

    JTable

    addTableModelListener()

    TableModel

    getColumnClass()

    getColumnCount()

    getColumnName()

    getRowCount()

    getValueAt()

    isCellEditable()

    removeTableModelListener()

    setValueAt()

  • 8/3/2019 Les Designs Patterns en Java 9782744040979

    45/450

    30 Partie I Patterns dinterface

    Figure 3.8

    La classeAbstract-TableModel prvoitdes implmentations

    par dfaut pourpresque toutesles mthodes de

    TableModel.

    Figure 3.9

    La classeRocketTableModeladapte linterface TableModel la classeRocket

    du domaine Oozinoz.

    AbstractTableModel

    getColumnCount()

    getRo