You are on page 1of 84

Patrons de conception

Franois Schwarzentruber
ENS Cachan Antenne de Bretagne

Qu'est ce qu'un patron de conception?

une problmatique:
pouvoir annuler

une faon de
structurer
le programme

Ce cours parle de a:
Proprits fonctionnelles

Correction d'un algorithme


Complexit temps/espace
Vivacit

Proprits non
fonctionnelles

Facile comprendre

Facile partager

Facile tendre

Sagesse des anciens: ne pas rinventer la roue

Nombres entiers

Prouveur

Matrices

Jeu

Rubik's cube...

Logiciel de dessin
Mme problmatiques
de gnie logiciel

Mme concepts

Thorie des groupes

Patrons de conception

(variste Galois)

Faade

Sous-groupes

Visiteur

Ordre d'un lment

Sagesse des anciens: du vocabulaire!

Comme l'extension
est galoisienne...

La crme anglaise
sera parfaite avec
le gteau.

A notre problme,
appliquons le
patron Visiteur!

Plan (un cours catalogue de bonnes recettes de


cuisine)

Patrons de cration

Patrons de structure

Patrons de comportement

Patrons de cration

Patron Fabrique abstraite

Patron Prototype

VOUS crez une application pour apprendre


l'algorithmique

Besoin: adapter le logiciel pour diffrentes plate-formes

Windows
Linux
MacOS
Android

Besoin: adapter le logiciel pour diffrents publics

enfants

lycens

Constat: on a cr des objets un peu partout !

new

new
new
new
new

Solution non maintenable

b = new BriqueEffacerTout();

if(pourlesEnfants)
{
b = new briqueEffacerToutPourEnfant();
}
else
{
b = new briqueEffacerToutPourLyceen();
}

Patron de conception: fabrique abstraite

On va devoir adapter
notre
logiciel d'algorithmique
deux publics.
Comment faire?

On applique
le patron de
conception
fabrique abstraite .

Solution: isoler la cration des objets dans des


fabriques abstraites

stp, fabrique moi


une brique
EffacerTout

Solution: isoler la cration des objets dans des


fabriques abstraites

stp, fabrique moi


une brique
EffacerTout

t
effacer tou

Fabrique
de briques
pour les enfants

Solution: isoler la cration des objets dans des


fabriques abstraites

stp, fabrique moi


une brique
EffacerTout

effacer tout

Fabrique
de briques
pour les lycens

Bonne solution

b = new BriqueEffacerTout();

FabriqueAbstraite
fabriqueBriques
= new FabriqueEnfant()

fabriqueBriques.getNouvelleBriqueEffacerTout()

Patron de conception: fabrique abstraite

Patron de conception: fabrique abstraite

Diagramme de squence de la fabrique abstraite

Source: cours de Nol Plouzeau

Conclusion sur la fabrique abstraite

+ Ajouter une nouvelle plate-forme


+ Assurer la cohrence du logiciel (deux plate-formes ne
sont pas mlanges)
+ Cloisonne les besoins du client et les soucis dus aux
plate-formes
- Rajout d'un nouveau composant (brique, bouton...) difficile

Crer des objets selon un modle: le patron prototype

Source: logiciel Dia

Besoins

Crer selon des modles

Enrichir la liste des modles

A ne pas faire: une cration diffrente au sein de chaque


bouton...

new Maison(Color.RED,
Color.WHITE, 16, 32, 16)

new Arbre(Color.GREEN,
Color.BROWN, 8, 32, 8)

A faire

Chaque bouton contient


un prototype cloner.

Diagramme de classe de Prototype

Source: wikipedia

Conclusion sur le patron Prototype

+ Copier un objet sans se soucier de sa classe exacte

+ Ajouter dynamiquement des objets une palette

- le mcanisme de clonage crer

Patrons de structure

Adapter une interface (~ adaptateur)

Rendre un programme lisible(interface simplifie ~ faade)

Structures rcursives (~ composite)

Utilisation de la dlgation (~ dcoration)

Patron de conception Adaptateur

12
10
8

Column 1
Column 2
Column 3

6
4
2
0
Row 1

ObjetGraphique
getBounds(): Rect
(interface utilise par mon logiciel)

Row 2

Row 3

Row 4

OpenOfficeGraphics
width
height

Patron de conception Adaptateur

source: Wikipedia

Patron faade : un besoin simple, une interface


simple
Mon besoin:

(+ (* 2 3) 5)

Interprteur
Scheme

11

Patron faade: un besoin simple, une interface


simple
Et j'ai ma disposition kawa, une bibliothque JAVA pour
parser/compiler/interprter du code Scheme et
crer/enregistrer/restaurer des environnements:

Patron faade

Source: Patterns in Java, Volume 1: A Catalog of Reusable Design Patterns Illustrated with UML, Second Edition by Mark Grand

Diffrence entre le patron Faade et Adaptateur


Faade

But: crer une interface


simplifie une
bibliothque complexe
utiliser

Adaptateur

But: offrir une interface


conforme et adapter une
classe

Patron Composite
Objets rcursifs:

Arborescence de fichiers

Expressions

Structure d'un document

Commande (on verra plus tard)

Etc.

Patron Composite

Source: wikibooks

Patron Dcoration
Une fentre peut :

Avoir / ne pas avoir une bordure

Avoir / ne pas avoir des barres de dfilement

Avoir / ne pas avoir un fond

Avoir / ne pas avoir une gestion de zoom

Avoir / ne pas avoir d'effet lors du dplacement

Avec l'hritage
on aurait 2n
classes
diffrentes!

Patron Dcoration utilise la dlgation

(interface
d'une fentre)

Avec la
dlgation on a
O(n) classes.

(dcorateur abstrait)

(fentre)

(dcorateur concret
comme fentre avec
un fond)

Conclusion sur le patron Dcorateur

+ Meilleure maintenance que des if

+ Moins de classes qu'avec l'hritage

+ Modifier dynamiquement les dcorations

- Comportement inattendu...
new FenetreBordure(new FenetreFond(f))
~ new FenetreFond(new FenetreBordure(f))?

Patrons de comportement

Interface graphique (rafrachissement, souris, clavier...)

Conversion de donnes

Pouvoir annuler des commandes

Implmenter plusieurs algorithmes

Rafrachissement de l'interface graphique:


le patron observateur

Source: interface de Windows 7

Rafrachissement de l'interface graphique

Source: OpenOffice.org Impress

Patron de conception: observateur

On veut assurer la cohrence


de l'interface graphique.
Comment faire?

On applique
le patron de
conception
observateur .

Fonctionnement du patron observateur: les deux


zones de l'cran observent les donnes.

Donnes

Ces deux
zones de
l'cran
(observateurs)
coutent les
donnes
(sujets).

Diagramme de classe du modle Observateur

Autre application de Observateur: gestion des


entres/sorties

objet qui coute et


effectue une action

Autre application de Observateur: gestion des


vnements souris en JAVA

Un objet qui ragit au clic


Un bouton par exemple

Modle-vue-contrleur
utilisateur

contrleur

vue

modle

Autre application de Observateur: conversions de


donnes d'un format vers un autre

Fichier
.tex

LaTEX vers HTML

Fichier
.html

Autre application de Observateur: conversions de


donnes d'un format vers un autre

Fichier
.tex

LaTEX vers HTML

Fichier
.html

Fichier
.html

HTML vers LaTEX

Fichier
.tex

Fichier
.tex

LaTEX vers
OpenOffice.Writer

Fichier
.odt

Autre application de Observateur: conversions de


donnes d'un format vers un autre

Fichier
.tex
Fichier
.html
Fichier
.tex

Emetteur
LaTEX
Emetteur
HTML
Emetteur
OpenOffice.Writer

Nouveau
paragraphe
Nouvelle
page

Autre application de Observateur: conversions de


donnes d'un format vers un autre

Nouveau
paragraphe
Nouvelle
page

Gnrateur
LaTEX

Fichier
.tex

Gnrateur
HTML

Fichier
.html

Gnrateur
OpenOffice.Writer

Fichier
.odt

Autre application de Observateur: conversion de


donnes d'un format vers un autre

Fichier
.tex

Emetteur
LaTEX

u
ea he
uv
No grap
ra
pa

Gnrateur
HTML

Fichier
.html

Patron de conception Commande


On va devoir mettre
une fonction
annuler
dans le logiciel.
Comment faire?

On applique
le patron de
conception
Commande.

Si on suit le principe une action = une opration

Problmes

annuler des commandes?

enregistrer des macros?

la classe Dessin grossit si on rajoute des oprations

Solution: patron de conception commande


Une commande = un objet

Patron de conception Commande


Diagramme de classe

Patron de conception Commande


Diagramme de classe

Patron de conception Commande


Diagramme de classe
le reste du programme

il stocke les commandes


il appelle les commandes

interface gnrique

commande copier

dessin

Patron de conception Commande


Diagramme de squence

Memento

classe des objets sauvegarder

Classe de l'objet qui gre les sauvegardes

classe des objets


qui reprsente
une sauvegarde

Memento: sauvegarde

Memento: Restauration

Oprations sur des structures rcursives

DocumentElement
getTableOfContents()
getSizeInBytes()
getNumberOfSection()
getNumberOfFigure()
checkSpelling()
checkGrammar()
...

Problme: les classes


deviennent normes.

Solution: le patron de conception Visiteur

Solution: le patron de conception Visiteur

public void visit(Visitor visitor)


{
visitor.visitParagraph(this);
}

Avantage du patron Visiteur

Dcoupe des tches

Classes petites

Dpend des donnes

Les classes des donnes doivent montrer leurs contenus

Visitor

Diagramme d'objets

Exemple d'autres applications du patron Visiteur sur


des structures rcursives

Logiciel de composition musicale:


nombre de notes, parcourir la partition pour afficher, etc.
Assistant de preuve:
parcourir une preuve pour l'afficher, vrifier la preuve, etc.
Logiciel 3D
affichage squelette, affichage avec texture, calcul du poids
etc.

Implmenter plusieurs algorithmes: patron de conception


Stratgie

Exemple 1: s'abstraire d'un algorithme qui manipule le


squelette d'un personnage

heros.move()

Source: Little Big Adventure 2

Exemple 2: s'abstraire d'un algorithme de tri

tableau.sort()
BubbleSort?
QuickSort?
HeapSort?

Exemple 3: s'abstraire d'un algorithme de positionnement


d'lment graphique l'cran

container.doLayout()

Source: http://download.oracle.com/javase/tutorial/uiswing/layout/visual.html

Stratgie

Exemple

Patron de conception tat

Patron de conception tat

Patron de conception tat


public class Dessin {
private EtatDessin monEtat;
public Dessin() {
setEtat(new EtatCrayon());
}

:
public void setEtat(EtatDessin nouvelEtat) {
this.monEtat = nouvelEtat;
}
public void mouseUp() {
this.monEtat.mouseUp();
}

class EtatPipette implements EtatDessin {


:
public void mouseUp()
{

:
dessin.setEtat(new EtatCrayon());
}
}

Bref c'est un automate... d'ailleurs UML prvoit une


syntaxe pour a: les state machine

Conclusion

Privilgier la structure entre les classes au lieu de testif

Maintenance

Proprits fonctionnelles!!

Refactoring: possibilit de modifier la structure du code


la vole