Vous êtes sur la page 1sur 195

DESIGN PATTERNS

Par

Pr . Jaouad Boutahar

Design Patterns
par M. Boutahar 2010

Modlisation dobjets
Encapsuler des donnes sans en empcher laccs
Trouver le bon niveau de granularit des objets
Limiter les dpendances entre objets
Concevoir des objets :
polyvalents, flexibles,
Rutilisables, Simple dutilisation
Implmentation performante
...
Design Patterns
par M. Boutahar 2010

Modlisation dapplications

Processus complexe
Exeprtise (acquise au fil des expriences).
Problmes de conceptions rcurrents

Design Patterns
par M. Boutahar 2010

Pr-requis

Maitrise de langage de Modlisation Objet: UML


Maitrise dun langage OO: Java

Design Patterns
par M. Boutahar 2010

Exercice

Une pizzeria a un site web pour commander


des pizzas partir d'un menu.
Donner un modle et une implmentation en
Java pour ce site de pizzeria.

Design Patterns
par M. Boutahar 2010

Exemple de Problmatique
Public class Pizzeria{
public Pizza commanderPizza(){
Pizza pizza=new Pizza();

pizza.preparer(),
pizza.cuire();
pizza.couper();
pizza.emballer();
return pizza;
}
}
Design Patterns
par M. Boutahar 2010

Exemple de problmatique
Public class Pizza{
String nom, sauce, pate;
ArrayList ingredients=new ArrayList();
void preparer(){
SOP('' preparation de la pizza''+nom); SOP(''preparer la pate ....'');
SOP('' rajouter la sauce.... '');
SOP('' rajouter les ingredients:'');
for (int i=0;i<ingredients.size();i++) SOP( '' ''+ingredients.get(i)); }
void cuire(){ SOP('' cuisson pdt 10 minute 250'');}
void couper(){SOP('' couper la pizza en 8 portions'');}
void emballer(){SOP ('' La pizza est mise dans une boite speciale Pizza'');

...}

Design Patterns
par M. Boutahar 2010

Exemple de Problmatique
Public class Pizzeria{
public Pizza commanderPizza(){
Pizza pizza=new Pizza();
pizza.preparer(),
pizza.cuire();
pizza.couper();
pizza.emballer();
return pizza;
}
}
Design Patterns
par M. Boutahar 2010

Exemple de Problmatique
//Client
Public class TestPizzeria{
Public static void main(String[] args){
Pizzeria bonnePizza=new Pizzeria();
Pizza pizza=bonnePizza.commanderPizza();
}
}

Design Patterns
par M. Boutahar 2010

Exemple de Problmatique
//Client
Public class TestPizzeria{
Public static void main(String[] args){
Pizzeria bonnePizza=new Pizzeria();
Pizza pizza=bonnePizza.commanderPizza();
}
}
De quel type de pizza s'agit t-il?
La class Pizza serait bien abstraite
ou une interface
Design Patterns
par M. Boutahar 2010

10

Exemple de Problmatique
Public class Pizzeria{
public Pizza commanderPizza(){
Pizza pizza=new Pizza();
pizza.preparer(),
pizza.cuire();
pizza.couper();
pizza.emballer();
return pizza;
}
}

De quel type de pizza s'agit t-il?


La class Pizza serait bien abstraite
ou une interface

Design Patterns
par M. Boutahar 2010

11

Cas Basique
Pizza

Pizzeria
commanderPizza()

PizzaVH

PizzaVegetarienne

PizzaPoulet
Pizza4Fromaget

Design Patterns
par M. Boutahar 2010

12

Exemple de problmatique
Public abstract class Pizza{
String nom, sauce, pate;
ArrayList ingredients=new ArrayList();
void prepare(){
SOP('' preparation de la pizza''+nom);
SOP(''preparer la pate ....'');
SOP('' rajouter la sauce.... '');
SOP('' rajouter les ingredients:'');
for (int i=0;i<ingredients.size();i++) SOP( '' ''+ingredients.get(i)); }
Abstract void cuire(); // Abstract method
void couper(){SOP('' couper la pizza en 8 portions'');}
void emballer(){SOP ('' La pizza est mise dans une boite speciale
Pizza'');
...}
Design Patterns
par M. Boutahar 2010

13

Exemple de problmatique
Public class PizzaPecheur extends Pizza{
public PizzaPecheur() { nom= '' Pizza Pecheur'';
sauce='' sauce '';
pate=''pate fine'';
ingredients.add('' Crevettes calamars saumon ...'' ); }
void cuire(){ SOP('' cuisson pdt 10 minutes 250'');} }
Public class Pizza4Fromages extends Pizza {....
void cuire(){ SOP('' cuisson pdt 15 minutes 350'');} }
Public class PizzaPoulet extends Pizza{.....
void cuire(){ SOP('' cuisson pdt 20 minutes 200'');}}
Public class PizzaVegetarienne extends Pizza{....
void cuire(){ SOP('' cuisson pdt 13 minutes 300'');} }

Public class PizzaVH extends Pizza { }


Design Patterns
par M. Boutahar 2010

14

Exemple de Problmatique
Public class Pizzeria{
public Pizza commanderPizza(String type){
Pizza pizza;
if(type.equals(''4 Fromages '')
elseif(type.equals(''Pecheur'')
elseif(type.equals(''Poulet '')

pizza=new Pizza4Fromages();
pizza=new PizzaPecheur();
pizza= new PizzaPoulet();

pizza.preparer(); pizza.cuire(); pizza.couper(); pizza.emballer(); return


pizza;
}
}
Design Patterns
par M. Boutahar 2010

15

Exemple de problmatique
Public class PizzeriaTest{
public static void main(String[ ] args) {
Pizzeria bonnePizza=new Pizzeria();
Pizza pizza=bonnePizza.commanderPizza(Pecheur'');
SOP( Ali a commander une pizza de type:''+pizza.getName();}
Pizza pizza=bonnePizza.commanderPizza(Poulet'');
SOP( Ali a commander une pizza de type:''+pizza.getName();

}}
Design Patterns
par M. Boutahar 2010

16

Exercice: Modification de menu


Rcemment, la pizzeria a recrut un nouveau
chef qui propose des modifications sur le menu
en rajoutant d'autres types de pizza. Il est
possible qu'on va proposer ses clients de
nouvelles pizzas.
Comment crire un systme pour faire face un
tel changement.
Donner un modle pour ce site de pizzeria.

Design Patterns
par M. Boutahar 2010

17

Modification de menus
Public class Pizzeria{
public Pizza commanderPizza(String type){
Pizza pizza;
if(type.equals(''4 Fromages '')
pizza=new Pizza4Fromages();
elseif(type.equals(''Pecheur'')
pizza=new PizzaPecheur();
elseif(type.equals(''Poulet '')
pizza= new PizzaPoulet();
// New Pizzas
elseif(type.equals(''Vegetarienne'') pizza=new PizzaVegetarienne();
elseif(type.equals(''Viande Hache'') pizza= new PizzaVH();
pizza.preparer(); pizza.cuire(); pizza.couper(); pizza.emballer(); return
pizza;
}}
Design Patterns
par M. Boutahar 2010

18

Modification de menus
Public class Pizzeria{
public Pizza commanderPizza(String type){
Pizza pizza;

Partie qui volue!

if(type.equals(''4 Fromages '')


pizza=new Pizza4Fromages();
elseif(type.equals(''Pecheur'')
pizza=new PizzaPecheur();
elseif(type.equals(''Vegetarienne'') pizza=new PizzaVegetarienne();
elseif(type.equals(''Poulet '')
pizza= new PizzaPoulet();
elseif(type.equals(''Viande Hache'') pizza= new PizzaVH();
pizza.preparer();
pizza.cuire(); pizza.couper();
pizza.emballer(); return pizza;
}
}

Partie reste probablement


inchange!
Design Patterns
par M. Boutahar 2010

19

Cas Basique
Pizza

Pizzeria

commanderPizza(String)

PizzaVH

PizzaVegetarienne

PizzaPoulet
Pizza4Fromaget

Design Patterns
par M. Boutahar 2010

20

A chaque modification du chef du pizzeria faut modifier la classe


Pizzeria!
===> Inconvenient!

Comment apporter des modifications au menu sans modifier la Pizzeria?

Design Patterns
par M. Boutahar 2010

21

C'est un problme dja pos !

Design Patterns
par M. Boutahar 2010

22

Elment de solution

On sait ce qui varie et ce qui ne change pas


on peut :

==> Encapsuler la cration de l'objet pizza!

Design Patterns
par M. Boutahar 2010

23

Comment encapsuler la cration d'un objet?


Public class Pizzeria{
public Pizza commanderPizza(String type){
Pizza pizza;

pizza.preparer();
pizza.cuire(); pizza.couper();
pizza.emballer(); return pizza;
}
}

if(type.equals(''4 Fromages '')


pizza=new Pizza4Fromages();
elseif(type.equals(''Vegetarienne'')
pizza=new PizzaVegetarienne();
elseif(type.equals(''Poulet '')
pizza= new PizzaPoulet();
elseif(type.equals(''Viande Hache'')
pizza= new PizzaVH();

Mettre le code de cration de l'objet en dehors de la


mthode CommanderPizza et le placer dans un objet
qui s'occupera uniquement de la cration
d'un objet Pizza
Design Patterns
par M. Boutahar 2010

24

Modle de solution !

Design Patterns
par M. Boutahar 2010

25

Principe et Dfinition
Si un problme se produit et s'est produit plusieurs fois!
==> Une solution ce problme a dj t utilise
efficacement.
Cette solution est dcrite comme:
un modle.
Un Design Pattern

Design Patterns
par M. Boutahar 2010

26

Objectif

Comprendre ce qu'est un pattern


Connatre les principaux reprsentants
Exemples d'utilisation
Des ressources pour aller plus loin
Apporter des ides conceptuelles
Communiquer entre dveloppeurs de manire
efficace.
Design Patterns
par M. Boutahar 2010

27

Principe et Dfinition
DPs sont des modles de conception dits aussi:
Motifs de conception
ou
Patrons de conception
Dps sont des solutions des problmes classiques.

Design Patterns
par M. Boutahar 2010

28

Principe et Dfinition
Un pattern de conception (design pattern) est un modle
qui utilise des classes et leurs mthodes dans un langage
orient objet.

Design Patterns
par M. Boutahar 2010

29

Principe et Dfinition
Les design patterns: stratgies pour rsoudre des
problmes communs de conception oriente objet.
Les design patterns:stratgies indpendantes des
langages de programmation

Quand on fait un modle de conception, on doit


connatre les noms de certaines des solutions
communes.

Design Patterns
par M. Boutahar 2010

30

Design Patterns
Les Design patterns sont dja utiliss dans
d'autres domaines:

Architecture
Musique
Graphisme
Communication
GC
....
Design Patterns
par M. Boutahar 2010

31

Pourquoi utiliser les DP?

Ne pas rinventer la roue.


Faciliter la communication entre dveloppeurs.
Rsoudre un problme

Design Patterns
par M. Boutahar 2010

32

Dois-je utiliser les Design Patterns?


Un dveloppeur Java professionnel, doit connatre au moins
quelques solutions populaires de problmes de codage
Ces solutions ont t prouvs efficaces par les dveloppeurs
expriments.
Ces solutions sont dcrites comme le design patterns

Design Patterns
par M. Boutahar 2010

33

Dois-je utiliser les Design Patterns?


Quand on rsoud un problme de codage, on a utilis un
modle de conception.
On n'a pas su/pu utiliser un nom populaire pour le dcrire

Design Patterns
par M. Boutahar 2010

34

Dois-je utiliser les Design Patterns?


Apprendre comment les dveloppeurs expriments rsolvent
les problmes de codage et d'essayer de les utiliser : meilleure
faon de gagner de l'exprience et de la certification.
Les modles de conception changent la faon dont on concoit un
code,
On sera/semblera plus intelligent

Design Patterns
par M. Boutahar 2010

35

Un Design Pattern

Ni un algorithme
Ni un programme
Ni un composant
Ni une mthode
Ni une plateforme

Design Patterns
par M. Boutahar 2010

36

Nombreux Designs patterns


Nombreux!
Sur Internet on trouve au moins 250 modles existants qui
sont utiliss dans le monde OO, y compris les spaghetti
qui se rfre de mauvaises habitudes de codage.
Selon GOF ( Gang Of Four) : Rfrence en DPs
23 patrons de conception

Design Patterns
par M. Boutahar 2010

37

Relation entre diffrents modles?


Gnralement, pour construire un systme,
vous devrez peut-tre utiliser de nombreux
modles.
Diffrents concepteur utilisent diffrents
modles pour rsoudre le mme problme.

Design Patterns
par M. Boutahar 2010

38

Relation entre diffrents modles?

Certains modles naturellement s'embotent


Un modle peut en cacher un autre
Certains modles sont similaires et parallles
Un Pattern donne un indice pour rsoudre un
problme de manire efficace

Design Patterns
par M. Boutahar 2010

39

Prsentation dun Design Pattern


Nom
Problme:
Expos du problme
Contexte de mise en uvre, contraintes limitantes

Solution:
Description de la solution propose
Conseils dimplmentation
Exemple dimplmentation
Confrontation avec dautres Design Patterns

Consquences
description des rsultats de l application du pattern sur le
systme (+/-)
Design Patterns
par M. Boutahar 2010

40

Diffrents Patterns
Selon GoF
Les Patterns de cration (5)
Les Patterns de Structure (7)
Les Patterns Comportementaux (11)

Design Patterns
par M. Boutahar 2010

41

Design Pattern du GoF

Design Patterns
par M. Boutahar 2010

42

Pattern de Construction

Design Patterns
par M. Boutahar 2010

43

Pattern de Construction
Les patterns de construction permettent un client de construire
un nouvel objet par lintermdiaire de moyens autres que lappel
dun constructeur de classe.
Rendre le systme indpendant de la manire dont les objets
sont crs, composs et reprsents:
Encapsulation de la connaissance des classes concrtes
utiliser
Cacher la manire dont les instances sont cres et combines

Design Patterns
par M. Boutahar 2010

44

Pattern de Construction
Problmatique : Obtenir facilement un objet prt
l'emploi et qui correspond nos besoins.

Solution : Une classe / Une mthode qui


encapsule la logique de cration des objets en
question.

Design Patterns
par M. Boutahar 2010

45

Pattern de Construction

Factory Method,
AbstractFactory,
Builder,
Prototype,
Singleton

Design Patterns
par M. Boutahar 2010

46

Factory Method

Design Patterns
par M. Boutahar 2010

47

Factory Method
Problme
ce motif est utiliser dans les situations o existe le besoin de
standardiser le modle architectural pour un ensemble
dutilisations, tout en permettant utilisations individuelles de
dfinir elles-mmes leurs propres objets crer

Consquences
+ Elimination du besoin de code spcifique lapplication dans
le code du framework (uniquement linterface du Product)
Multiplication du nombre de classes

Design Patterns
par M. Boutahar 2010

48

Factory Method
Lorsque vous dveloppez une classe, vous fournissez gnralement
des constructeurs pour permettre aux clients de linstancier.
Cependant, un client qui a besoin dun objet ne sait pas, ou ne
devrait pas savoir,
quelle classe instancier parmi plusieurs choix possibles.

FACTORY METHOD permet de laisser un autre dveloppeur


dnir linterface permettant de crer un objet, tout en gardant un
contrle sur le choix de la classe instancier.

Design Patterns
par M. Boutahar 2010

49

Factory Mthode
Une classe abstraite ou une interface
Permet une sous-classe ou une classe
d'implmentation de dcider quelle classe ou
mthode doit tre instancie ou appele partir
des paramtres donns.

Design Patterns
par M. Boutahar 2010

50

Factory Method
Product : dfinit linterface
dobjet que factory method
cre.

ConcreteProduct :
Implmente linterface Product

FactoryIF:declare
La factory method qui
retourne lobjet de type
Product

Factory :redefinit la
factory method pour retourner
une instance de ConcreteProduct
Design Patterns
par M. Boutahar 2010

51

Cas Basique
Pizza

Pizzeria
commanderPizza()

PizzaVH

PizzaVegetarienne

PizzaPoulet
Pizza4Fromaget

Design Patterns
par M. Boutahar 2010

52

Exemple de Factory Method


Pizza

SimplePizzaFactory

Pizzeria
commanderPizza(String)

creerPizza()

PizzaVH
PizzaVegetarienne

PizzaFactory{interface}

creerPizza()
PizzaPoulet
Pizza4Fromaget
Design Patterns
par M. Boutahar 2010

53

Factory Method
Le pattern FACTORY METHOD dcharge le
client du souci de savoir quelle classe instancier.
garder un contrle sur le choix de la classe
instancier.
Le pattern FACTORY METHOD permet
lutilisation dune mthode qui utilise un facteur
externe pour dterminer la classe instancier.
Design Patterns
par M. Boutahar 2010

54

Utilisation et avantages
Connecter une hirarchie de classe parallle.
Classe veut que ses sous-classes spcifient l'objet.
Classe ne pouvant pas anticiper ses sous-classes et qui
doit tre cr.
Famille d'objets ncessitant d'tre spare en utilisant une
interface commune.
Code doit utiliser des interfaces et non des classes
concrtes.
Protger (Cacher) les classes concrtes de l'utilisateur .

Design Patterns
par M. Boutahar 2010

55

Factory Method:iterator()
La version 1.2 du JDK a introduit une interface Collection qui inclut
une mthode iterator() ; toutes les collections limplmentent.
Une mthode iterator() cre un objet qui retourne une squence forme
des lments dune collection.
Cette opration vite que le client sache quelle classe instancier.
Factory Method

Design Patterns
par M. Boutahar 2010

56

Abstract Factory

Design Patterns
par M. Boutahar 2010

57

Abstract Factory
Problme
ce motif est utilis dans les situations o existe le besoin de
travailler avec des familles de produits (Objets) tout en tant
indpendant du type de ces produits
doit tre configur par une ou plusieurs familles de produits
Consquences
+ Sparation des classes concrtes, des classes clients
les noms des classes produits napparaissent pas dans le code client

Facilite lchange de familles de produits


Favorise la cohrence entre les produits
+ Le processus de cration est clairement isol dans une classe
la mise en place de nouveaux produits dans lAbstractFactory nest pas

aise
Exemple: java.awt.Toolkit Design Patterns
par M. Boutahar 2010

58

Abstract Factory
Lutilisateur est indpendant de la manire avec laquelle les
objets sont cres.
Lapplication a besoin dune configuration dune des
multiples familles dobjets
Cacher limplementation des Objets (Cas Api)
Exemple:
GUI
Systme de Fichiers

Design Patterns
par M. Boutahar 2010

59

Abstract Factory

Design Patterns
par M. Boutahar 2010

60

Abstract Factory

AbstractFactory: declare une interface pour les


operations qui crent des objets d abstract product objects

ConcreteFactory implemente les operations de


creation dobjets de type product

AbstractProduct declares une interface pour le type


d'objets product

Product XX definis l'objet product qui sera cre par le


factory correspondant en implementant l'interface
AbstractProduct

Client utilise les interfaces declares par les classes:


AbstractFactory et AbstractProduct classes
Design Patterns
par M. Boutahar 2010

61

Abstract Factory:Exemple
Window

Cient

WindowFact
getWin()

repaint()

Window7
repaint()

LinuxWin
repaint()

MacWin

repaint()

MacWinFact

getWin()

Window7Fact

getWin()

Design Patterns
par M. Boutahar 2010

LinuxWinFact

getWin()

62

Exemple de Factory Method:


Cas pizzeria

Pizza

SimplePizzaFactory

Pizzeria
commanderPizza()

creerPizza()

PizzaVH
PizzaVegetarienne

PizzaFactory{interface}

creerPizza()
PizzaPoulet
Pizza4Fromaget

Design Patterns
par M. Boutahar 2010

63

Exercice

la pizzeria veut proposer ses clients des


pizzas selon deux styles:
Style casa
Style Rabat
Car une pizza poulet (par exemple) se prpare
de manire difffrente selon les deux styles!
Comment crire un systme pour faire face un
tel changement.
Donner un modle pour ce site de pizzeria.
Design Patterns
par M. Boutahar 2010

64

Pizzeria

Pizza

commanderPizza()

PizzeriaFact
creerPizza()

PizzaVHStyleCasa PizzaVHStyleRabat
PizzaPouletStyleCasa PizzaPouletStyleRabat

PizzaVegetarienneStyleCasa

RabatPizzFact

CasaPizzFact

PizzaVegetarienneStyleRabat

creerPizza()

creerPizza()

Pizza4FromagetStyleCasa Pizza4FromagetStyleRabat

Design Patterns
par M. Boutahar 2010

65

Pattern builder

Design Patterns
par M. Boutahar 2010

66

Pizzeria Classique
Public class Pizza{
private String nom;
private String sauce;
private String pate;
public void setNom(String nom){this.nom=nom;}
public void setSauce(String sauce){this.sauce=sauce;}
public void setPate(String pate){this.pate=pate;}
}

Design Patterns
par M. Boutahar 2010

67

Pizzeria Classique
Public class PizzeriaExample{
psv main(...){
Pizzeria pizzeria=new Pizzeria();
Pizza pizzaPecheur=new Pizza();
Pizza pizzaPoulet=new Pizza();

Cration de la pizza est


visible de partout!

pizzaPecheur.setNom(pizzaPecheur'');
pizzaPecheur.setPate(pateFine'');
pizzaPecheur.setSauce( sauce pizza Pecheur'');

Pourquoi ne pas cacher


cette cration

pizzaPoulet.setNom(pizzaPoulet'');
pizzaPoulet.setPate(pateEpaisse'');
pizzaPoulet.setSauce sauce pizza Poulet'');
}}

Design Patterns
par M. Boutahar 2010

68

Pourqoui ne pas encapsuler la cration de la pizza dans un objet


appel builder
Et avoir un client dirigeant (director) qui demande l'objet builder
de construire l'objet Pizza pour lui

====> Pattern Builder

Design Patterns
par M. Boutahar 2010

69

Pattern Builder
Problme
Objet complexe ayant plusieurs constituants
cration de cette objet doit tre indpendant de ses constituants
diffrentes reprsentations de lobjet construit doivent tre possibles
la faon d'initialiser l'objet est la mme, il doit tre possible d'obtenir
diffrents rsultats.

Consquences

+ Variation possible de la reprsentation interne dun produit


limplmentation des produits et de leurs composants est cache au Director
Ainsi la construction dun autre objet revient dfinir un nouveau Builder

+ Isolation du code de construction et du code de reprsentation du reste de


lapplication
+ Meilleur contrle du processus de construction
Design Patterns
par M. Boutahar 2010

70

Pattern Builder: Objectif

oOn ne dispose pas toujours de toutes les informations ncessaires pour crer un
oobjet au moment de sa construction.
oIl est parfois pratique davoir une construction progressive dun objet, au rythme de lobtention
des paramtres ncessaires sa construction.
oRduire la taille dune classe dont la construction est relativement complique .
Exemple:
une interface utilisateur.: les composants sont rajout au fur et mesure
Une pizza: cration de la pte, prparation des ingrdients, prparation de la sauce
Le pattern BUILDER permet de dplacer la logique de construction dun objet en dehors de
la classe instancier.

Design Patterns
par M. Boutahar 2010

71

Pattern Builder

Builder: interface pour la cration de


pices (constituants) d' un objet Product

ConcreteBuilder: construit et
assemble des pices dun objet Product
en implmentant l'interface Builder

Director : construit un object en


utilisant linterface Builder

Product : representse lobjet


complexe en cours de construction

Design Patterns
par M. Boutahar 2010

72

Pattern Builder

Variation possible de la reprsentation interne dun produit


limplmentation des produits et de leurs composants est
cache au Director

Ainsi la construction dun autre objet revient


dfinir un nouveau Builder
Isolation du code de construction et du code de reprsentation
du reste de lapplication
Meilleur contrle du processus de construction

Design Patterns
par M. Boutahar 2010

73

Pattern Builder: Exemple


Quel modle poun notre Pizzria?

Design Patterns
par M. Boutahar 2010

74

Builder : Exemple
Public class Pizza{
private String nom; private String sauce;
private String pate;
public void setNom(String nom){this.nom=nom;}
public void setSauce(String sauce){this.sauce=sauce;}
public void setPate(String pate){this.pate=pate;} }
abstract class PizzaBuilder{
protected Pizza pizza;
public Pizza getPizza(){return pizza;}
public void createNewPizzaProduct()

{pizza=new Pizza();}

public abstract void buildNom();


public abstract void buildSauce();
public abstract void buildPate();
}
Design Patterns
par M. Boutahar 2010

75

ConcreteBuilder
Public class PizzaPecheurBuilder extends PizzaBuilder{
public void buildNom(){ pizza.setNom(Pizza Pecheur);}
public void buildsauce(){ pizza.setSauce( Ketchup+huile+...'');}
public void buildPate(){pizza.setPate(Pate fine);} }
Public class Pizza4FromagesBuilder extends PizzaBuilder {
public void buildNom(){ pizza.setNom(Pizza 4 fromages);}
public void buildsauce(){ pizza.setSauce( huile+...'');}
public void buildPate(){pizza.setPate(Pate fromage);}}
Public class PizzaPouletBuilder extends PizzaBuilder{
public void buildNom(){ pizza.setNom(Pizza Poulet);}
public void buildsauce(){ pizza.setSauce( sauce blanche+huile+...'');}
public void buildPate(){pizza.setPate(Pate paisse);} }
Public class PizzaVegetarienneBuilder extends PizzaBuilder{ .....}
Design Patterns
par M. Boutahar 2010

76

Director

Public class Pizzeria{


private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb)
{pizzaBuilder=pb;}
public Pizza getPizza(){
return pizzaBuilder.getPizza();
}
public void constructPizza(){
pizzaBuilder.createNewPizzaProduct();
pizzaBuilder.buildNom();
pizzaBuilder.buildSauce();
pizzaBuilder.buildPate(); }

Design Patterns
par M. Boutahar 2010

77

Director
Public class BuilderExample{
psv main(...){
Pizzeria pizzeria=new Pizzeria();
PizzaBuilder pizzaPecheurBuilder=new PizzaPecheurBuilder();
PizzaBuilder pizzaPouletBuilder=new PizzaPouletBuilder();
pizzeria.setPizzaBuilder(pizzaPecheurBuilder);
pizzeria.constructPizza();
Pizza pizzaPecheur=pizzeria.getPizza();
pizzeria.setPizzaBuilder(pizzaPouletBuilder);
pizzeria.constructPizza();
Pizza pizzaPoulet=pizzeria.getPizza();
}}

Design Patterns
par M. Boutahar 2010

78

Pattern Prototype

Design Patterns
par M. Boutahar 2010

79

Pattern Prototype
Problme
Cration d'une instance d'une classe est coteux de point de
vue temps de calcul ou compliqu
Solution:
Au lieu de crer des instance de classe, cloner des objet et
les modifier au besoin
Consquences
mmes consquences que Factory et Builder

Exemple
java.lang.Cloneable

Design Patterns
par M. Boutahar 2010

80

Pattern Prototype

Design Patterns
par M. Boutahar 2010

81

Pattern Prototype
Si on considre une grande BD sur laquelle on
effectue un certain nombre de requetes pour
construire une rponse.
Une fois on a cette rponse sous forme de table ou
d'un resultset, on pourrait vouloir la manipuler pour
produire autres rponses sans faire plus de requetes

Design Patterns
par M. Boutahar 2010

82

Clonage en Java
Pour cloner un objet en Java:
Point p1=(Point) p0.clone();

La classe Point doit implementer


l'interface Cloneable

La mthode clone retourne toujours un objet de type Object.


On doit le caster vers le type de l'objet qu'on est entrain de cloner.
La mthode clone est protge, elle peut tre appele dans
la mme classe ou le mme package contenant la classe.
On ne peut cloner que les objets issus d'une classe implmentant
l'interface Cloneable
Les objets qu'on ne peut pas cloner lve une exception de type
CloneNotSupportedException
Design Patterns
par M. Boutahar 2010

83

Prototype: Exemple

Client

Animal

createAnimal()
{Animal a;
...;a.clone();}

clone() : animal
helloAnimal()

Mouton
clone()
helloAnimal()

Coq
clone()
helloAnimal()

Design Patterns
par M. Boutahar 2010

84

Pattern Singleton

Design Patterns
par M. Boutahar 2010

85

Pattern Singleton
Problme
avoir une seule instance dune classe et pouvoir laccder

et la manipuler

facilement

Solution
une seule classe est ncessaire pour crire ce motif

Consquences
lunicit de linstance est compltement contrle par la classe elle mme. Ce motif peut
facilement tre tendu pour permettre la cration dun nombre donn dinstances

Design Patterns
par M. Boutahar 2010

86

Pattern Singleton
Principe :
Interdire l'instanciation d'une classe!

Solution:
Dclarer un constructeur private

Design Patterns
par M. Boutahar 2010

87

Pattern Singleton

Design Patterns
par M. Boutahar 2010

88

Pattern Singleton
Exemple : Une application qui se connecte une base de donnes.
Se connecter sans arrt une base de donnes est fastidieux et
lourd!
Pour y remerdier ====> utiliser le singleton Pattern.

Design Patterns
par M. Boutahar 2010

89

Pattern Singleton
public class Point {
private int x, y;
private static point _instance = null;
private Point() { x=0;y=0;}
public static Point getInstance() {
if (_instance == null) { _instance = new Point ();
SOP( Creation dun Point"); }
return _instance; }
public void afficheDetail() { SOP(x= +x+ y= +y"); } }

Design Patterns
par M. Boutahar 2010

90

Pattern Singleton
class Program {
Public static void main(string[] args) {
//Instanciation du Ppoint
Point unPoint= Point.getInstance(); unPoint.afficheDetail();
autrePoint();
}
public static void autrePoint() { //On essaie d'instancier un nouveau Point
Point unSecondPoint = Point.getInstance();
unSecondPoint.afficheDetail(); } }

Design Patterns
par M. Boutahar 2010

91

Pattern Singleton:Exemple
Une connexion une BDD sert de pont entre la base et l'application.
Pourquoi donc se connecter chaque fois la BDD?
Une fois la connexion est cre et effective pourquoi la refaire chaque
fois?
L'application et la BDD peuvent communiquer d'une manire efficace.

===> s'assurer donc qu'une seule instance de l'objet connexion


est cree!
Design Patterns
par M. Boutahar 2010

92

Pattern Singleton: Exemple


Une seule instance de l'objet connexion une BDD.
import java.sql.*;
public class BdConnection{
// URL de connection
private String url=''jdbc:postgresql://localhost:6580/Bd1'';
private String user= ''postgresUser '';
private String passwd= ''postgresPass'';
private static Connection connect;
// Constructeur priv
private BdConnection(){
try{ connect=DriverManager.getConnection(url,user,passwd);}
catch(SQLException e){SOP(e.getMessage();}
Design Patterns
}
par M. Boutahar 2010

93

Pattern Singleton: Exemple


Une seule instance de l'objet connexion une BDD.
//Mthode qui va retourner l'instance unique de l'objet connection

public static Connection getInstance(){


if(connect==null) {new BdConnection(); SOP('' Instanciation de la
connexion SQL'');}
else SOP ('Connexion SQL Existante'');
return connect;
}

Design Patterns
par M. Boutahar 2010

94

Pattern Singleton: Exemple


Une seule instance de l'objet connexion une BDD.
// Classe principale
import java.sql.*;
public class Test{

psv main(...){
try{
Statement state1 = BdConnection.getInstance().createStatement(''req1'');
Statement state2 = BdConnection.getInstance().createStatement(''req2'');
Statement state3 = BdConnection.getInstance().createStatement(''req3'');
Statement state4 = BdConnection.getInstance().createStatement(''req4'); }
catch( SQLException e){ sop(e.getMessage(); } }

Design Patterns
par M. Boutahar 2010

95

L'application affichera quoi?

Design Patterns
par M. Boutahar 2010

96

INSTANCIATION DE LA CONNEXION SQL!


CONNEXION SQL EXISTANTE!
CONNEXION SQL EXISTANTE!
CONNEXION SQL EXISTANTE!

Design Patterns
par M. Boutahar 2010

97

DP Construction: Synthse
Le Factory Pattern est utilis pour choisir et retourner une instance d
une classe parmi un nombre de classes similaires selon une donne
fournie la factory
Le Abstract Factory Pattern est utilis pour retourner un groupe de
classes
Le Builder Pattern assemble un nombre dobjets pour construire un
nouvel objet, partir des donnes qui lui sont prsentes. Frquemment le
choix des objets assembler est ralis par le biais dune Factory
Le Prototype Pattern copie ou clone une classe existante plutt que
de crer une nouvelle instance lorsque cette opration est coteuse
Le Singleton Pattern est un pattern qui assure quil ny a quune et une
seule instance dun objet et quil est possible davoir un accs global cette
instance
Design Patterns
par M. Boutahar 2010

98

Design Patterns de structure

Design Patterns
par M. Boutahar 2010

99

Problmatique:

DP de Structure

Utilisation dune classe existante dont linterface ne convient pas


Utilisation de plusieurs sous-classes dont ladaptation des
interfaces est impossible par drivation
Solution: Combiner des classes et des objets, par abstraction de la
manire dont ils sont composs, pour former des structures plus
importantes ?

Deux types de motifs :


Motifs de structure de classes
Motifs de structure dobjets
Design Patterns
par M. Boutahar 2010

100

DP de Structure
Motifs de structure de classes
Utilisation de lhritage pour composer des interfaces et/ou des
classes implmentations (ex : Adapter) pour former des
programmes plus performants.
Motifs de structure dobjets
composition ou inclusions dobjets pour former d'autres objets:
ajouter dun niveau dindirection pour accder un objet
ex : Adapter dobjet, Bridge, Facade, Proxy,
composition rcursive pour organiser un nombre quelconque
dobjets
ex : Composite
Design Patterns
par M. Boutahar 2010

101

DP de Structure: Adapter

Design Patterns
par M. Boutahar 2010

102

DP de Structure: Adapter

Design Patterns
par M. Boutahar 2010

103

DP de Structure: Adapter

Design Patterns
par M. Boutahar 2010

104

Adapter
Problmatique : Ajuster l'interface d'un objet celle attendue
par le code client.
Solution : L'adaptateur conserve une instance de la classe
adapte et convertit les appels d'une interface existante vers
l'interface implmente.

Design Patterns
par M. Boutahar 2010

105

DP de Structure : Class Adapter (2)

Target:definit le domaine de l'interface que le client utilise.

Adaptee: definit une interface existante qu'on a besoin d'adpter.

Client: collabore avec les objets conformement l'interface Target.

Adapter: adapte l'interface Adaptee pour l'interface Target.

Design Patterns
par M. Boutahar 2010

106

DP de Structure : Class Adapter

Design Patterns
par M. Boutahar 2010

107

DP de Structure : Class Adapter (2)

Lorsque le dveloppeur du code client dnit prcisment les besoins du client, on peut remplir
le contrat dni par linterface en adaptant le code existant.
Design Patterns
par M. Boutahar 2010

108

Adapter: Synthse

Design Patterns
par M. Boutahar 2010

109

Adapter: Exemple
Implmenter le modle suivant o le client dsire
dessine une ligne ou un rectangle!

Client

Forme

Dessiner(Point,Point)

Point
int x
Int y

Dessiner(int,int,int,int)

Ligne
Dessiner(int,int,int,int)

Rectangle
Dessiner(int,int,int,int)
Design Patterns
par M. Boutahar 2010

110

Adapter: Exemple
Class Ligne extends Forme{
public void dessiner(int x1, int y1, int x2, int y2){
SOP(''ligne de (''+x1+'',''+y1+'') (''+x2+'',''+y2+'')''););}
}
Class Rectangle extends Forme{
public void dessiner(int x, int y, int long, int lar){
SOP(''rectangle (''+x+'',''+y+'') avec une longueur de ''+long+'' et une
largeur de''+lar+'')''););}

}
Design Patterns
par M. Boutahar 2010

111

Adapter: Exemple
Class Point { int x, int y; ...}
Class Client{
Forme [ ] formes;....
Void setFormes(Formes []formes)
{this.formes=formes;}
}
void dessiner (Point p1, Point p2){
for(int i=0;i<formes.length;i++){
if(formes[i] instanceof Ligne)
(Ligne)formes[i].dessiner(p1.getX(),p1.getY(),p2.getX(),p2.getY() );
elseif(formes[i] instanceof Rectangle)
(Rectangle)formes[i].dessiner(p1.getX(),p1.getY(),Math.abs(p2.getX()p1.getX()), Math.abs(p2.getY()-p1.getY());
else sop(''forme incorrecte'');
}
}}
Design Patterns
par M. Boutahar 2010

112

Adapter: Exemple
Class ClientTest{
public static void main( String[] args){
Client client=new Client();
Formes f={new Ligne()};
client.setFormes(f);
client.dessiner(new Point(10,20),new Point(30,60));
Formes f={new Rectangle()};
client.setFormes(f);
client.dessiner(new Point(50,70),new Point(100,80));
}}}
Design Patterns
par M. Boutahar 2010

113

Les interfaces des classes Ligne et Rectangle sont incompatible


avce le Client
Le Client doit rcuprer le type de chaque forme et fournir les bon
arguments manuellement! (Inconvenient!!!!)

Utiliser le Pattern Adapter

Design Patterns
par M. Boutahar 2010

114

Client

Point
int x
Int y

Dessiner(Point,Point)

Forme
FormeAdapter
dessiner(Point,Point)
Dessiner(int,int,int,int)

Ligne

Dessiner(int,int,int,int)

Rectangle
Dessiner(int,int,int,int)

RectangleAdapter

dessiner(Point,Point)
Design Patterns
par M. Boutahar 2010

LigneAdapter

dessiner(Point,Point)
115

Proxy

Design Patterns
par M. Boutahar 2010

116

Proxy
Nous voulons faire des achats et nous nous disposons pas d'argents!
Trois solutions:
Aller la banque, faire la queue , remplir un formulaire, retirer de l'argent
et aller ensuite faire ses achats
Aller un GAB , retirer de l'argent et aller faire ses achats
Aller faire ses achats et payer en carte bancaire ou en chque
le cheque, la Carte representent la banque

Design Patterns
par M. Boutahar 2010

117

Proxy
Modle utilis pour agir par procuration pour un objet afin de contrler les
oprations qui lui sont appliques

Appliquer les mthodes sur le proxy plutot sur l'objet rel.


Masquer des problmes daccs (ex : fichier)
Diffrer lexcution doprations coteuses
Contrler les droits daccs un objet

Design Patterns
par M. Boutahar 2010

118

Proxy: Diagramme

Design Patterns
par M. Boutahar 2010

119

Exemple
public interface Imath{

Class Math implements Imath{

double add (double x, double y);

double add (double x, double y){return x+y;}

double sub (double x, double y);

double sub (double x, double y){return x-y;}

double mul (double x, double y);

double mul (double x, double y){return x*y;}

double div (double x, double y);}

double div (double x, double y){return x/y;}}

Lobjet Math peut tre utilis par un client selon:


Math unMath=new Math();
System.out.println(4 + 2=+unMath.add(4,2));
System.out.println(4 - 2=+unMath.sub(4,2));
System.out.println(4 * 2=+unMath.mul(4,2));
System.out.println(4 / 2=+unMath.div(4,2));
Rien de nouveau!
Design Patterns
par M. Boutahar 2010

120

Exemple
public interface Imath{

Class Math implements Imath{

double add (double x, double y);

double add (double x, double y){return x+y;}

double sub (double x, double y);

double sub (double x, double y){return x-y;}

double mul (double x, double y);

double mul (double x, double y){return x*y;}

double div (double x, double y);}

double div (double x, double y){return x/y;}}

Comment crer un Proxy dun objet Math?

Design Patterns
par M. Boutahar 2010

121

Exemple
public interface Imath{

Class Math implements Imath{

double add (double x, double y);

double add (double x, double y){return x+y;}

double sub (double x, double y);

double sub (double x, double y){return x-y;}

double mul (double x, double y);

double mul (double x, double y){return x*y;}

double div (double x, double y);}

double div (double x, double y){return x/y;}}

Class MathProxy implements Imath {

private Math math= new Math( );


double add (double x, double y)
{return math.add(x,y);}
double sub (double x, double y)
{return math.sub(x.y);}
double mul (double x, double y)
{return math.mul(x,y);}

Class Main {
public static void main(String[] args){
IMath proxy=new MathProxy();
System.out.println(4 + 2=+proxy.add(4,2));
System.out.println(4 - 2=+proxy.sub(4,2));
System.out.println(4 * 2=+proxy.mul(4,2));
System.out.println(4 / 2=+proxy.div(4,2));

double div (double x, double y)


{return math.div(x,y);} }

Design Patterns
par M. Boutahar 2010

122

Exemple
Comment crer un proxy capable de soccuper de la fourniture
des oprations arithmtiques standards et de contrler les signes des
Oprandes? Si un des oprandes est <0, le proxy lance une exception
arithmtique.

Design Patterns
par M. Boutahar 2010

123

Exemple
public interface Imath{

Class Math implements Imath{

double add (double x, double y);

double add (double x, double y){return x+y;}

double sub (double x, double y);

double sub (double x, double y){return x-y;}

double mul (double x, double y);

double mul (double x, double y){return x*y;}

double div (double x, double y);}

double div (double x, double y){return x/y;}}

Class MathProxy implements Imath {

private Math math= new Math( );


double add (double x, double y) {
Try { if (x <0 || y<0) throw new
ArithmeticException()

Class Main {
public static void main(String[] args){
IMath proxy=new MathProxy();
System.out.println(4 + 2=+proxy.add(4,2));

Else

System.out.println(4 - 2=+proxy.sub(4,2));

return math.add(x,y);}

System.out.println(4 * 2=+proxy.mul(4,2));

Cath (Exception e ) { SOP


(e.getMessage()); }

System.out.println(4 / 2=+proxy.div(4,2));

Design Patterns
par M. Boutahar 2010

124

Bridge

Design Patterns
par M. Boutahar 2010

125

Cas dtude
Comment reprsenter 3 plateformes de soda:
Une dorange
Une de citron
Une de Coca
Les Diffrents soda peuvent tre reprsent en Medium ou en superSize.
Un comportement classique dun soda , il se verse!

Design Patterns
par M. Boutahar 2010

126

Solution classique anti-Bridge


Soda

SuperSizeSoda

MediumSoda

OrangeSodaG

OrangeSodaM

CitronSodaM

CitronSodaG

ColaSodaG

ColaSodaM
Design Patterns
par M. Boutahar 2010

127

Cas dtude Bridge


Si je veux rajouter un nouveau type de Soda (Pomme par exemple!)
Solution classique: rajouter deux types Medium et Supersize!!!!!
Si je veux rajouter un nouvelle representation de Soda (Petite Taille!)
Solution classique: rajouter la representation petireTaille pour
Citron/Cola/Orange/Pomme implementations !!!!

Limplementation de lobjet et sa representation nvoluent pas


indpendament!!!!
Design Patterns
128
par M. Boutahar 2010

Cas dtude
Pourquoi ne pas Sparer limplmentation d'un objet (Citron, Cola,...)
de son aspect de reprsentation (Mediuim, SuperSize,...) ?

Pattern Bridge

Design Patterns
par M. Boutahar 2010

129

Bridge
Objectif :
Sparer limplmentation d'un objet de son aspect de reprsentation et
d'abstraction
Permettre labstraction et limplmentation de varier
indpendamment.

Design Patterns
par M. Boutahar 2010

130

Bridge

Implementation : dfinit l'interface de l'implmentation. Cette interface n'a pas besoin de correspondre l'interface de l'Abstraction.
L'Implementation peut, par exemple, dfinir des oprations primitives de bas niveau et l'Abstraction des oprations de haut niveau qui utilisent
les oprations de l'Implementation.
ImplementationA et ImplementationB : sont des sous-classes concrtes de l'implmentation.
Abstraction : dfinit l'interface de l'abstraction. Elle possde une rfrence vers un objet Implementation. C'est elle qui dfinit le lien entre
l'abstraction et l'implmentation. Pour dfinir ce lien, la classe implmente des mthodes qui appellent des mthodes de l'objet Implementation.
AbstractionA et AbstractionB : sont des sous-classes concrtes de l'abstraction. Elle utilise les mthodes dfinies par la classe Abstraction.
La partie cliente fournit un objet Implementation l'objet Abstraction. Puis, elle fait appel aux mthodes fournit par l'interface de l'abstraction.

Design Patterns
par M. Boutahar 2010

131

Bridge: Exempe (V1)


Soda

SodaImp

MediumSoda

SuperSizeSoda

OrangeSodaImp

CitronSodaImp

Design Patterns
par M. Boutahar 2010

ColaSodaImp

132

Bridge: Exempe
Soda

SodaImp

MediumSoda

SuperSizeSoda

OrangeSodaImp

CitronSodaImp

Design Patterns
par M. Boutahar 2010

ColaSodaImp

133

Exemple

Implmenter en Java ce Modle de plateforme de Soda.

Design Patterns
par M. Boutahar 2010

134

Composite

Design Patterns
par M. Boutahar 2010

135

Composite
Objectif:
Etablir des structures arborescentes entre des objets composer des objets
en structures d'arbre poiur reprsenter une hirarchie d'objets
Ignorer la diffrence entre un composant simple et un composant
composite: utilser les mmes oprations sur les objets composites et les objets
simples.
Permettre aux clients de traiter de
faon uniforme des objets individuels et des compositions dobjets.

Consquences
+ hirarchies de classes dans lesquelles lajout de nouveaux composants
est
simple
+ simplification du client qui na pas se proccuper de lobjet accd
Exemple: java.awt.Component; java.awt.Container
Design Patterns
par M. Boutahar 2010

136

Composite

Feuille

Design Patterns
par M. Boutahar 2010

137

Composite

Design Patterns
par M. Boutahar 2010

138

Composite: Exemple
Une pizzeria dispose d'une carte menu qui propose plusieurs menus
diffrents:
Menu 60 Dh: Une Pizza + Une boisson
Menu 90 Dh: Une salade+Une Pizza + Une boisson
Menu 110 Dh: Une salade+Une Pizza + Une frite+ Une boisson

Menu 120 Dh: Une grande salade+Deux Pizza + Deux boissons

Comment mettre en place ce systme?

Design Patterns
par M. Boutahar 2010

139

Composite: Menu de la pizzeria


Article
Pizza

Client

getDescription()
getName()
getPrix()
print()
add(Component)
remove(Component)
giveChild(int)

Salade

Menu

Boisson

menuComponents

getDescription()
getName()
getPrix()
print()

getDescription()
getName()
print()
add(Component)
remove(Component)
giveChild(int)

Design Patterns
par M. Boutahar 2010

getPrix n'est pas defini!


140

Composite: Exercice
Chacun des membres de la compagnie reoit un
salaire.
A tout moment, il doit tre possible de demander le
cot dun employ.
Le cot dun employ est calcul par :
Le cot dun individu
est son salaire.
Le cot dun responsable
est son salaire plus
celui de ses subordonns.
Donner un modle ce problme
et une implmentation Java.
Vs modle classique
Design Patterns
par M. Boutahar 2010

141

Composite: Exemple(Entreprise)
Employee
name, salary
getName()
getSalary()
add(Employee)
remove(Employee)
getSubbordinates(int)
print()

EmployeSimple

EmployeComposite

Employees
GetSalary( )

getSalary()
add(Employee)
remove(Employee)
getSubbordinates(int)
print()
Design Patterns
par M. Boutahar 2010

142

Facade

Design Patterns
par M. Boutahar 2010

143

Facade
Une application OO est, idalement, une classe simple utilise
dautres classes groupes en package (ou kits) rutilisables.
Un dveloppeur de kits/ sous-systmes cre souvent des packages de
classes bien conues.
Ces kits sont utlis pour crer une varit innie dapplications
spciques.
Exemple :
Java.awt, javax.swing, java.io,.

Design Patterns
par M. Boutahar 2010

144

Facade
La rutilisabilit des kits doutils
Le dveloppeur est face une quantit tellement impressionnante
doptions quil lui est parfois difcile de savoir par o commencer. !!!
Solution: fournir une classe qui permet un usage typique peu de
frais des classes du Kit /Package/Sous-Systme.
Cette Classe = Une faade

Design Patterns
par M. Boutahar 2010

145

Facade
Motif est utiliser pour :

Faciliter laccs un grand nombre de modules en fournissant une


couche interface
Fournir une interface simple dun package ou dun sous-systme. u
systme complexe
Introduire une interface pour dcoupler les relations entre deux
systmes complexes
Classe a fonctionnalits situ entre le kit et une application complte
(partie client),

Design Patterns
par M. Boutahar 2010

146

Facade

Design Patterns
par M. Boutahar 2010

147

Facade

Design Patterns
par M. Boutahar 2010

148

Facade: Exemple Cas classique (JDBC)


ResultSet
Metadata

get
ResultSet

Database
Metadata

Connection

Statement

create

Execute

Client

create

Create
get

create
Design Patterns
par M. Boutahar 2010

149

Facade: Exemple
Cas classique
Chargement du driver:
try{Class.forName(driver);} //load the Bridge driver
catch (Exception e)
{System.out.println(e.getMessage());}
Creation d'une connection la base de donne:
Connection con;
try {con = DriverManager.getConnection(url);
dma =con.getMetaData(); //get the meta data
}
catch (Exception e)
{System.out.println(e.getMessage());}
Design Patterns
par M. Boutahar 2010

150

Facade: Exemple
Cas classique
Rcupration de la liste des tables de la BD:
ArrayList tname = new ArrayList();
ResultSet results;
try {
results = new resultSet(dma.getTables(catalog,null, "%", types));

}
catch (Exception e) {System.out.println(e);}
while (results.hasMoreElements())
tname.add(results.getColumnValue("TABLE_NAME"));
===> code compliqu + Exceptions
===> crer un autre code comme Facade ce code.
Design Patterns
par M. Boutahar 2010

151

Facade

DataBaseFacade

ResultSet
Metadata

Client

get
ResultSet

Database
Metadata

Execute

Create

Connection

create

get

Design Patterns
par M. Boutahar 2010

Statement

152

Facade

DataBaseFacade

Client

ResultSetFacade
ResultSet
Metadata

get
ResultSet

Database
Metadata

Execute

Create

Connection

create

get

Design Patterns
par M. Boutahar 2010

Statement

153

Facade: Role
Fournir une interface simple un systme complexe aucune
rduction de ses capacit et ses diffrentes options.
Protger les clients du composant sous-systmes
Favoriser un couplage rduite ou faible entre les sous-systmes et
les clients de ces sous-systmes.
Traduire les requtes d'un client un sous systme spcifique
capable de rpondre ces requte spcifiques.

Design Patterns
par M. Boutahar 2010

154

Decorator

Design Patterns
par M. Boutahar 2010

155

Cas de la pizzeria
Pizza
description
getDescription()
prix()

PizzaVH
prix()

PizzaPoulet

prix()

Pizza4Fromage

prix()

Design Patterns
par M. Boutahar 2010

PizzaVegetarienne

prix()

156

Decorator: pizzeria
Dans cette pizzeria, on a la possibilit de demander une pizza avec des
supplment:
supplment de Fromage,
supplment de sauce,
supplment de l'huile,
supplment d'ingrdient

Le prix final de la pizza dependrera donc du prix de la pizza et ces


supplment.
Solution classique : ??????

Design Patterns
par M. Boutahar 2010

157

Decorator: pizzeria
Dans cette pizzeria, on a la possibilit de demander une pizza avec des
supplment:
supplment de Fromage,
supplment de sauce,
supplment de l'huile,
supplment d'ingrdient

Le prix final de la pizza dependrera donc du prix de la pizza et ces


supplment.
Solution classique : crer des sous classe de chaque type de pizza

Design Patterns
par M. Boutahar 2010

158

Decorator: pizzeria
Pour tendre une base de code: on ajoute de nouvelles classes ou
mthodes (Hritage!).
Solution classique : crer des sous classe de chaque type de pizza

Design Patterns
par M. Boutahar 2010

159

Pizzeria: Solution classique (1)


Pizza
description

PizzaVHSupIngr

prix()

getDescription()
prix()

prix()

prix()

PizzaVHSupHuile
prix()

PizzaPouletSupHuile

PizzaVHSupFrom

PizzaPouletSupFrom

PizzaVHSupSauce

prix()

prix()
Pizza4FromageSupIngr

PizzaPouletSupIngr

prix()

PizzaVegetarienneSupIngr

prix()

prix()

prix()

PizzaVegetarienneSupHuile

prix()

PizzaVegetarienneSupFro
Pizza4FromageSupFrom

prix()

PizzaPouletSupSauce

prix()

Pizza4FromageSupHuile

prix()

PizzaVegetarienneSupSau
Pizza4FromageSupSauce

prix()
Design Patterns
par M. Boutahar 2010

prix()

160

Decorator: pizzeria
On a besoin de composer un objet avec un nouveau
comportement lors de lexcution.
Systme trs lourd maintenir avec une hierrachie de sous classes
Le cas ou d'autre supplment possible rajouter une pizza!

Design Patterns
par M. Boutahar 2010

161

Pizzeria: Solution classique (2)


Dans la classe pizza ajouter des attributs boolean pour representer les
supplment.
Pizza
Nouveaux attributs boolean

description
supFrom
supSauce
supHuile
supVh
SupPoulet
supPoisson

getDescription()
prix()
getSupFrom()
setSupFrom()
getSupSauce()
setSupSauce()
....

La mthode prix () n'est plus


abstraite

Design Patterns
par M. Boutahar 2010

162

Une solution Possible


Pizza

Nouveaux attributs boolean

description
supFrom
supSauce
supHuile
supIngred
La classe Pizza calculera
le prix pour toutes les getDescription()
prix()
pizzas et leurs
getSupFrom()
supplment
setSupHuile()
getSupSauce()
setSupIngred()
....

PizzaVH
prix()

PizzaPoulet

La mthode prix () n'est plus


abstraite

Pizza4Fromage

prix()
Design Patterns
par M. Boutahar 2010

prix()

PizzaVegetarienne

prix()
163

Les variations de prix pour les supplments va obliger


modifier le code existant
Nouveau supplment obligera ajouter de nouvelles mthodes
et de modifier la mthode du cot de la superclasse.
Si on prvoit de nouvelles pizzas. Pour certaines de ces
pizzas (pizza pecheur par exemple ), les suppliments
peuvent ne pas tre approprie, mais la sous-classe de Pizza
Pecheur hritera des mthodes (Cas getSupVh()!)

=====> mauvaise solution !!!


Design Patterns
par M. Boutahar 2010

164

Decorator: La solution
On utilise le pattern Decorator lorsque :
il faut ajouter des responsabilits dynamiquement et
de manire transparente un systme
Le pattern Decorator fournir une alternative flexible la drivation pour tendre les fonctionnalits.

Design Patterns
par M. Boutahar 2010

165

Decorator: La solution
Le ConcreteComponent est l'objet qui
nous allons ajouter dynamiquement de
nouveaux comportement. Il hrite de
Component

Chaque
Chaquecomposant
composantpeut
peuttre
treutilis
utilistel
telquel,
quel,
ou
ouenvelopp
envelopppar
parun
unDecorator.
Decorator.

Chaque Decorator a (enveloppe)


un composant:
Decorateur a une variable
d'instance
qui fait rfrence un
composant.

Decorators implmentent le mme


Interface ou drivent de la mme
classe abstraite en tant que
composant
qu'ils vont dcorer.

Le ConcreteDecorator a une
variable d'instance pour la chose
qu'il dcore (le composant que
le dcorateur enveloppe).

Decorators peuvent tendre


l'tat du composant

Decorators peuvent ajouter de nouvelles

Design Patterns
mthodes, mais un nouveau
comportement
par M. Boutahar
2010 est gnralement ajout en faisant le traitement
avant ou aprs une mthode existante dans le composant

166

Decorator: pizzeria
Pizza
description

SuplDecorator
getDescription()

getDescription()
prix()

PizzaVH
prix()
PizzaPoulet

prix()

Sauce
Pizza pizza

Huile
Pizza pizza

getDescription()
prix()

getDescription()
prix()

Pizza4Fromage

prix()
PizzaVegetarienne

Fromage
Pizza pizza
getDescription()
prix()

prix()
Design Patterns
par M. Boutahar 2010

167

Patterns Comportementaux

Design Patterns
par M. Boutahar 2010

168

Patterns Comportementaux
Formes de comportement pour dcrire :
des algorithmes
des comportements entre objets
des formes de communication entre objet

Design Patterns
par M. Boutahar 2010

169

Iterator
Problmatique: Accder un objet compos dont on ne veut pas
exposer la structure interne!
Solutions:
- Offrir plusieurs manires de parcourir une structure compose
- Offrir une interface uniforme pour parcourir diffrentes structures.
-Utiliser un objet qui dispose de la connaissance ncessaire la
navigation dune collection dobjets avec une interface unique.
Pattern ITERATOR
.
Design Patterns
par M. Boutahar 2010

170

Iterator : Objectif
Fournir un moyen daccder de faon squentielle aux lments
dune collection dobjets.

Design Patterns
par M. Boutahar 2010

171

Iterator
Item

next()
hasNext()

crer
Implements
Implements

Rcupre
Menus de
Design Patterns
par M. Boutahar 2010

172

Cas: Menus d'un Restaurant


Menu
MenuItem
Description
nom
prix
MenuItem(nom,desc,prix)

MAXITEM
menuItems:ArrayList

getMenuItems()
addItem(nom,desc,prix)

MenuDejeuner
MAXITEM
menuItems:ArrayList

getMenuItems()
addItem(nom,desc,prix)

getDescription()
getPrix()
getNom()

MenuPetitDej
menuItems:ArrayList

MenuDinner
MAXITEM
menuItems:ArrayList

getMenuItems()
addItem(nom,desc,prix)
Design Patterns
par M. Boutahar 2010

getMenuItems()
addItem(nom,desc,prix)
173

Cas: Menus d'un Restaurant


C'est quoi le problme d'avoir 3 menus diffrents?
Pour afficher le contenu des 3 menus:

Design Patterns
par M. Boutahar 2010

174

Cas: Menus d'un Restaurant


MenuPetitDej menuPetitDej=new MenuPetitDej();
ArrayList petitDejItems=menuPetitDej.getMenuItems();
MenuDejeuner menuDejeuner=new MenuDejeuner();
ArrayList dejeunerItems=menuDejeuner.getMenuItems();
MenuDinner menuDinner=new MenuDinner();
ArrayList dinnerItems=menuDinner.getMenuItems();
for(int i=0;i<petitDejItems.size();i++){
MenuItem menuItem=(MenuItem)petitDejItems.get(i);
sop(menuItem.getNom()+ );sop(menuItem.getDescription()+ );
sop(menuItem.getPrix()+ );}
for(int i=0;i<DejeunerItems.size();i++){
MenuItem menuItem=(MenuItem)DejeunerItems.get(i);
sop(menuItem.getNom()+ );sop(menuItem.getDescription()+ );
sop(menuItem.getPrix()+ );}
for(int i=0;i<DinnerItems.size();i++){
MenuItem menuItem=(MenuItem)DinnerItems.get(i);
sop(menuItem.getNom()+ );sop(menuItem.getDescription()+ );
sop(menuItem.getPrix()+ );}
Design Patterns
par M. Boutahar 2010

175

Cas: Menus d'un Restaurant


Inconvenients:
Utiliser des boucles explicites pour parcourir les diffrents menus
Le code n'est pas optimis
Le code est lourd maintenir!

Design Patterns
par M. Boutahar 2010

176

MenuItem

Cas: Menus d'un Restaurant


Client
printMenu()

Menu
Creates

Iterator
hasNext()
next()

MenuPetitDej
menuItems
Iteraror:createIterator()

MenuDejeuner

MenuPetitDejIterator MenuDejeunerIterator
hasNext()
next()

hasNext()
next()

menuItems
Iterator:createIterator()

MenuDinner
menuItems
Iterator:createIterator()

MenuDinnerIterator
Recupre
Menus de
Design Patterns
par M. Boutahar 2010

hasNext()
next()
177

State

Design Patterns
par M. Boutahar 2010

178

State
Motif utilis quand un objet change de comportement en fonction de
son tat interne.
Exemple :
une socket TCP (tat non connecte, connecte, en attente de
connection)
Une imprimante qui passe de prte, en manque de papier ou en
manque dencre.

Design Patterns
par M. Boutahar 2010

179

State

Design Patterns
par M. Boutahar 2010

180

Exemple: Etat dune imprimante


remplir bac papier

disponible
bac papier vide
Ajout encre

plusDePapier

Niveau encre faible

niveauEncreBas
Design Patterns
par M. Boutahar 2010

181

Exemple: Etat dune imprimante


Imprimante
-nbrFeuille:int

tat courant

<<interface>>
EtatImprimante

+ imprimer(Document) : int

+ imprimer(Document)
+ remplirBacPapier()

*
Document
1

- nbrePages:int

NiveauEncreBas
Disponible
Plus de Papier
Design Patterns
par M. Boutahar 2010

182

Visitor

Design Patterns
par M. Boutahar 2010

183

Visitor
Problme
Des oprations doivent tre ralises dans une structure dobjets comportant des objets
avec des interfaces diffrentes
Plusieurs oprations distinctes doivent tre ralises sur des objets dune structure
La classe dfinissant la structure change rarement mais de nouvelles oprations doivent
pouvoir tre dfinies souvent sur cette structure
Consquences
+ lajout de nouvelles oprations est ais
+ union de diffrentes oprations et sparations dautres
MAIS lajout de nouvelles classes concrtes est freine

Design Patterns
par M. Boutahar 2010

184

Visitor

Visitor declare la mthode visit() pour chaque classe de


ConcreteElement dans la structure object structure
ConcreteVisitor implemente chaque opration declar par Visitor
Element define lopration Accept que prend un vistor en argument
ConcreteElement implementse lopration Accept que prend un visitor comme
argument
ObjectStructure peut numr ses lments, peut fournir linterface haut
niveau pour autoriser le visitor de visiter
ses lments..
Design Patterns
185
par M. Boutahar 2010

Visitor

Accept() admet en argument un vistor


En retour, accept() applique la mthode
visit() au visiteur et en argument elle prend
sa rfrence!
Design Patterns
par M. Boutahar 2010

186

Visitor
Soit une entreprise employant un certain
nombre demploy. Chaque employ dispose
dun nom, un salaire, le nombre de jour de
vacance et le nombre de jour de maladie.
Le patron a besoin dun rapport annuel des jours
de vacance de chacun de ses employs.

Design Patterns
par M. Boutahar 2010

187

Exemple
public class Employee{
int JourMalade, JourVac;

float Salaire;

String Nom;

public Employee(int JourMalade, int JourVac, float Salaire,String Nom){


This.JourMalade= JourMalade; this.JourVac=JourVac;
Nom=Nom;}

this.Salaire=Salaire; this.

public String getNom() { return Nom; }


public int getJourMalade() { return JourMalade; }
public int getJourVac) { return JourVac; }
public float getSalaire() { return Salaire; }
}

Design Patterns
par M. Boutahar 2010

188

Employ:Rapport Cong
Public class Client{

Traitement par le client!

Psv main(){
Int totalDays=0;

for (int i = 0; i < employees.length; i++){


totalDays+=employees[i].getJourVac();
SOP(employees[i].getJourVac());
}t
System.out.println(totalDays);
}}
Design Patterns
par M. Boutahar 2010

La structure est expose!


Rien nest dissimul!
189

Visitor:Employe
Employe

Accept(v:Visitor)

Visitor

Visit(e:Employe)

VacationVisitor

Visit(e:Employe)
Design Patterns
par M. Boutahar 2010

190

Visitor
Dans cette entreprise y a un aytre type
demploy! Les Boss.
Les boss ont des jours de vacances
supplmentaires la place des primes!!!!

Design Patterns
par M. Boutahar 2010

191

Visitor:Employe
Employe

Accept(v:Visitor)

Boss
BonusDays:int
Accept(v:Visitor)

Visitor

Visit(e:Employe)
Visit(e:Boss)

BVacationVisitor

Visit(e:Boss)
Visit(e:Employe)
Design Patterns
par M. Boutahar 2010

VacationVisitor

Visit(e:Employe)
Visit(e:Boss)
192

Observer

Design Patterns
par M. Boutahar 2010

193

Observer
Problme
on veut assurer la cohrence entre des classes cooprant
entre elles tout en maintenant leur indpendance
Consquences
+ couplage abstrait entre un sujet et un observeur, support pour
la communication par diffusion,
MAIS des mises jour inattendues peuvent survenir, avec des
cots importants.
Exemple
java.util.Observable
java.util.Observer
Design Patterns
par M. Boutahar 2010

194

Observer

Design Patterns
par M. Boutahar 2010

195

Vous aimerez peut-être aussi