Académique Documents
Professionnel Documents
Culture Documents
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
Design Patterns
par M. Boutahar 2010
Exercice
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;
}
}
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'');} }
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();
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
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;
19
Cas Basique
Pizza
Pizzeria
commanderPizza(String)
PizzaVH
PizzaVegetarienne
PizzaPoulet
Pizza4Fromaget
Design Patterns
par M. Boutahar 2010
20
Design Patterns
par M. Boutahar 2010
21
Design Patterns
par M. Boutahar 2010
22
Elment de solution
Design Patterns
par M. Boutahar 2010
23
pizza.preparer();
pizza.cuire(); pizza.couper();
pizza.emballer(); return pizza;
}
}
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
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
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
Design Patterns
par M. Boutahar 2010
32
Design Patterns
par M. Boutahar 2010
33
Design Patterns
par M. Boutahar 2010
34
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
Design Patterns
par M. Boutahar 2010
37
Design Patterns
par M. Boutahar 2010
38
Design Patterns
par M. Boutahar 2010
39
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 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.
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.
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
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
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
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
Pizza
SimplePizzaFactory
Pizzeria
commanderPizza()
creerPizza()
PizzaVH
PizzaVegetarienne
PizzaFactory{interface}
creerPizza()
PizzaPoulet
Pizza4Fromaget
Design Patterns
par M. Boutahar 2010
63
Exercice
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();
pizzaPecheur.setNom(pizzaPecheur'');
pizzaPecheur.setPate(pateFine'');
pizzaPecheur.setSauce( sauce pizza Pecheur'');
pizzaPoulet.setNom(pizzaPoulet'');
pizzaPoulet.setPate(pateEpaisse'');
pizzaPoulet.setSauce sauce pizza Poulet'');
}}
Design Patterns
par M. Boutahar 2010
68
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
70
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
ConcreteBuilder: construit et
assemble des pices dun objet Product
en implmentant l'interface Builder
Design Patterns
par M. Boutahar 2010
72
Pattern Builder
Design Patterns
par M. Boutahar 2010
73
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();}
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
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();
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.
92
93
Design Patterns
par M. Boutahar 2010
94
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
Design Patterns
par M. Boutahar 2010
96
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
par M. Boutahar 2010
99
Problmatique:
DP de Structure
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
Design Patterns
par M. Boutahar 2010
106
Design Patterns
par M. Boutahar 2010
107
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
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
Design Patterns
par M. Boutahar 2010
118
Proxy: Diagramme
Design Patterns
par M. Boutahar 2010
119
Exemple
public interface Imath{
120
Exemple
public interface Imath{
Design Patterns
par M. Boutahar 2010
121
Exemple
public interface Imath{
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));
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 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));
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
SuperSizeSoda
MediumSoda
OrangeSodaG
OrangeSodaM
CitronSodaM
CitronSodaG
ColaSodaG
ColaSodaM
Design Patterns
par M. Boutahar 2010
127
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
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
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
Design Patterns
par M. Boutahar 2010
139
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
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 :
Design Patterns
par M. Boutahar 2010
146
Facade
Design Patterns
par M. Boutahar 2010
147
Facade
Design Patterns
par M. Boutahar 2010
148
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
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
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
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
description
supFrom
supSauce
supHuile
supVh
SupPoulet
supPoisson
getDescription()
prix()
getSupFrom()
setSupFrom()
getSupSauce()
setSupSauce()
....
Design Patterns
par M. Boutahar 2010
162
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
Pizza4Fromage
prix()
Design Patterns
par M. Boutahar 2010
prix()
PizzaVegetarienne
prix()
163
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.
Le ConcreteDecorator a une
variable d'instance pour la chose
qu'il dcore (le composant que
le dcorateur enveloppe).
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
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
Design Patterns
par M. Boutahar 2010
174
175
Design Patterns
par M. Boutahar 2010
176
MenuItem
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
disponible
bac papier vide
Ajout encre
plusDePapier
niveauEncreBas
Design Patterns
par M. Boutahar 2010
181
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
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;
this.Salaire=Salaire; this.
Design Patterns
par M. Boutahar 2010
188
Employ:Rapport Cong
Public class Client{
Psv main(){
Int totalDays=0;
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