+ All Categories
Home > Documents > Patrons de conception (Design...

Patrons de conception (Design...

Date post: 04-Oct-2020
Category:
Upload: others
View: 0 times
Download: 0 times
Share this document with a friend
128
Patrons de conception (Design Patterns) Xavier Crégut <[email protected]> Département Télécommunications & Réseaux ENSEEIHT Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 1 / 128
Transcript
Page 1: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons de conception

(Design Patterns)

Xavier Crégut<[email protected]>

Département Télécommunications & RéseauxENSEEIHT

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 1 / 128

Page 2: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Sommaire

1 Pourquoi les patrons ?

2 Patrons fondamentaux

3 Patrons créateurs

4 Patrons structurels

5 Patrons comportementaux

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 2 / 128

Page 3: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Sommaire

1 Pourquoi les patrons ?

2 Patrons fondamentaux

3 Patrons créateurs

4 Patrons structurels

5 Patrons comportementaux

HistoriqueMotivationDéfinitionRubriques de la descriptionClassificationUtilisation

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 3 / 128

Page 4: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Pourquoi les patrons ?

HistoriqueMotivationDéfinitionRubriques de la descriptionClassificationUtilisation

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 4 / 128

Page 5: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

HistoriqueNotion de « patron » d’abord apparue en architecture :

I Christopher Alexander : « The Timeless Way of Constructing », 1979I Définition de « patrons » pour :

F l’architecture des bâtimentsF la conception des villes et de leur environnement

I Christopher Alexander :« Chaque modèle [patron] décrit un problème qui se manifesteconstamment dans notre environnement, et donc décrit le cœur de lasolution de ce problème, d’une façon telle que l’on peut réutiliser cettesolution des millions de fois, sans jamais le faire deux fois de lamême manière. »

Idée : appliquer la notion de patron à du logiciel : « design patterns »I premiers patrons à partir de 1987 (partie de la thèse de Erich Gamma)I puis Richard Helm, John Vlissides et Ralph Johnson (« Gang of Four, GoF »)I 1er catalogue en 1993 : Elements of Reusable Object-Oriented Software

Vocabulaire :

I design patternsI modèles de conception

I patrons de conceptionI micro-architectures

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 5 / 128

Page 6: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Pourquoi les patrons ?

HistoriqueMotivationDéfinitionRubriques de la descriptionClassificationUtilisation

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 6 / 128

Page 7: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Intérêt des patrons de conception

Pourquoi définir des patrons de conception

Construire des systèmes plus extensibles, plus robustes au changement

Capitaliser l’expérience collective des informaticiens

Réutiliser les solutions qui ont fait leur preuve

Identifier les avantages/inconvénients/limites de ces solutions

Savoir quand les appliquer

Complémentaire avec les API

une API propose des solutions directement utilisables

un patron explique comment structurer son application, une API

Patron de conception dans le cycle de développement

intervient en conception détaillée

reste indépendant du langage d’implantation

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 7 / 128

Page 8: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Pourquoi les patrons ?

HistoriqueMotivationDéfinitionRubriques de la descriptionClassificationUtilisation

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 8 / 128

Page 9: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Qu’est ce qu’un patron de conception ?

Définition : Un patron de conception (design pattern) décrit unestructure commune et répétitive de composants en interaction (lasolution) qui résout un problème de conception dans un contexteparticulier.

Quatre éléments essentielsI nom : un ou deux mots pour décrire le problème de conception

considérée, ses solutions et leurs conséquences.I problème : situation où le problème s’appliqueI solution : éléments de la conception, leurs relations et collaborations.

F la solution n’est pas forcément précise : idée d’architecture.F plusieurs variantes peuvent être possibles.

I conséquences : effets résultants et compromis induitsF Les conséquences peuvent être positives ou négatives (arbitrage).

Un bon patron de conception :I résout un problèmeI correspond à une solution éprouvéeI favorise la réutilisabilité, l’extensibilité, etc.I inclut une composante subjective : utilité, esthétique, etc.

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 9 / 128

Page 10: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Pourquoi les patrons ?

HistoriqueMotivationDéfinitionRubriques de la descriptionClassificationUtilisation

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 10 / 128

Page 11: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Description d’un patron de conceptionRubriques utilisées

Nom

Intention

Alias

Motivation

Indications d’utilisation

Structure

Constituants

Collaborations

Conséquences

Implantation

Exemples de code

Utilisations remarquables

Patrons apparentés

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 11 / 128

Page 12: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Description d’un patron de conceptionIdentification et compréhension du patron

Nom : nom de référence du patronI étend le vocabulaire du concepteur

Intention : courte description de :I ce que fait le patron de conception ;I sa raison d’être ou son but ;I cas ou problème particulier de conception concerné.

Alias : Autres noms connus pour le patron

Motivation :I scénario qui illustre un cas de conceptionI montre l’architecture en classes et objets de la solutionI aide à comprendre les descriptions plus abstraites du modèle

Indications d’utilisation :I Quels sont les cas qui justifient l’utilisation du patron ?I Quelles situations de conception peuvent tirer avantage du patron ?I Comment reconnaître ces situations ?

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 12 / 128

Page 13: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Description d’un patron de conceptionDescription de la solution proposée par le patron

Structure : description de la solution sous forme de :I un diagramme de classe pour l’architecture ;I des diagrammes d’interaction pour la dynamique.

Constituants : classes/objets de la solution avec leurs responsabilités

Collaborations entre les constituants pour assumer leurs responsabilités

Conséquences :I compromis induits par l’utilisation du patronI impacts sur l’architecture de conceptionI gains en terme de diminution du couplage dans la solution

Implantation : Solutions types, techniques, pièges et astuces.

Exemples de code : extraits de code illustrant la mise en œuvre dupatron

Utilisations remarquables : exemples issus de systèmes existants

Patrons apparentés :I patrons similaires et différences essentiellesI utilisation conjointe avec d’autres patrons

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 13 / 128

Page 14: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Pourquoi les patrons ?

HistoriqueMotivationDéfinitionRubriques de la descriptionClassificationUtilisation

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 14 / 128

Page 15: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Classification des patrons de conception

Fondamental Créateur Structurel Comportement

Fabrique Adaptateur Interprète

Délégation Fabrique abstraite Adaptateur Patron de méthode

Interface Monteur Pont Chaîne de responsabilités

Classe abstraite Prototype Composite Commande

Immuable Singleton Décorateur Itérateur

Interface de marquage Façade Médiateur

Poids mouche Mémento

Procuration Observateur

État

Stratégie

Visiteur

fondamental : application directe des concepts objets ;-)

créateur : processus de création d’objets

structurel : architecture statique du système

comportemental : interactions entre objets et répartition des responsabilités

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 15 / 128

Page 16: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Pourquoi les patrons ?

HistoriqueMotivationDéfinitionRubriques de la descriptionClassificationUtilisation

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 16 / 128

Page 17: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Choix d’un patron de conception

Est-il une solution au problème ?

Quels sont ses buts ?

Quelles sont les relations avec les autres patrons de conception ?

Est-ce que d’autres patrons jouent le même rôle ?

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 17 / 128

Page 18: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Mise en œuvre d’un patron de conception

Lire complètement la description, en particulier les sections indicationsd’utilisation et conséquences.

Étudier en détail les sections Structure, Constituants et Collaborations

Regarder la section Exemple de code

Choisir des noms de constituants ayant un sens dans le contexted’utilisation !

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 18 / 128

Page 19: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Ce qu’il ne faut pas attendre des patrons de

conception

Une solution universelle prête à l’emploi

Une bibliothèque de classes réutilisables

L’automatisation totale de l’instanciation d’un patron de conception

La disparition du facteur humain

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 19 / 128

Page 20: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Sommaire

1 Pourquoi les patrons ?

2 Patrons fondamentaux

3 Patrons créateurs

4 Patrons structurels

5 Patrons comportementaux

DélégationInterfaceClasse abstraiteInterface et Classe abstraiteImmuableInterface de marquage

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 20 / 128

Page 21: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons fondamentaux

Remarque : Les patrons fondamentaux découlent souventdirectement des concepts présents dans les langages objets.=⇒ Suivant les auteurs, ils sont souvent considérés comme implicites

Intérêt :I Donnent un autre éclairage aux concepts objetI Sont utilisés par les autres patrons

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 21 / 128

Page 22: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons fondamentaux

DélégationInterfaceClasse abstraiteInterface et Classe abstraiteImmuableInterface de marquage

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 22 / 128

Page 23: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Délégation

Contexte : Parfois, utiliser l’héritage conduit à une mauvaise conception.La délégation est alors un mécanisme plus général (même si plus lourd).

Cas où ne pas utiliser l’héritage (mais la délégation) :

I Une classe métier veut réutiliser une classe « utilitaire ».F Évolutions de l’« utilitaire » compatibles avec la classe « métier » ?

I Une classe veut cacher des éléments de la superclasse (Anti-patron !).F C’est impossible à faire (si héritage implique sous-typage, ex. Java) !

Exemple : Pile ne doit pas hériter de ArrayList.

I Les sous-classes modélisent des rôles différents de la superclasse.Exemple : Modéliser un joueur de foot.Spécialiser Joueur en Gardien, Stoppeur, Attaquant... ou définir unedélégation sur Poste qui est spécialisée en Gardien, Stoppeur, Attaquant...Un joueur peut changer de poste, voire occuper plusieurs postes.

Remarque : L’héritage correspond à « est une sorte de » mais n’est pasadapté pour représenter « est un rôle joué par » car, sinon, le rôle ne peut paschanger pendant la durée de vie de l’objet.

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 23 / 128

Page 24: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons fondamentaux

DélégationInterfaceClasse abstraiteInterface et Classe abstraiteImmuableInterface de marquage

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 24 / 128

Page 25: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Interface

Intention : On souhaite qu’un client reste indépendant de la classequi fournit effectivement le service.

C’est justement l’objectif des interfaces ! (patron fondamental)

Exemple : Un client veut accéder à un fournisseur JDBC pour accéder àune base de données. Le fournisseur effectif dépendra de la BDconsidérée. Le code client n’a pas à le connaître, seulement lesinterfaces qui définissent les services JDBC.

Intérêt : Le fournisseur de service peut changer sans impact sur lecode client.

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 25 / 128

Page 26: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons fondamentaux

DélégationInterfaceClasse abstraiteInterface et Classe abstraiteImmuableInterface de marquage

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 26 / 128

Page 27: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Classe abstraite

Intention :I Garantir que la logique commune à plusieurs classes est implantée de

manière cohérente pour chaque classeI Éviter le code redondant (et les efforts de maintenance associés)I Faciliter l’écriture de nouvelles classes implantant la même logique

Solution :I Utiliser une classe abstraite pour factoriser le code commun implantant la

logiqueI Les méthodes peuvent éventuellement être définies comme final

Exemple : La classe abstraite java.util.AbstractCollection définittoutes les opérations de Collection sauf size et iterator.

I Collection concrète non modifiable : définir seulement size et iteratorI Collection concrète modifiable : définir aussi add (et remove sur l’iterator).

Exemple 2 : La classe TestCase de JUnit (cf Patron de méthode, T. 109)

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 27 / 128

Page 28: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons fondamentaux

DélégationInterfaceClasse abstraiteInterface et Classe abstraiteImmuableInterface de marquage

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 28 / 128

Page 29: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Interface et classe abstraite

Idée :

Pourquoi choisir entre Interface et Classe abstraite ?

Faire les deux !

Intérêts :

on cumule les avantages des deux patrons

le client (surtout en Java) est libre de choisir entre :I réaliser l’interface (et dupliquer le code mais hériter d’une autre classe)I hériter de la classe abstraite (récupérer le code) mais sans pouvoir hériter

d’une autre classe

Exemple : L’API des collections en Java :

Collection et AbstractCollection,

List et AbstractList, etc.

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 29 / 128

Page 30: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons fondamentaux

DélégationInterfaceClasse abstraiteInterface et Classe abstraiteImmuableInterface de marquage

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 30 / 128

Page 31: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Immuable

Intention :I Augmenter la robustesse des objets partageant les mêmes objetsI Diminuer le coût de la gestion du parallélisme.

Intérêts :I facilite la gestion des objets partagés (personne ne peut les modifier !)I permet de réaliser une composition sans avoir à faire de copie des objetsI pas de besoin de synchonisation (lecture seule)I MAIS toute « modification » nécessite la création d’un nouvel objet

Exemple :I String (immuable) par opposition à StringBuffer (modifiable).

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 31 / 128

Page 32: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons fondamentaux

DélégationInterfaceClasse abstraiteInterface et Classe abstraiteImmuableInterface de marquage

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 32 / 128

Page 33: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Interface de marquage

Intention : Définir une propriété sémantique booléenne sur une classe

Solution : Hériter d’une interface de marquage (interface vide).

Exemples :I Cloneable indique que les objets d’une classe peuvent être clonés.I Serializable indique qu’un objet peut être sérialisé1

Forces :I Tester une propriété d’un objet/classe sans connaître la classe réelle

1 Object copie = null;2 if (o instanceof Cloneable) {3 copie = o.clone();4 } else {5 throw new CloneNotSupportedException();6 }

I MAIS La propriété ne peut jamais être supprimée/désactivée(obligatoirement héritée par les sous-classes)

1sérialiser : encoder l’information en mémoire sous forme d’octets ou autres pour lasauvegarder (persistance), la transporter à travers un réseau, etc.

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 33 / 128

Page 34: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Sommaire

1 Pourquoi les patrons ?

2 Patrons fondamentaux

3 Patrons créateurs

4 Patrons structurels

5 Patrons comportementaux

MonteurFabriqueFabrique abstraitePrototypeSingleton

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 34 / 128

Page 35: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons créateurs

But : Définir un mécanisme de création de classes ou d’objets.Caractéristiques clés :

le patron encapsule (masque) la connaissance des classes concrètes

le patron masque comment leurs instances sont créées et combinées.

Conséquence : Un modèle créateur offre une grande liberté concernant :

quels objets doivent être créés

qui doit les créer

comment les créer

quand les créer

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 35 / 128

Page 36: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons créateurs

MonteurFabriqueFabrique abstraitePrototypeSingleton

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 36 / 128

Page 37: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Monteur (Builder)

IntentionDissocier la construction d’un objet complexe de sa représentation, desorte que le même processus de construction permette desreprésentations différentes.

Alias : —

Indications d’utilisationI l’algorithme de création d’un objet complexe doit être indépendant des

parties qui composent l’objet et de la manière dont ces parties sontagencées

I le processus de construction doit autoriser des représentations différentesde l’objet en construction

Exemple :I Créer un message électronique à partir du destinataire, de l’expéditeur, de

l’objet, du texte, des fichiers attachés, etc.

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 37 / 128

Page 38: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Monteur (Builder)Diagramme de classe

pour chaque objet de la structure {

}

monteur−>construirePartie()construirePartie

MonteurConcret

getRésultat

Produit

Directeur

construire construirePartie

Monteur

Exemple : Créer un messageélectronique (Produit) en précisant ledestinaire, l’objet, le texte, les fichiersattachés, etc. (construire les parties).

MessageBuilder

setTo(String)setObject(String)...getMessage(): Message

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 38 / 128

Page 39: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons créateurs

MonteurFabriqueFabrique abstraitePrototypeSingleton

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 39 / 128

Page 40: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Fabrique (Factory method)

IntentionI définir une interface pour la création d’un objet mais en laissant à des

sous-classes le choix des classes à instancier.I permettre à une classe de déléguer la création d’objets à des sous-classes.

Alias : Fabrication, Constructeur polymorphe (ou virtuel)

Indications d’utilisationI une classe ne peut pas prévoir les classes des objets qu’elle aura à créerI une classe attend de ses sous-classes qu’elles spécifient les objets qu’elles

créent

Exemples :I Créer un document qui peut être texte, dessin ou présentation en fonction

du nom du type de document.On veut pouvoir ajouter de nouveaux types de documents.

I Obtenir un manipulateur sur des objets graphiques.

Conséquence :I Il procure un gîte pour les sous-classes (objets élargis)I Il inter-connecte des hiérarchies parallèles de classes.

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 40 / 128

Page 41: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Fabrique (Factory method)Diagramme de classe

CréateurConcret

Créateur

fabriquer(): Product

fabriquer(): Product

Product

ProductConcret

Exemple : Créer une pizza en fonction de son nom : régina, calzone,savoyarde...

Autre exemple : La méthode iterator() de Iterable.

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 41 / 128

Page 42: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons créateurs

MonteurFabriqueFabrique abstraitePrototypeSingleton

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 42 / 128

Page 43: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Fabrique abstraite (Abstract Factory)

IntentionFournir une interface pour la création de familles d’objets apparentésou interdépendants, sans qu’il soit nécessaire de spécifier leurs classesconcrètes.

Alias : Kit

Indications d’utilisationI un système doit être indépendant de la manière dont ses produits ont été

construits, combinés ou représentésI un système est composé à partir d’une famille de produits, parmi plusieursI on souhaite renforcer le caractère de communauté d’une famille de

produits conçus pour être utilisés ensemble

Exemples : boîte à outils proposant plusieurs « look-and-feel »(décors).

Solution (principe) : définir une interface Fabrique qui déclare lesméthodes créerAscenceur, créerFenêtre, etc.

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 43 / 128

Page 44: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Fabrique abstraite (Abstract Factory)Exemple : toolkit pour interfaces graphiques utilisateur (GUI)

FabriqueGUI

créerBouton()

créerFenêtre()

FabriqueMotif

créerBouton()

créerFenêtre()

FabriqueWin

créerBouton()

créerFenêtre()

Client

Bouton

BoutonWinBoutonMotif

Fenêtre

FenêtreWinFenêtreMotif

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 44 / 128

Page 45: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Fabrique abstraite (Abstract Factory)Diagramme de classe

FabriqueAbstraite

créerProduitA()

créerProduitB()

FabriqueConcrète1

créerProduitA()

créerProduitB()

FabriqueConcrète2

créerProduitA()

créerProduitB()

Client

ProduitAbstraitA

ProduitA2ProduitA1

ProduitAbstraitB

ProduitB2ProduitB1

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 45 / 128

Page 46: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons créateurs

MonteurFabriqueFabrique abstraitePrototypeSingleton

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 46 / 128

Page 47: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Prototype

IntentionSpécifie le type des objets à créer par une instance (le prototype) etcrée de nouveaux objets en copiant ce prototype (clonage).

Alias : —

Indications d’utilisationI classes à instancier spécifiées à l’exécution (p.ex. chargement

dynamique).I éviter de construire une hiérachie de classes FabriqueI classes pouvant prendre un nombre réduit d’états (un prototype par état)

Exemples :I Éditeur de musique : les notes sont disponibles et copiées avant utilisationI Éditeur UML : les éléments apparaissent dans un menu et sont copiés pour

les ajouter sur le dessin (puis les adapter).

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 47 / 128

Page 48: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

PrototypeDiagramme de classe

p = prototype.clone()

clone()

PrototypeConcret2

clone()

PrototypeConcret1

Directeur

construire

prototype

clone()

Prototype

Exemple vu : Pour ajouter des commandes réversibles aux menustextuels, il ne faut pas exécuter directement la commande obtenue dumenu mais une copie de cette commande (mémorisation des informationspour pouvoir annuler).

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 48 / 128

Page 49: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons créateurs

MonteurFabriqueFabrique abstraitePrototypeSingleton

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 49 / 128

Page 50: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Singleton

IntentionGarantir qu’une classe n’a qu’une seule instance etfournir un point d’accès global à cette instance.

Alias : —

Indications d’utilisationI Il doit y avoir exactement une instance d’une classeI Cette instance doit être accessible globalementI Le type du singleton peut-être sous-classé

=⇒ la classe elle-même est responsable de gérer l’unicité de l’objet etson accès

Exemples : gestionnaire de fenêtres, file d’impression, etc.

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 50 / 128

Page 51: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

SingletonDiagramme de classe

Singleton

− instanceUnique: Singleton

− donnéesSingleton

+ getInstance(): Singleton

+ operation(...)

− Singleton()

1 /** Manière simple et traditionnelle de faire2 * un Singleton en Java.3 * Attention : non sûre si utilisation de threads4 */5 public class Singleton {6 private final static Singleton INSTANCE =7 new Singleton();8

9 // Interdire toute création d’instance10 // depuis une classe extérieure11 private Singleton() {}12

13 // Accès à l’instance unique14 public static Singleton getInstance() {15 return INSTANCE;16 }17

18 }

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 51 / 128

Page 52: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Sommaire

1 Pourquoi les patrons ?

2 Patrons fondamentaux

3 Patrons créateurs

4 Patrons structurels

5 Patrons comportementaux

AdaptateurPontCompositeDécorateurFaçadePoids moucheProcurationDiscussion

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 52 / 128

Page 53: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons structurels

Définir la façon d’assembler des classes et des objets pour réaliser desstructures complexes.

Agrégat d’objets conçus comme des « macro-composants ».

Patrons présentés :

AdaptateurPontCompositeDécorateurFaçadePoids moucheProcurationDiscussion

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 53 / 128

Page 54: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons structurels

AdaptateurPontCompositeDécorateurFaçadePoids moucheProcurationDiscussion

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 54 / 128

Page 55: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Adaptateur (Adapter)

IntentionConvertit l’interface d’une classe en une autre conforme à l’attented’un client.Permet de faire collaborer des classes aux interfaces incompatibles.

Alias : Empaqueteur (Wrapper)

Indications d’utilisationI On veut utiliser une classe dont l’interface ne coïncide pas avec celle

escomptéeI Prévoir l’ajout de classes non encore connues

Exemples :I Utiliser un ArrayList pour réaliser une Pile (Adaptation d’objet).I Restructuration de Vector avec List (Adaptation de classe)

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 55 / 128

Page 56: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Adaptateur (Adapter)Diagramme de classe pour l’Adaptateur de Classe

ClientBut

requête()

Adapteur

requêteSpécifique()

Adapté

«implantation»

requêteSpécifique()requête()

Exemple : SousMenu dans l’éditeur avec menu textuel

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 56 / 128

Page 57: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Adaptateur (Adapter)Diagramme de classe pour l’Adaptateur d’Objet

ClientBut

requête()

Adapteur

requêteSpécifique()

Adapté

requêteSpécifique()requête()

adapté

Exemple : CommandeGérerMenu dans l’éditeur avec menu textuel

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 57 / 128

Page 58: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons structurels

AdaptateurPontCompositeDécorateurFaçadePoids moucheProcurationDiscussion

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 58 / 128

Page 59: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Pont (Bridge)Intention

Découple une abstraction de sa réalisation afin que les deux puissent êtremodifiées indépendamment de l’autre

Alias : Poignée/Corps (Handler/Body)

Indications d’utilisation

I éviter un lien définitif entre une abstraction et son implantationI permettre la spécialisation des abstractions et des implantationsI un changement de l’implantation ne doit pas avoir d’impact sur les clientsI plusieurs objets partagent la même implantation mais ceci est transparent

pour les clients (compteur de références)

Exemples :

I Objets géométriques variés devant être affichés sur différents écrans.I L’abstraction Voiture doit pouvoir rouler sur une route (implantation).

Tout type de voiture doit pouvoir rouler sur tout type de route.

Conséquences :

I découplage entre abstraction et implantationI capacité d’extension accrueI dissimulation des détails d’implantation aux clients

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 59 / 128

Page 60: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Pont (Bridge)Diagramme de classe

imp.opérationImpl()

opérationImpl()

ImplanteurConcret1

opérationImpl()

ImplanteurConcret2

Directeur

opération

impl

opérationImpl()

Implanteur

AbstractionFine

Exemple : Dessiner (opération) les objets géométriques (abstraction) surun afficheur (implantation).

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 60 / 128

Page 61: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons structurels

AdaptateurPontCompositeDécorateurFaçadePoids moucheProcurationDiscussion

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 61 / 128

Page 62: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Composite

IntentionI Compose des objets en des structures arborescentes pour représenter des

hiérarchies composant/composé.I Permet au client de traiter uniformément un objet individuel ou les

combinaisons de ceux-ci

Alias : —

Indications d’utilisationI représentation de structures récursives d’éléments hétérogènesI traitement uniforme d’un objet individuel ou d’une combinaison d’objets

Exemples : Groupe dans éditeur de schémas mathématiques.

Conséquences :

+ facilite l’ajout de nouveaux types de composants– difficile d’imposer des contraintes sur les compositions possibles

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 62 / 128

Page 63: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

CompositeDiagramme de classe

Feuille

opération()

supprimer(Composant)

ajouter(Composant)getEnfant(int)

opération()

supprimer(Composant)

ajouter(Composant)getEnfant(int)

opération()Clientenfant

0..*

Composant

for (Composant c: enfants) {

c.opération()

}

Composite

Attention : les opérations manipulant les composés peuvent ou non êtreremontées au niveau du composant : compromis entre sécurité ettransparence (pour le client)

Exemple : Groupe d’objets géométriques.

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 63 / 128

Page 64: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons structurels

AdaptateurPontCompositeDécorateurFaçadePoids moucheProcurationDiscussion

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 64 / 128

Page 65: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Décorateur (Decorator)Intention

I Attache dynamiquement des responsabilités supplémentaires à un objetI Alternative souple à l’héritage pour ajouter de nouvelles fonctionnalités

Alias : Emballeur (Wrapper)

Indications d’utilisation

I ajouter dynamiquement de nouvelles fonctionnalités, de manièretransparente (sans changement d’interface)

I définir des responsabilités qui peuvent être ajoutées/retiréesI éviter un héritage impossible à cause du trop grand nombre d’extensions

indépendantes possibles

Exemples :

I Éléments optionnels (bord, ascenseur...) sur un composant graphiqueI Flots d’entrée/sorties en Java (aussi appelé Filtre dans ce cas).

Conséquences :

I plus de souplesse que l’héritage (qui est statique)I évite de surcharger en fonctionnalités les classes de haut niveauI composant et composant décoré n’ont pas la même identité (adresse) !I de nombreux petits objets !

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 65 / 128

Page 66: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Décorateur (Decorator)Diagramme de classe

+ opération()

ComposantConcret Décorator

+ opération()

Composant

+ opération()

DécorateurConcretBDécorateurConcretA

+ opération()

+ otherOperation() + opération()

− otherAttribute

− leComposant

code:

leComposant.opération()

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 66 / 128

Page 67: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Décorateur (Decorator)Diagramme de séquence

: Test

comp : ComposantConcret

dec : DécorateurConcretA« create » (comp)

« create »

opération()opération()

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 67 / 128

Page 68: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Décorateur (Decorator)Exemple : élément graphique avec décorations

ScrollBarDecorator

# paintComponent(g: Graphics)

JComponent

MyPanel Decorator

− component

+ MyPanel(title: String)

# paintComponent(g: Graphics)# paintComponent(g: Graphics)

+ BorderDecorator(component_: JComponent,

couleur_: java::awt::Color)

+ setCouleur(couleur_: java::awt::Color)

+ getCouleur(): java::awt::Color

# paintComponent(g: Graphics)

BorderDecorator

− couleur: java::awt::Color1 JComponent c =2 new BorderDecorateur(3 new ScrollBarDecorateur(4 new MyPanel()));

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 68 / 128

Page 69: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons structurels

AdaptateurPontCompositeDécorateurFaçadePoids moucheProcurationDiscussion

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 69 / 128

Page 70: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Façade (Facade)

Intention

Fournit une interface unifiée pour un sous-système, interface de hautniveau rendant le système plus facile à utiliser (couplage réduit).

Alias : —

Indications d’utilisationI On souhaite disposer d’une interface simple pour un système complexeI diminuer le couplage entre un sous-système et les clientsI structuration d’un sous-système en niveaux

Exemple :

Un compilateur (compiler) qui utilise l’analyseur lexical, l’analyseursyntaxique, l’analyseur sémantique, une table des symboles, engendre ducode pour plusieurs architectures, etc.

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 70 / 128

Page 71: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Façade (Facade)Diagramme de classe

sous−système

classes client

Façade

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 71 / 128

Page 72: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons structurels

AdaptateurPontCompositeDécorateurFaçadePoids moucheProcurationDiscussion

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 72 / 128

Page 73: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Poids mouche (Flyweight)

Intention

Utilise une technique de partage permettant la mise en œuvre efficaced’un grand nombre d’objets de granularité fine.

Alias : —

Indications d’utilisationI Détérioration des performances due à un trop grand nombre de petits

objets (coût de stockage élevé)I Distinction possible entre état intrinsèque et extrinsèque (fonction du

contexte client)I Partage possible des états intrinsèques.

Exemples :I Analyse lexicale : unités lexicales gérées comme des poids mouches

F état intrinsèque : la chaîneF état extrinsèque : ligne et colonne du premier caractère

Implantation :I déportation des états extrinsèquesI gestion des objets partagés

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 73 / 128

Page 74: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Poids mouche (Flyweight)Diagramme de classe

PoidsMoucheConcret

operation(etatExtrinseque)

étatIntrinsèque

}

return nouveau poids mouche

l’ajouter au parc à poids mouches

créer un nouveau poids mouche

} sinon {

return poids mouche existant

si poidsMouche(touche) existe {

operation(etatExtrinseque)

PoidsMouche

operation(etatExtrinseque)

toutEtat

PoidsMoucheConcretNonPartagé

FabriqueDePoidsMouche

getPoidsMouche(touche)

Client

*

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 74 / 128

Page 75: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons structurels

AdaptateurPontCompositeDécorateurFaçadePoids moucheProcurationDiscussion

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 75 / 128

Page 76: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Procuration (Proxy)

Intention

Fournit à un client un mandataire ou un remplaçant pour contrôler l’accèsà un objet fournisseur

Alias : Subrogé (Surrogate), Mandataire, Procuration

Indications d’utilisation

I procuration à distance : représentant local d’un objet distantI procuration virtuelle : création d’objet à la demandeI procuration de protection : contrôle les accès au fournisseurI référence intelligente (smart pointer) : remplaçant d’un pointeur brut qui

ajoute compteur de références, chargement en mémoire d’un objetpersistant...

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 76 / 128

Page 77: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Procuration (Proxy)Diagramme de classe

Procuration

requête

sujetRéel.requête()

...

...

Sujet

requête

SujetRéel

requête

Client

sujetRéel

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 77 / 128

Page 78: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons structurels

AdaptateurPontCompositeDécorateurFaçadePoids moucheProcurationDiscussion

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 78 / 128

Page 79: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons structurelsDiscussion

Similitudes entre ces patrons mais des intentions différentes !

Mécanismes communs :I héritage : pour les patrons dont le domaine est classeI délégation : pour les patrons dont le domaine est objet

Adapteur et Pont : indirection et ré-expédition de requêtes entre uneinterface et une réalisation

Façade : construction d’une nouvelle interface

Composite et Décorateur : agrégats récursifs

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 79 / 128

Page 80: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Sommaire

1 Pourquoi les patrons ?

2 Patrons fondamentaux

3 Patrons créateurs

4 Patrons structurels

5 Patrons comportementaux

Chaîne de responsabilitésCommandeInterpréteurItérateurMédiateurMémentoObservateurÉtatStratégiePatron de méthodeVisiteur

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 80 / 128

Page 81: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons comportementaux

Chaîne de responsabilitésCommandeInterpréteurItérateurMédiateurMémentoObservateurÉtatStratégiePatron de méthodeVisiteur

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 81 / 128

Page 82: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Chaîne de responsabilités (Chain of Responsibility)

Intention

I Évite le couplage entre l’émetteur d’une requête et ses récepteursI Chaîne les récepteurs qui se passent la requête jusqu’à ce qu’un la traite

(le gestionnaire)

Alias : —

Indications d’utilisationI Une requête peut être gérée par plus d’un objet à la fois et le gestionnaire

n’est pas connu a priori (déterminé dynamiquement)I On souhaite adresser une requête à plusieurs objets, sans spécifier

explicitement le récepteurI Les objets qui traitent la demande doivent être définis dynamiquement

Exemples :I même principe que les exceptions Java : récepteurs = catch

Conséquences :I Réduction du couplageI Souplesse accrue dans l’attribution des responsabilitésI Pas de garantie de traitement de la requête !

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 82 / 128

Page 83: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Chaîne de responsabilités (Chain of Responsibility)Diagramme de classe

GestionnaireConcret1

gérerRequête

GestionnaireConcret2

gérerRequête

Gestionnaire

gérerRequête

Client

successeur

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 83 / 128

Page 84: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons comportementaux

Chaîne de responsabilitésCommandeInterpréteurItérateurMédiateurMémentoObservateurÉtatStratégiePatron de méthodeVisiteur

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 84 / 128

Page 85: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Commande (Command)

IntentionI encapsuler une requête (ou un traitement) comme un objet (version objet

des callbacks)I paramétrer le contexte clientI gestion possible des requêtes/traitements en FIFO, annulation possible.

Alias : Action, Transaction

Indications d’utilisation :

I réaliser un principe de callbackI permettre de mémoriser des modificationsI structurer le système en opérations de haut niveau (transaction)I voir aussi Intention

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 85 / 128

Page 86: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Commande (Command)Diagramme de classe

récepteur−>action()

Récepteur

action()

CommandeConcrète

exécuter()

état

Invocateur

exécuter()

Commande

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 86 / 128

Page 87: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons comportementaux

Chaîne de responsabilitésCommandeInterpréteurItérateurMédiateurMémentoObservateurÉtatStratégiePatron de méthodeVisiteur

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 87 / 128

Page 88: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Interpréteur (Interpreter)

IntentionDéfinit une représentation de la grammaire d’un langage simple ainsiqu’un interpréteur.

Alias : —

Indications d’utilisationI la grammaire du langage doit être simpleI l’efficacité n’est pas un souci majeur

Exemples : Évaluer une expression arithmétique

Conséquences :I les grammaires complexes sont difficiles à maintenir

=⇒ utiliser des générateurs de compilateur (javacc, java_cup, antlr, etc.)

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 88 / 128

Page 89: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons comportementaux

Chaîne de responsabilitésCommandeInterpréteurItérateurMédiateurMémentoObservateurÉtatStratégiePatron de méthodeVisiteur

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 89 / 128

Page 90: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Itérateur (Iterator)

Intention

Fournit un moyen pour accéder séquentiellement à chacun des élémentsd’un agrégat d’objets sans révéler la représentation interne de l’agrégat

Alias : Curseur (Cursor)

Indications d’utilisation

I accéder aux éléments d’un agrégat sans révéler sa structure interneI gérer simultanément plusieurs parcours sur des agrégatsI offrir une interface uniforme pour parcourir différents types d’agrégats

Exemples :

I Les itérateurs des collections Java

Conséquences :

I possibilité de définir plusieurs parcours (infixe et préfixe par exemple)I simplification de l’interface de l’agrégatI parcours simultanés possibles sur un même agrégat

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 90 / 128

Page 91: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Itérateur (Iterator)Diagramme de classe

0..1

ListeChaînée

ListeTab

OutilsListe

Cellule

élément: double 0..1

0..1suivante

− première

<< interface >>

suivant(): T

encore(): boolean

suivant(): T

ItérateurTab

<<utilise>>

somme(liste: Liste): double

Itérateur

suivant(): T

encore(): boolean

«interface»

Liste

encore(): boolean

ItérateurChainé

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 91 / 128

Page 92: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons comportementaux

Chaîne de responsabilitésCommandeInterpréteurItérateurMédiateurMémentoObservateurÉtatStratégiePatron de méthodeVisiteur

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 92 / 128

Page 93: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Médiateur (Mediator)Intention

I Définit un objet encapsulant les modalités d’interaction d’autres objetsI Limite le couplage car évite une référence explicite entre ces objets

Alias : —

Indications d’utilisationI Les objets d’un ensemble communiquent d’une façon bien définie mais

complexe : inter-dépendances non structurées et difficiles à appréhenderI Réutilisation difficile d’un objet car fait référence à beaucoup d’objetsI Un comportement distribué entre plusieurs classes doit pouvoir être

spécialisé sans multiplier les sous-classes

Exemple : médiateur entre les éléments graphiques d’une boîte de dialogue

Conséquences :

I limite la création de sous-classes (seulement du médiateur, pas descollègues)

I réduit le couplage entre collèguesI simplifie les protocoles objet (interaction 1–plusieurs)I formalise la coopération des objetsI centralise le contrôle

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 93 / 128

Page 94: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Médiateur (Mediator)Diagramme de classe

Médiateur

MédiateurConcret

Collègue

CollègueConcret1 CollègueConcret2

médiateur

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 94 / 128

Page 95: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons comportementaux

Chaîne de responsabilitésCommandeInterpréteurItérateurMédiateurMémentoObservateurÉtatStratégiePatron de méthodeVisiteur

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 95 / 128

Page 96: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Mémento (Memento)

Intention

Transmettre à l’extérieur d’un objet son état interne sans violation del’encapsulation dans le but de restaurer ultérieurement sont état.

Alias : Jeton

Indications d’utilisationI un instantané de tout ou partie d’un objet doit être mémoriséI et l’utilisation d’une interface directe pour atteindre l’état conduirait à

rompre l’encapsulation

Exemples :I Pouvoir passer les niveaux déjà atteints dans un jeuI Déplacer des objets graphiques reliés. Classe Résolution des contraintes.

Nécessité de collaborer avec Résolution pour annuler.

Conséquences :I préservation des frontières de l’encapsulationI simplification de l’auteur (car encapsulation préservée)I l’utilisation d’un mémento peut être coûteuseI peut être difficile de garantir que seul l’auteur aura accès au mémento

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 96 / 128

Page 97: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Mémento (Memento)Diagramme de classe

Mémento

état

Mémento(état)

getEtat()

SurveillantAuteur

créerMémento(): Mémento

installerMémento(m: Mémento)

état

return new Mémento(état) état = m.getEtat()

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 97 / 128

Page 98: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons comportementaux

Chaîne de responsabilitésCommandeInterpréteurItérateurMédiateurMémentoObservateurÉtatStratégiePatron de méthodeVisiteur

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 98 / 128

Page 99: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Observateur (Observer)

Intention

Définit une interdépendance de type un à plusieurs de sorte que quand unobjet change d’état, tous ceux qui en dépendent en soient avertis etautomatiquement mis à jour

Alias : Dépendants, Diffusion–Souscription (Publish–Subscribe)

Indications d’utilisation

I Pour faciliter la réutilisation de deux représentations inter-dépendantesd’un même concept

I Quand la modification d’un objet nécessite de modifier un nombreindéterminé d’autres objets

I Quand un objet doit notifier d’autres objets sans faire d’hypothèses sur lanature de ces objets (faible couplage)

Exemples : Plusieurs vues sur un même modèle

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 99 / 128

Page 100: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Observateur (Observer)Diagramme de classe

for(Observateur s: observateurs) { o.mettreAJour();}

Observateur

+ mettreAJour()

observateurs

+ inscrire (o : Observateur) 0..*

SujetConcret ObservateurConcret

getEtat()mettreAJour

etat

+ annuler (o : Observateur)

# avertir()

Sujet

sujet

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 100 / 128

Page 101: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Observateur (Observer)Exemple

− extremite1,− extremite2

2 *Point Segment

for (Observateur o: observateurs) { o.mettreAJour();}

Observable Observateur

+ mettreAJour()

observateurs

+ annuler (o : Observateur)

+ inscrire (o : Observateur)

# avertir()

0..*

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 101 / 128

Page 102: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons comportementaux

Chaîne de responsabilitésCommandeInterpréteurItérateurMédiateurMémentoObservateurÉtatStratégiePatron de méthodeVisiteur

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 102 / 128

Page 103: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

État (State)

IntentionPermet à un objet de modifier son comportement quand son étatinterne change. Donne l’impression que l’objet change de classe.

Alias : —

Indications d’utilisationI le comportement d’un objet dépend de son état (changement dynamique)I les opérations contiennent des conditionnelles en fonction de l’état de

l’objet

Exemples :I Le joueur d’une équipe de foot (presque !)I Une ConnexionTCP qui répondra différemment à une demande d’ouverture

suivant son état (établie, écoute, fermée).

Conséquence :I Partionnement des différents comportements, état par étatI Rend explicite les transitions d’étatI Les objets État peuvent être partagés (si pas d’attributs d’instance) : poids

mouche

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 103 / 128

Page 104: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

État (State)Diagramme de classe

gérer()

ÉtatConcretA

état.gérer()

étatContexte

requete()

gérer()

ÉtatConcretB

État

gérer()

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 104 / 128

Page 105: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons comportementaux

Chaîne de responsabilitésCommandeInterpréteurItérateurMédiateurMémentoObservateurÉtatStratégiePatron de méthodeVisiteur

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 105 / 128

Page 106: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Stratégie (Strategy)

IntentionI Définit une famille d’algorithme, encapsule chacun d’entre eux et les rend

interchangeables.I Permet aux algorithmes d’évoluer indépendamment de leurs clients

Alias : Politique

Indications d’utilisationI Plusieurs classes apparentées ne différent que par leur comportementI On a besoin de diverses variantes d’un algorithme.I Un algorithme utilise des données que les clients n’ont pas à connaître

(masquer les structures complexes)I Une classe définit de nombreux comportements figurant dans des

conditionnelles multiples : faire autant de classes Stratégie

Exemples :I Gérer les coupures de fin de ligneI trier les éléments d’une collection

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 106 / 128

Page 107: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Stratégie (Strategy)Diagramme de classe

StratégieConcrèteB

interfaceAlgorithme()

Stratégie

interfaceAlgorithme()

StratégieConcrèteA

interfaceAlgorithme()

stratégie.interfaceAlgorithme()

stratégieContexte

interfaceContexte()

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 107 / 128

Page 108: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons comportementaux

Chaîne de responsabilitésCommandeInterpréteurItérateurMédiateurMémentoObservateurÉtatStratégiePatron de méthodeVisiteur

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 108 / 128

Page 109: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patron de méthode (Template Method)

IntentionDéfinit, dans une opération, le squelette d’un algorithme en endéléguant certaines étapes à des sous-classes.

Alias : —

Indications d’utilisationI Pour implanter une fois pour toutes les parties invariantes d’un algorithmeI Pour isoler et factoriser le comportement comment à des sous-classesI contrôler les extensions des sous-classes (garantir un certain

comportement)

Exemples :I exécuter un test unitaire avec préparer (setUp), tester (test*) et

comptabiliser le résultat du test et nettoyer (tearDown).

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 109 / 128

Page 110: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patron de méthode (Template Method)Diagramme de classe

ClasseConcrète

ClasseAbstraite

opérationPrimitive1()

patronMethode()

opérationPrimitive2()

opérationPrimitive1()

opérationPrimitive2()

...

opérationPrimitive1()

...

opérationPrimitive2()

...

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 110 / 128

Page 111: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons comportementaux

Chaîne de responsabilitésCommandeInterpréteurItérateurMédiateurMémentoObservateurÉtatStratégiePatron de méthodeVisiteur

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 111 / 128

Page 112: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Visiteur (Visitor)

IntentionModélise par une classe une opération applicable aux éléments d’unestructure d’objets et permet de définir de nouvelles opérations sansmodifier les classes de la structure

Alias : —

Indications d’utilisationI Une structure d’objets contient beaucoup de classes différentes

d’interfaces distinctes et l’on veut réaliser des traitements qui dépendentde leurs classes concrètes.

I Il s’agit de réaliser plusieurs traitements distincts sans relation entre eux,sur les objets de la structure, sans polluer leurs classes

I Les classes qui définissent la structure d’objet changent rarement mais ondoit souvent définir de nouvelles opérations sur cette struture.

Exemples : Afficher en infixe, préfixe et postfixe une expressionentière, calculer sa valeur, etc.

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 112 / 128

Page 113: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Visiteur (Visitor)Diagramme de classe

accepter(v:Visiteur)opérationB()

v.visiterÉlémentB(this)

accepter(v:Visiteur)opérationA2()

v.visiterÉlémentA2(this)

accepter(v:Visiteur)opérationA1()

v.visiterÉlémentA1(this)

accepter(v:Visiteur)

Client

ÉlémentB ÉlémentA2ÉlémentA1

ÉlémentAbstraitAStructureDObjets

Visiteur

visiterÉlémentB(ÉlémentB)

visiterÉlémentA1(ÉlémentA1))visiterÉlémentA2(ÉlémentA2)

VisiteurConcret2

visiterÉlémentB(ÉlémentB)

visiterÉlémentA1(ÉlémentA1))visiterÉlémentA2(ÉlémentA2)

VisiteurConcret1

visiterÉlémentB(ÉlémentB)

visiterÉlémentA1(ÉlémentA1))visiterÉlémentA2(ÉlémentA2)

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 113 / 128

Page 114: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Visiteur appliqué aux objets géométriques :

problème poséDiagramme de classe structurel des objets géométriques :

ObjetGéométrique

Pointxy

PointNomménom

Segment GroupeCerclerayon

2

e1, e2

1

centre

*

élément

Traitements à implanter :

1 obtenir le nom en français d’unélément : segment, point...

2 obtenir le nom en anglais3 nombre de points utilisés pour

caractériser un élément

4 afficher un élément5 dessiner un élément6 translater un élément7 obtenir la bounding box d’un

élément

... et on pourrait envisager bien d’autres traitements !Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 114 / 128

Page 115: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Solution objet « classique »

Principe : Pour chaque opération, mettre une méthode sur les typesgénéraux (ObjetGéométrique et Point) et la (re)définir dans les sous-classes.

ObjetGéométrique

nom(): StringnbPoints(): inttranslater(dx, dy)

Pointxy

nom(): StringnbPoints(): inttranslater(dx, dy)

PointNomménom

nom(): String

Segment

nom(): StringnbPoints(): inttranslater(dx, dy)

Groupe

nom(): StringnbPoints(): inttranslater(dx, dy)

Cerclerayon

nom(): StringnbPoints(): inttranslater(dx, dy)

2e1, e2

1centre

*

élément

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 115 / 128

Page 116: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Problèmes induits par cette solution

Solution opérationnelle mais :

chaque traitement est éclaté sous l’ensemble de la structure de classes

la structure est polluée par les différents traitements

il faut pouvoir modifier les classes pour ajouter de nouveauxtraitements

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 116 / 128

Page 117: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Principe du visiteur

Principe : Écrire une classe par traitement.

Moyen :I regrouper dans une classe traitement les méthodes implantant ce

traitementI mettre un paramètre explicite correspond à la classe traitéeI rendre accessibles les informations internes de la structure (accesseurs)

Nouveau diagramme de classe : diagramme structurel initial +

NomFrançais

nom(p: Point): Stringnom(pn: PN): Stringnom(s: Segment): Stringnom(c: Cercle): Stringnom(g: Groupe): String

NombrePoints

nbPoints(p: Point): intnbPoints(pn: PN): intnbPoints(s: Segment): intnbPoints(c: Cercle): intnbPoints(g: Groupe): int

Translateur

translater(p: Point, dx, dy)translater(pn: PN, dx, dy)translater(s: Segment, dx, dy)translater(c: Cercle, dx, dy)translater(g: Groupe, dx, dy)

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 117 / 128

Page 118: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Traitements NomFrancais et NomAnglais : pas de

problème

1 public class NomFrancais {2 public String nom(Point p) { return "point"; }3 public String nom(PointNomme pn) { return "point nommé"; }4 public String nom(Segment s) { return "segment"; }5 public String nom(Cercle c) { return "cercle"; }6 public String nom(Groupe g) { return "groupe"; }7 }

1 public class NomAnglais {2 public String nom(Point p) { return "point"; }3 public String nom(PointNomme pn) { return "named point"; }4 public String nom(Segment s) { return "segment"; }5 public String nom(Cercle c) { return "circle"; }6 public String nom(Groupe g) { return "group"; }7 }

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 118 / 128

Page 119: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Traitement NombrePoints : pas si facile !1 public class NombrePoints {2 public int nbPoints(Point p) { return 1; }3 public int nbPoints(PointNomme pn) { return 1; }4 public int nbPoints(Segment s) { return 2; }5 public int nbPoints(Cercle c) { return 1; }6 public int nbPoints(Groupe g) {7 int somme = 0;8 for (ObjetGeometrique og : g.elements()) {9 if (og instanceof Segment) {

10 somme += nbPoints((Segment) og);11 } else if (og instanceof Cercle) {12 somme += nbPoints((Cercle) og);13 } else if (og instanceof Groupe) {14 somme += this.nbPoints((Groupe) og);15 } else {16 throw new RuntimeException("Erreur dans le traitement par cas !");17 }18 }19 return somme;20 }21 } Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 119 / 128

Page 120: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Critiques et... une solution

Ça marche mais :I Faire des instanceof est une mauvaise idée !

=⇒ voir l’exception levée...I De nombreux traitements nécessitent ce traitement par cas : afficher,

translater, dessiner, bounding box, etc.

On sait comment faire pour l’éviter !I Il suffit de mettre une méthode correspondant au traitement fait dans le

type général et la redéfinir dans les sous-classes....I MAIS on retombe sur la solution initiale :(

Solution :I C’est bien en ajoutant une méthode sur les classes de la structure que l’on

peut faire la sélection de la bonne méthode sans instanceofI L’idée est de ne définir qu’une seule méthode, et non une par traitementI Il faut généraliser les différents traitements : c’est le Traitement/Visiteur !I Il faut unifier le nom des méthodes : traiter/visiterI Le type de retour change ? La généricitéI Et la méthode sur ObjetGéometrique ?

exécuter(Traitement)/accepter(Visiteur)

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 120 / 128

Page 121: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

L’architecture du Visiteur

ObjetGéométrique

<R> R exécuter(Traitement<R>)

Pointxy

exécuter

PointNomménom

exécuter

Segment

exécuter

Groupe

exécuter

Cerclerayon

exécuter

2e1, e2

1centre

*

élément

«interface»Traitement<R>

traiter(p: Point): Rtraiter(pn: PN): Rtraiter(s: Segment): Rtraiter(c: Cercle): Rtraiter(g: Groupe): R

Translateur

dx, dy: double

traiter(p: Point)traiter(pn: PN)traiter(s: Segment)traiter(c: Cercle)traiter(g: Groupe)

NombrePoints

traiter(p: Point): Integertraiter(pn: PN): Integertraiter(s: Segment): Integertraiter(c: Cercle): Integertraiter(g: Groupe): Integer

NomFrançais

traiter(p: Point): Stringtraiter(pn: PN): Stringtraiter(s: Segment): Stringtraiter(c: Cercle): Stringtraiter(g: Groupe): String

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 121 / 128

Page 122: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Un peu de code...l’interface Traitement

1 public interface Traitement<R> {2 R traiter(Point p);3 R traiter(PointNomme pn);4 R traiter(Segment s);5 R traiter(Cercle c);6 R traiter(Groupe g);7 }

Le code de exécuter dans les interfaces et classes abstraites :

1 abstract public <R> R exécuter(Traitement<R> t);

Le code de exécuter dans les classes concrètes :

1 public class Cercle {2 public <R> R exécuter(Traitement<R> t) {3 return t.traiter(this);4 }5 ...6 }7 ...Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 122 / 128

Page 123: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Un peu de code : traitement NombrePoints

1 public class NombrePoints implements Traitement<Integer> {2 Integer traiter(Point p) { return 1; }3 Integer traiter(PointNomme pn) { return 1; }4 Integer traiter(Segment s) { return 2; }5 Integer traiter(Cercle c) { return 1; }6 Integer traiter(Groupe g) {7 int somme = 0;8 for (ObjetGeometrique og : g.elements()) {9 somme += og.executer(this);

10 }11 return somme;12 }13 }

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 123 / 128

Page 124: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Utiliser un visiteur1 Point p1 = new Point(10, −2);2 Point p2 = new PointNomme(3, 4, "A");3 Segment s = new Segment(p1, p2);4 Cercle c = new Cercle(new Point(1, 2), 10);5 Groupe g = new Groupe();6 g.ajouter(s);7 g.ajouter(c);8 ObjetGeometrique og = g;9 Traitement<Integer> compteur = new NombrePoints();

10 int nbPoints;11 nbPoints = g.executer(compteur); // ???12 nbPoints = og.executer(compteur); // ???13 nbPoints = compteur.traiter(g); // ???14 nbPoints = compteur.traiter(og); // ???15 Traitement<String> nf = new NomFrancais();16 String nom;17 nom = p2.executer(nf); // ???18 nom = nf.traiter(p2); // ???

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 124 / 128

Page 125: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Visiteur appliqué aux objets géométriquesDiagramme de séquence de g.exécuter(compteur)

main g: Groupe c: Cercle compteur s: Segment

exécuter(compteur)

traiter(g)

exécuter(compteur)

{somme = 0}

traiter(c)

1

1

{somme = 1}

exécuter(compteur)

traiter(s)

2

2

3

{somme = 3}

3

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 125 / 128

Page 126: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Visiteur (Visitor)conséquences et implantation

Conséquences :I il facilite l’ajout de nouveaux traitementsI un visiteur rassemble les opérations d’un même type (Visiteur concret)I l’addition de nouvelles classes à la structure est difficileI se promener dans une hiérarchie de classe : itérateur (partiel).I thésaurisation des informations d’état dans un visiteurI rupture d’encapsulation (interface des Éléments riche)

ImplantationI Double aiguillage : deux critères déterminent l’opération à effectuer, le

Visiteur et l’Élément.I Qui organise le parcours de la structure d’objet :

F le visiteurF la structure d’objet (souvent choisi)F un itérateur à part

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 126 / 128

Page 127: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Patrons comportementaux : synthèse

Encapsultation des parties variablesI Stratégie : : un algorithmeI Patron de méthode : les étapes d’un algorithmeI État : un comportement dépendant de l’étatI Médiateur : un protocoleI Itérateur : le parcours d’un agrégat

Relations statiques supportant la communicationI Commande, Observateur, Médiateur, Chaîne de responsabilités :

découplage entre émetteur et récepteurI Médiateur : communication encapsuléeI Observateur : communication distribuée

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 127 / 128

Page 128: Patrons de conception (Design Patterns)cregut.perso.enseeiht.fr/ENS/2018-2sn-idm/CONTENU/idm-2... · 2018. 9. 12. · Historique Notion de « patron » d’abord apparue en architecture

Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides.Design Patterns.Addison-Wesley Professional, January 1995.

Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides.Design Patterns, Catalogue de modèles de conceptions réutilisables.Vuibert, October 1999.

Mark Grand.Patterns in Java: A Catalog of Reusable Design Patterns Illustrated withUML, volume 1.Wiley, 2 edition, 2002.

Wikipedia : Design Pattern.http://en.wikipedia.org/wiki/Design_pattern_%28computer_

science%29.

Xavier Crégut (ENSEEIHT) Patrons de conception(Design Patterns) 128 / 128


Recommended