Vous êtes sur la page 1sur 7

30/08/2020

Introduction
 Les design patterns ont été proposés par
Erich Gamma, Richard Helm, Ralph
LES PATRONS DE CONCEPTION Johnsson et John Vlissides en 1995
 Le but est de proposer un catalogue de
(DESIGN PATTERNS) modèles ( = pattern = patrons) pour
apporter des solutions à des problèmes de
conception ( = design = conception)
orientées objet
Ludovic Liétard
 Termes équivalents : design pattern, patron
de conception, modèle de conception

Introduction Introduction
 « Chaque patron décrit un problème  Un patron de conception est défini par :
récurrent dans notre environnement, puis le
cœur de la solution qui sera réutilisable Nom : chaque pattern à un nom qui l’identifie de
indéfiniment quelle que soit la mise en manière unique
pratique choisie »
Problème : le problème qu’il s’efforce de résoudre
 un ensemble de patrons est disponible
Solution : la solution apportée
 chaque patron identifie un problème et
apporte une solution prédéfinie Conséquences : les effets résultants de la mise en
oeuvre

1
30/08/2020

Introduction Interêt des patrons de conception


(sur un exemple)
Un Rôle :  Considérons l’application suivante :
Abstract class Canard
Créateur : pour créer des objets
MI
void cancaner(){….}
Structurel : pour s’occuper de la composition des void nager() {….}
classes et des objets abstract void afficher();

Comportemental : pour répartir l’interaction des


classes et des objets, se répartir les Colvert Mandarin CanardEnPlastique
responsabilités void afficher(){….} void afficher(){….}
void afficher (){…}
void cancaner(){
couiner}

Interêt des patrons de conception Interêt des patrons de conception


(sur un exemple) (sur un exemple)
 Tous les canards cancanent, nagent et sont  On désire maintenant que les canards volent
affichables
 Si l’on rajoute dans la classe Canard (ce qui
 Trois espèces de canards : paraît être une bonne idée), il y a un problème
 Colvert
car les canards en plastique ne volent pas !!
 Mandarin
 CanardEnPlastique : cancaner() existe mais à été
redéfini pour couiner (un canard en plastique  On peut alors redéfinir voler() pour les canards
couine). en plastique pour ne rien faire.

2
30/08/2020

Interêt des patrons de conception Interêt des patrons de conception


(sur un exemple) (sur un exemple)
 Considérons l’application suivante :  Si l’on désire rajouter les leurres (faux
canards) qui ne cancanent pas, ne volent pas
Abstract class Canard et ne nagent pas il faut également redéfinir
MI ces trois méthodes
void cancaner(){….}
void nager() {….} Leurre
void voler(){….} void afficher (){…}
abstract void afficher(); void cancaner(){}
void voler(){}
CanardEnPlastique void nager(){}
Colvert Mandarin void afficher (){…}
void cancaner(){  Des méthodes qui ne servent à rien et que l’on
void afficher(){….} void afficher(){….} ne peut réutiliser (voler() pour les leurres et les
couine}
void voler(){} canards en plastique)

Interêt des patrons de conception Interêt des patrons de conception


(sur un exemple) (sur un exemple)
Abstract class Canard
Cancaneur Volant MI
 On peut penser à utiliser des interfaces, de void cancaner() void voler() void nager() {….}
manière à ne définir les méthodes que pour les abstract void afficher();
classes les utilisant
Mandarin
 une interface pour les volant CanardEnPlastique Colvert void afficher(){….}
 une interface pour les cancanant void afficher (){…} void afficher(){….} void voler(){…}
void cancaner(){ void voler(){…} void cancaner(){…}
couine} void cancaner(){…}
 Se pose alors le problème de la réutilisation Leurre

void afficher(){…}

3
30/08/2020

Interêt des patrons de conception Interêt des patrons de conception


(sur un exemple) (sur un exemple)
 Utilisons le principe suivant :
 Mais cela détruit complètement la possibilité de
 Extraire les parties variables et les encapsuler
réutiliser le code pour les comportement voler() pour les modifier plus tard (ou les augmenter)
et cancaner() qui sont communs aux colverts et sans affecter celles qui ne varient pas
aux mandarins
 Ce concept constitue la base de presque tous
 Nous faisons face à un problème de les designs patterns. Tous les patterns
maintenance… car la conception n’était pas fournissent un moyen de permettre à une partie
bonne du système de varier indépendamment de
toutes les autres

Interêt des patrons de conception Interêt des patrons de conception


(sur un exemple) (sur un exemple)
 Qu’est ce qui varie ?  Il faut donc concevoir des classes pour
 Les comportements voler() et cancaner() implémenter ces comportement

 Voler()  Désormais, les comportements de Canard


 voleravec des ailes résideront dans une classe distincte – une
 ne pas voler du tout classe qui implémente une interface
comportementale particulière.
 Cancaner()
 faire un cancanement  Ainsi, les classes Canard n’auront besoin de
 couiner connaître aucun détail de l’implémentation de
 ne rien faire leur propre comportement

4
30/08/2020

Interêt des patrons de conception Interêt des patrons de conception


(sur un exemple) (sur un exemple)
 Nous pouvons créer deux interfaces. ComportementVol ComportementCancan ComportementVol
et ComportementCancan, ainsi que les classes void cancaner() void voler()
correspondantes qui implémentent chaque
comportement concret
NePasVoler
CanardMuet void voler(){}
 Avec cette modélisation : void cancaner(){}
VolerAvecDesAiles
 La réutilisation est possible. Les autres objets
peuvent réutiliser ces comportements Cancan void voler(){…}
 Il est possible d’ajouter de nouveaux comportements void cancaner(){…}

Coincoin
void cancaner(){couiner}

Interêt des patrons de conception Interêt des patrons de conception


(sur un exemple) 
(sur un exemple)
Cela donne :
 Cela donne :
interface ComportementCancan {
interface ComportementVol { void cancaner() ;
void voler() ; }
}
class Cancan implements ComportementCancan{
class VolerAvecDesAiles implements ComportementVol{ void cancaner() {System.out.println(" Je cancane ");}
void voler() {System.out.println(" Je vole avec des ailes ");} }
}
class CancanMuet implements ComportementCancan{
void cancaner() {System.out.println(" silence ");}
class NePasVoler implements ComportementVol{ }
void voler() {System.out.println(" Je ne peut pas ");} class Coincoin implements ComportementCancan{
} void cancaner() {System.out.println(" coincoin ");}
}

5
30/08/2020

Interêt des patrons de conception Interêt des patrons de conception


(sur un exemple) (sur un exemple)
abstract class Canard {
 La clé est qu’un canard va maintenant déléguer
ComportementVol monVol;
ses comportements au lieu d’utiliser les méthodes ComportementCancan monCancan;
voler() et cancaner()
public abstract void afficher();
 deux variables d’instances sont rajoutées à la
public void effectuerVol(){
classe canard (instance respective de monVol.voler();
comportementVol et comportementCancan) }
 elles contiennent le bon comportement du public void effectuerCancan(){
canard (elles sont instanciées à la création du monCancan.cancaner();
}
canard)
public void nager(){
 les méthodes effectuerCancan() et System.out.println("je nage");
effectuerVol() utilisent ces deux VI } }

Interêt des patrons de conception Interêt des patrons de conception


(sur un exemple) (sur un exemple)
class Colvert extends Canard { class Colvert extends Canard {
public Colvert(){ public Colvert(){
monCancan = new Cancan(); ComportementCancan = new Cancan();
monVol = new VolerAvecDesAiles(); ComportementVol = new VolerAvecDesAiles();
} }
public void afficher(){ public void afficher(){
System.out.println("Je suis un Colvert"); System.out.println("Je suis un Colvert");
} }
} }

6
30/08/2020

Interêt des patrons de conception


(sur un exemple)
 Il est également possible de modifier
dynamiquement le comportement d’un canard (il
suffit de modifier ses VI).

 Conclusion : La relation « possède un » peut être


préférable à « est un ».

 Nous venons de mettre en œuvre le pattern


Stratégie

Vous aimerez peut-être aussi