Académique Documents
Professionnel Documents
Culture Documents
DESIGN PATTERNS
PatronS de conception
Plan
Introduction
Rappel sur la programmation objet
Principes de conception SOLID
Patrons de conception
Patrons de création: Fabrique, Fabrique abstraite, Prototype,
Singleton, Monteur
Patrons de structure: Décorateur, Adapteur, Façade, Pont, Objet
composite, Poids-mouche, Proxy
Patrons de comportement: Observateur, Stratégie, Commande,
Médiateur, Chaîne de responsabilité, Itérateur, Interpréteur, Etat,
Patron de méthode, Visiteur, Fonction de rappel
1
10/11/2020
2
10/11/2020
maintenable
extensible
fiable
(facilement) Extensible
Fiable
Réutilisable
3
10/11/2020
Mise en œuvre
Programmation orientée objet SOLID
Ouverture/fermeture (Open/Closed)
Une classe doit être ouverte aux extensions (ajouts) mais fermée aux modifications (du code
existant)
4
10/11/2020
5
10/11/2020
6
10/11/2020
7
10/11/2020
8
10/11/2020
9
10/11/2020
10
10/11/2020
11
10/11/2020
12
10/11/2020
13
10/11/2020
Conséquences:
Il faut modifier les modules de haut niveau quand les modules de bas
niveau évoluent.
On ne peut pas réutiliser les modules de haut niveau (la logique « métier »)
dans un contexte technique autre que celui d’origine
14
10/11/2020
15
10/11/2020
16
10/11/2020
17
10/11/2020
18
10/11/2020
Design Patterns
Un patron décrit (et nomme) une
solution à un problème Commun
Offre une solution abstraite pour faciliter la
réutilisation
Est formulé en termes de classes et d’objets
Peut être implémenté différemment en
fonction du langage de programmation
utilisé
La solution proposée par un patron
peut être modifiée ou adaptée selon
les besoins du logiciel
« Forcer » l’utilisation d’un patron dans un
Référence de base de
logiciel est une mauvaise pratique de ce cours
développement
Design Patterns
Les design patterns (patrons de conception)
décrivent des procédés généraux et réutilisables
pour concevoir des logiciels
Les design patterns mettent en œuvre les
principes SOLID
Un design pattern décrit une bonne pratique et
une solution standard en réponse à un problème
de conception d'un logiciel
19
10/11/2020
Design Patterns
Types de patrons
Création (créer des objets)
Font l’abstraction du processus d’instanciation afin de rendre un système
indépendant de la façon dont ses objets sont créés et représentés
Patrons: Fabrique, Fabrique abstraite, Prototype, Singleton, Monteur
Structure (organiser les classes)
Se concentrent sur la façon dont les classes et les objets sont composés pour
obtenir de plus grandes structures
Patrons: Décorateur, Adapteur, Façade, Pont, Objet composite, Poids-
mouche, Proxy
Comportement (organiser la collaboration entre objets)
Décrivent les modèles de communication et interaction entres les objets
Patrons: Observateur, Stratégie, Commande, Médiateur, Chaîne de
responsabilité, Iterateur, Interpréteur, Etat, Patron de méthode, Visiteur, Fonction
de rappel
20
10/11/2020
21
10/11/2020
22
10/11/2020
23
10/11/2020
Un vrai cauchemar au
plan de la maintenance
24
10/11/2020
25
10/11/2020
Principe de conception
Principe Programmer une interface, non une implémentation
26
10/11/2020
27
10/11/2020
28
10/11/2020
29
10/11/2020
30
10/11/2020
Diagramme de classes
Diagramme de classes
31
10/11/2020
32
10/11/2020
33
10/11/2020
ajouterObservateur(Observateur), supprimerObservateur(Observateur),
notifierObservateurs() et getEtat(). Les deux premières permettent, respectivement,
d’ajouter des observateurs à l’écoute de la classe et d’en supprimer.
La méthode getEtat() est un simple accesseur en lecture pour l’état. En effet, les
34
10/11/2020
35
10/11/2020
36
10/11/2020
37
10/11/2020
38
10/11/2020
39
10/11/2020
40
10/11/2020
41
10/11/2020
42
10/11/2020
Pourquoi?
inversement.
43
10/11/2020
44
10/11/2020
public DonneesMeteo(){
observateurs=new ArrayList<Observateur>();
}
45
10/11/2020
46
10/11/2020
47
10/11/2020
AffichageConditions afficheCond=new
AffichageConditions(donneesMeteo);
48
10/11/2020
public DonneesMeteo(){
}
public void actualiserMesures(){
setChanged();
notifyObservers();
}
49
10/11/2020
50
10/11/2020
51
10/11/2020
52
10/11/2020
53
10/11/2020
54
10/11/2020
55
10/11/2020
Pizzeria crée les Pizzas : elles dépend donc de toutes les classes décrivant
les Pizzas, un changement dans l’une d’elle oblige à modifier Pizzeria.
Grâce au pattern Fabrique la classe Pizzeria ne dépend plus que de la classe Pizza.
On peut donc facilement créer/retirer des Pizzas sans modifier Pizzeria.
56
10/11/2020
Problème Pizzeria
Problème de Pizzeria
un seul pizza ne suffit pas
• Mais un seul type de pizza ne suffit pas...
57
10/11/2020
Problème de Pizzeria
Rester en concurrence
Problème de Pizzeria
Encapsuler la création des objets
58
10/11/2020
Problème de Pizzeria
Encapsuler la création des objets - Fabrique
Problème de Pizzeria
Construire une simple fabrique de Pizza
59
10/11/2020
Problème de Pizzeria
Retravailler la classe Pizzeria
Problème de Pizzeria
Fabrique Simple
60
10/11/2020
Problème de Pizzeria
Franchiser les pizzerias
Problème de Pizzeria
Franchiser les pizzerias
61
10/11/2020
Problème de Pizzeria
Mais le contrôle qualité vous semble légèrement
insuffisant...
Problème de Pizzeria
Une structure pour la Pizzeria
62
10/11/2020
Problème de Pizzeria
Une structure pour la Pizzeria
Problème de Pizzeria
Pattern Fabrication – Créateur (facteur)
63
10/11/2020
Problème de Pizzeria
Pattern Fabrication – Classes produits
Problème de Pizzeria
Pattern Fabrication – Définition
64
10/11/2020
Fabrique Abstraite
Anglais: Abstract factory, Kit
Synonyme: -
Catégorie: pattern de construction
Thématique: Fabrication de familles d’objets, Dépendance
à leurs classes concrètes
Définition:
Le pattern Décorateur attache dynamiquement des
responsabilités supplémentaires à un objet. Il fournit une
alternative souple à la dérivation, pour étendre les
fonctionnalités.
65
10/11/2020
Module de
haut niveau
Module de
bas niveau
66
10/11/2020
Couche
d’abstraction
Module de
bas niveau
67
10/11/2020
68
10/11/2020
69
10/11/2020
La fabrique de Brest
est spécialisée dans
la sauce Marinara, le
parmigiano reggiano,
les moules fraîches..
La fonction preparer()
est abstraite et c’est les
sous classes ou nous
allons collecter les
ingrédients nécessaires
pour la pizza à travers la
fabrication d’ingrédients
70
10/11/2020
La méthode preparer()
parcourt les étapes de la
création d’une pizza au
fromage. Chaque fois
besoin d’un ingrédient,
elle demande à la
fabrication
71
10/11/2020
72
10/11/2020
73
10/11/2020
74
10/11/2020
75
10/11/2020
Décorateur (Decorator)
Anglais: Decorator, wrapper
Synonyme: -
Catégorie: pattern de structure
Thématique: Ajout de propriétés sans écrire une sous-
classe
Définition:
Le pattern Décorateur attache dynamiquement des
responsabilités supplémentaires à un objet. Il fournit une
alternative souple à la dérivation, pour étendre les
fonctionnalités.
Diagramme de classe
class Pattern Decorateur
Composant
+ methodeA()
+ methodeB()
+ //autres méthodes()
ComposantConcret Decorateur
+ methodeA() + methodeA()
+ methodeB() + methodeB()
+ //autres méthodes() + //autres méthodes()
DecorateurConcretB
DecorateurConcretA
- ObjetEnveloppe: Composant
- ObjetEnveloppe: Composant
- NewState: Object
+ methodeA()
+ methodeA()
+ methodeB()
+ methodeB()
+ //autres méthodes()
+ //autres méthodes()
76
10/11/2020
2020-2021
class Pattern Decorateur Design Patterns 153
Composant
+ methodeA()
+ methodeB() Chaque décorateur A-UN (enveloppe) un
+ //autres méthodes() composant, ce qui signifie qu’il a une
variable d’instance qui contient une
référence à un composant.
Le ComposantConcret est
l’objet auquel nous allons
ajouter dynamiquement un
ComposantConcret Decorateur
nouveau comportement. Il Les décorateurs implémentent
dérive de Composant. + methodeA() + methodeA() la même interface ou classe
+ methodeB() + methodeB() abstraite que le composant
qu’ils vont décorer.
+ //autres méthodes() + //autres méthodes()
Le patron Décorateur est utilisé par Java pour construire les flux
d’entrée/sortie complexes.
• Par exemple, un java.io.BufferedReader est un décorateur qui décore
(enveloppe) un java.io.FileReader en lui ajoutant la méthode public
String readLine() permettant de lire une ligne de texte. Le FileReader
ne sait à la base lire que caractère par caractère avec public int
read().
77
10/11/2020
Le patron Décorateur est utilisé par Java pour construire les flux
d’entrée/sortie complexes.
• Par exemple, un java.io.BufferedReader est un décorateur qui décore
(enveloppe) un java.io.FileReader en lui ajoutant la méthode public
String readLine() permettant de lire une ligne de texte. Le FileReader
ne sait à la base lire que caractère par caractère avec public int
read().
78