DesignPatterns cours.pdf
-
Upload
wajdi-sassi -
Category
Documents
-
view
308 -
download
17
description
Transcript of DesignPatterns cours.pdf
-
Les patrons de conception (Design patterns)
Riadh BEN HALIMA Wajdi LOUATI [email protected] [email protected]
1
Plan
Historique & Motivation Le patron Strategy Le patron Observer Le patron Decorator Le patron Abstract Factory Le patron Singleton Le patron Command Le patron Adapter Le patron Faade
2
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Historique
3
Notion de patron dabord apparue en architecture : larchitecture des btiments la conception des villes et de leur environnement
Larchitecte Christopher Alexander le dfinit comme suit: Chaque modle [patron] dcrit un problme qui se manifeste constamment
dans notre environnement, et donc dcrit le cur de la solution de ce problme, dune faon telle que lon peut rutiliser cette solution des millions de fois. [Livre: The Timeless Way of Building, Oxford University Press 1979]
Projeter la notion de patron du logiciel : "design pattern" premiers patrons partir de 1987 (partie de la thse de Erich Gamma) puis Richard Helm, John Vlissides et Ralph Johnson (Gang of Four, GoF) premier catalogue en 1993 : Elements of Reusable Object-Oriented Software
Vocabulaire: modles de conception= patrons de conception= motifs de conception= design
patterns
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Motivation Pourquoi dfinir des patrons de conception
Construire des systmes plus extensibles, plus robustes au changement Capitaliser lexprience collective des informaticiens Rutiliser les solutions qui ont fait leur preuve Identifier les avantages/inconvnients/limites de ces solutions Savoir quand les appliquer
Complmentaire avec les API Une API propose des solutions directement utilisables Un patron explique comment structurer son application avec une API
Patron de conception dans le cycle de dveloppement Intervient en conception dtaille Reste indpendant du langage dimplantation
4
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Dfinition Dfinition : "Un patron de conception (design pattern)
dcrit une structure commune et rptitive de composants en interaction (la solution) qui rsout un problme de conception dans un contexte particulier
Au lieu de la rutilisation de code, on parle de la rutilisation de lexprience avec les patrons
Un bon patron de conception : rsout un problme correspond une solution prouve favorise la rutilisabilit, lextensibilit, etc.
5 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Intrt et utilisation des patrons de conception La meilleure manire dutilisation des patrons de conception est de les mmoriser
en tte, puis reconnaitre leurs emplacements et les appliquer dans la conception des applications
6
Les concepts de lorient objet tels que labstraction, lhritage, et le polymorphisme ne
te rendent pas un bon concepteur! Un concepteur pense crer une conception flexible qui est maintenable et fait face aux
changements
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Ce quil ne faut pas attendre des patrons de conception
Une solution universelle prte lemploi Une bibliothque de classes rutilisables Lautomatisation totale de linstanciation dun
patron de conception La disparition du facteur humain
7 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Trois sortes de patrons
8
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 9
Le patron "Strategy"
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck: Conception (1/22)
Objectif: dveloppement dun jeu de simulation dun bassin pour les canards
Besoin: nager, cancaner, afficher, etc.. Supporter une large varit de canards
Conception: OO Une supre classe Canard (Duck) dont tous les canards hritent
10
Duck quack() swim() display()
RedHeadDuck
display()
MallardDuck
display()
Abstract
Autres types de Ducks
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Innovation (2/22) Objectif: Innovation (pour impressionner et vendre +) Besoin: simuler le vol des canards! Conception: OO
Ajouter la mthode fly() la supre classe
11
Duck quack() swim()
fly() display()
RedHeadDuck
display()
MallardDuck
display()
Modification apporte
Autres types de Ducks
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Duck quack() swim()
fly() display()
RedHeadDuck
display()
MallardDuck
display()
RubberDuck
display() quack(){ }
Hriter par tous les canards
SimUDuck : Problmes (3/22) Besoin: Au moment de la dmonstration du simulateur, on nous
demande de simuler des canards en caoutchouc
12 ? Le caoutchouc ne cancane pas
Le caoutchouc ne vole pas !
Conception: OO Ajouter la classe RubberDuck qui hrite de la supre classe Duck
Redfinir squeak
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Constat (4/22) Problme 1: Le canard en caoutchouc ne cancane pas! Solution : Redfinir la mthode quack() squeak()
(rsolu) Problme 2: Le canard en caoutchouc ne vole pas!
Toutefois, il hrite la mthode fly() de la supre classe Duck!
Constat: Ce que nous avons cru une utilisation formidable de lhritage
dans le but de la rutilisation, sest termin mal au moment de la mise jour!
Une mise jour du code a caus un effet global sur lapplication!
13 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Solution?? (5/22) Problme 2: Le canard en caoutchouc ne vole pas! Toutefois, il
hrite la mthode fly() de la supre classe Duck!
Question: est ce que cest rsolu pour tous types de canards?
RubberDuck
display() quack(){ squeak }
14
fly(){ Redfinir rien }
Solution: Redfinir la mthode fly() de RubberDuck
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Un autre canard (6/22) Nouveau type de canard: Canard en bois Problmes levs:
Ce canard ne cancane pas Ce canard ne vole pas
Solution: redfinir (une autre fois) les mthodes quack() et fly() WoodenDuck
display() quack(){ Redfinir rien } fly(){ Redfinir rien }
Inconvnients de lutilisation de lhritage Il est difficile de connaitre le comportement de tous les canards Un changement non-intentionnelle, affecte les autres canards
15 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Des interfaces? (7/X) Hypothse: On nous demande de mettre jour SimUDuck tous les 6 mois: La
spcification demeure changeante Vrifier fly() et quack() pour chaque nouveau canard R-crire (si besoin) fly() et quack()
Solution possible pour contourner le problme: les interfaces
Que dites vous de cette conception ? 16
Duck
swim() display()
MallardDuck
display() fly() quack()
RedHeadDuck
display() fly() quack()
RubberDuck
display() quack()
WoodenDuck
display()
Quackable
quack()
Flyable
fly()
Interface
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Inconvnients (8/22)
Constat: Duplication de code: mthodes fly() et quack() dans les sous-classes Autant dinterfaces tant quil y a un ensemble de canards ayant exclusivement un
comportement commun (pondre: lay() pour les canards qui peuvent dposer un uf)
Problme: si on veut modifier/adapter lgrement la mthode fly(), il faut le faire pour toutes les classes des canards (10 classes, 100, ou +)
17
Duck
swim() display()
MallardDuck
display() fly() quack()
RedHeadDuck
display() fly() quack()
RubberDuck
display() quack()
WoodenDuck
display()
Quackable
quack()
Flyable
fly()
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Moment de rflexion (9/22)
Pas toutes les sous-classes qui ont besoin de voler (fly) ou de cancaner (quack) Lhritage nest pas la bonne solution
Les interfaces Flyable et Quackable rsolvent une partie du problme Dtruit compltement la rutilisation du code pour ces
comportements La maintenance et la mise jour reprsentent un vrai calvaire
Supposant quil existe plus quune faon de voler Maintenance plus difficile
18
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Solution (10/22)
Solution: Design pattern : solution ultime, cheval blanc, sauveur
19
Donner des raisons de changement de code dans votre application
Trouvons une solution avec l"ancienne-mode" et ce en applicant les bonnes principes de la conception OO Concevoir une application, ou un besoin de
modification/changement peut tre appliqu avec le moindre possible dimpact sur le code existant
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Rgle 1: Identifier les aspects variables de mon application et les sparer de ce qui reste invariant
SimUDuck : Principe de conception (11/22)
Cest la base de tous les patrons de conception Systme plus flexible+peu de consquences inattendues
Mise en uvre Prendre la partie qui varie et lencapsuler. De cette faon, un changement ultrieur affecte la partie variable, sans toucher celle invariable
20
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Sparation (12/22)
21
La classe Duck est toujours la supre classe Les comportements fly() et quack() sont retirs, et mis dans une
autre structure
Duck class Le comportement Fly
Le comportement Quack
Mettre dehors ce qui varie Comportements
Invariable Variable
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Rgle 2: Programmer des interfaces, et non des implmentations
Conception initiale: linflexibilit des comportements a engendr des troubles
On veut affecter les comportements aux instances des Ducks tout en permettant: La cration dune instance (MallardDuck), Linitialisation avec un type de comportement (type de vol) La possibilit de changer le type de vol dynamiquement (?)
SimUDuck : Conception des comportements (13/22)
22
Programmer pour les super-types! On utilise des interfaces pour reprsenter chaque
comportement: FlyBehavior et QuackBehavior
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Conception des comportements (14/22)
23
FlyWithWings
fly() { //vol }
Quack
quack(){ //quack }
QuackBehavior
quack()
FlyBehavior
fly()
FlyNoWay
fly() { //rien-ne vol pas }
Squeak quack(){ //squeak //rubber }
MuteQuack quack(){ //rien-ne //cancane pas }
Consquences: On peut ajouter un nouveau comportement sans modifier ni le code des
comportements existants, ni le code des classes des canards qui utilisent les comportements voler/cancaner
Avec cette conception, dautres objets peuvent rutiliser le comportement fly et quack, parce quils ne sont plus cachs dans les classes canards.
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Intgration des comportements(15/22)
24
La supre classe Duck, dont hrite tous les canards
Duck
FlyBehavior fbehavior; QuackBehavior qbehavior;
performQuack() swim() display() performFly() //.
Variable dinstance du type INTERFACE
Ces mthodes remplacent quack() et fly()
La cl: le canard dlgue les comportements fly et quack, au lieu dutiliser les mthodes fly() et quack() dfinies dans la supre classe Duck.
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Implmentation de la supre classe(16/22)
25
La supre classe Duck, dont hrite tous les canards
public class Duck{ QuackBehavior qbehavior; FlyBehavior fbehavior; // public void performQuack(){ qbehavior.quack(); } //.. }
Chaque type de canard initialise ces attributs selon ses besoins. (par FlyWithWings pour le MallardDuck )
Grace au polymorphisme, la bonne mthode sera invoque dans la sous-classe du type de canard. (Dlgue la classe grant le comportement)
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Implmentation dun canard (17/22)
26
public class MallardDuck extend Duck{ public MallardDuck (){ fbehavior = new FlyWithWings(); qbehavior = new Quack(); } public void display(){ System.out.println("Je suis un canard Mallard"); } }
Initialisation des attributs dclars dans la supre classe Duck
Cette classe inclut les mthodes ralisant le comportement fly et quack, par hritage (performQuack(), etc..)
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Tester le code du canard(18/22) Dvelopper et compiler [Utiliser NetBeans/Eclipse]:
La classe abstraite Duck (Duck.java) Le comportements: FlyBehavior.java, FlyWithWings.java et
FlyNoWay.java,
Le comportement : QuackBehavior.java, Quack.java, Squeak.java et MuteQuack.java
Les classes MallardDuck.java et WoodenDuck.java Tester toutes les mthodes des canards crs dans un main:
MallardDuckSim.java
27 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Le comportement dynamique (19/22)
Changement dynamique de comportement Ajouter les mthodes: setFlyBehavior() et setQuackBehavior() Dvelopper le canard RedHeadDuck (RedHeadDuck.java) Implanter le nouveau comportement "vole-force-fuse"
FlyRocketPowered (FlyRocketPowered.java) Tester le nouveau canard dans un main RedHeadSim.java Changer le comportement "voler" de FlyWithWings
FlyRocketPowered. Penser utiliser le setter afin dobtenir ces deux affichages: "Je peux voler" & "Je vole comme une fuse"
Donner (et ne pas implmenter) les modifications faire afin dajouter le comportement manger: eat() 28
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : La conception finale (20/22)
29
FlyWithWings
fly() { //vole }
FlyBehavior
fly()
FlyNoWay
fly() { //ne vole pas }
Quack
quack(){ //quack }
QuackBehavior
quack()
Squeak quack(){ //squeak //rubber }
MuteQuack quack(){ //rien-ne //cancane pas }
Duck
QuackBehavior qbehavior; FlyBehavior fbehavior;
performQuack() swim() display() performFly() setFlyBehavior() setQuackBehavior() \\autre mthodes
WoodenDuck display(){ \\canard en bois }
MallardDuck display(){ \\canard Mallard }
extends
implements
implements
Algorithmes interchangeables Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Composition/Hritage (21/22)
30
Has-a: liaison intressante Chaque canard possde un FlyBehavior et QuackBehavior qui
dlgue flying et quacking Composition (mettre les 2 classes ensemble) Encapsuler une famille dalgorithmes dans leur propre ensemble
de classes Remplacer lhritage pour favoriser le changement dynamique du
comportement
Rgle 3: Favoriser la composition sur lhritage
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
SimUDuck : Notre premier patron (22/22)
31
Notre premier patron: STRATEGIE
Le patron stratgie cherche principalement sparer un objet de ses comportements/algorithmes en encapsulant ces derniers dans des classes part.
Pour ce faire, on doit alors dfinir une famille de comportements ou dalgorithmes encapsuls et interchangeables.
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 32
Les avantages du patron
Si les algorithmes/comportements sont dans une classe a part,
il est beaucoup plus facile de: se retrouver dans le code principale enlever, ajouter et modifier un algorithme/comportement diminuer lutilisation de tests conditionnels liminer la redondance et le couper/coller accrotre la rutilisabilit du code ainsi que sa flexibilit
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 33
Limplmentation du patron
Pour implmenter le patron Strategy on doit: 1. Dfinir une interface commune tout les algorithmes ou
comportements de mme famille. Ceci ce fait habituellement en crant une classe abstraite.
2. Crer les classes comportant les algorithmes ou les comportements partir de linterface commune.
3. Utiliser la stratgie voulue dans le code de lobjet.
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 34
Reprsentation du patron
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Bases de lOO: Abstraction, Encapsulation, Polymorphisme & Hritage
Principes de lOO Encapsuler ce qui varie Favoriser la composition sur lhritage Programmer avec des interfaces et non des implmentations
Patron de lOO (stratgie) Le patron stratgie dfinit une famille dalgorithmes, les
encapsule, et les rend interchangeable. Ce patron laisse lalgorithme varier indpendamment du client quil lutilise.
Rcapitulatif (1/2)
35 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Connaitre les bases de lOO ne fait pas de toi un bon concepteur Les meilleurs conception OO sont rutilisable, flexible et
maintenable Les patrons nous guident construire des systmes avec les bonnes
qualits de la conception OO Les patrons sont des expriences prouves dans lOO Les patrons ne donnent pas de code, mais plutt des solutions
gnrales pour des problmes de conception Les patrons de sont pas invents, mais dcouverts La majorit des patrons et des principes adresses les problmes de
changement dans le logiciel On essaie toujours de prendre ce qui varie des systmes et on
lencapsule Les patrons offrent un langage partag qui peut maximiser la valeur
de la communication avec les autres dveloppeurs
Rcapitulatif (2/2)
36
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Exercice (1/2) Ci-dessous, on donne lensemble de classes et interfaces dun jeu
daction et daventure. Il y a des classes dindividus avec des classes pour les comportements darmes que les individus peuvent utiliser. Chaque individu peut utiliser une seule arme la fois, mais peut la changer tout moment durant le jeu. La tche demande est dordonner le tout.
37
ComportementArme arme; combattre() Display ()
Individu
Display(){.}
Reine Display(){.}
Archer
Display(){.}
Chevalier
UtiliseArme(){\\abattre avec couteau }
ComportementCouteau
UtiliseArme(){\\abattre avec arc et flche}
ComportementArc&Fleche
UtiliseArme();
ComportementArme
UtiliseArme(){\\abattre avec pe}
ComportementEpee
setArme(ComportementArme ca) { this.arme=ca; }
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Exercice (2/2) 1. Arranger les classes 2. Identifier les classes, les classes abstraites des interfaces 3. Relier les entits pas des flches ou:
1. reprsente extends 2. reprsente implements 3. reprsente has-a
4. Mettre la mthode setArme() dans la classe correspondante
5. Implmenter et tester cette conception dans un main. Penser changer dynamiquement le comportement de larcher aprs avoir finir ces arcs.
38
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le patron "Observer"
39 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Station mto: Spcification (1/14)
40
Objectif: Construire une nouvelles gnration de stations dobservation mto sur Internet
Besoin: Afficher les conditions courantes, les statistiques mtorologique et les prvisions mto. Poursuivre les conditions mtorologiques (Temprature,
Humidit, Pression, etc.) On veut mettre en uvre une API (ENIS-METEO) de faon
que dautres dveloppeurs peuvent crire leur propre afficheur de mto.
Conception: OO Une classe WeatherData qui rcupre les donnes de la station
mto (ENIS-METEO) et les offre aux afficheurs.
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Station mto: Analyse (2/14)
41
Il faut crer une application qui utilise lobjet WeatherData afin de mettre jour trois afficheurs: les conditions courantes, les statistiques mtorologiques & les prvisions mto.
Weather Station
Capteur dhumidit
Capteur de temprature
Capteur de pression
WeatherData Object Conditions
courantes
Afficher
Tirer (pull)
Le fournisseur ENIS-METEO A implmenter
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Station mto: Conception (3/14)
42
Nous allons dvelopper trois afficheurs: conditions courantes (CurrentConditionsDisplay.java) statistiques mtorologique (StatisticsDisplay.java) prvisions mto (ForecastDisplay.java)
Rq: On ne sintresse pas la manire dont les variables sont fixes. On suppose que lobjet WeatherData connait comment les mettre jour partie de la station ENIS-METEO
WeatherData
getTemperature() getHumidity() getPressure() measurementChanged() \\autre mthodes
Cette mthode sera appele chaque fois quon met jour les mesures
Ces trois mthodes retournent les mesures les plus rcentes
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
public class WeatherData
{
//attributs void setMeasurement(){
float temperature = getTemperature();
float humidity = getHumidity()
float pressure = getPressure()
currentConditionsDisplay. update(temperature, humidity, pressure);
statisticsDisplay. update(temperature, humidity, pressure); forecastDisplay. update(temperature, humidity, pressure);
}
//autres mthodes }
Station mto: Une solution possible (4/14)
43
Rcuprer les mesures les plus rcentes
Mettre jour les afficheurs avec les nouvelles mesures
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Station mto: Constat (5/14) Problme : En codant des implmentations concrtes, on ne peut pas
ajouter/supprimer dautres afficheurs, sans faire un changement du programme! Rq: on peut au moins utiliser une interface qui contient la
mthode update(). Solution : le patron observer Exemple:
1. Une maison ddition commence ldition dun journal 2. Vous vous inscrivez ce journal, et pour chaque nouvelle
dition, vous recevez votre copie 3. Vous vous dsinscrivez lorsque vous ne voulez plus recevoir
des journaux 4. Les gens, les htels etc. peuvent constamment sinscrire et se
dsinscrire ce journal.
44
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Station mto: Publier/Souscrire= Patron Observer (6/14)
45
Les objets Observers
Lorsque les donnes du sujet changent, les observateurs sont notifis
2
2
Les observers sont inscrits au Sujet afin de recevoir les mise jour
Lobjet Sujet gre des octets de donnes
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Station mto: Patron Observer : Sinscrire (7/14)
46
Les objets Observers
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Station mto: Patron Observer : Notification(8/14)
47
8
8
Maintenant, le Mouse est un observer, il reoit les notifications du Sujet
Les objets Observers
8
Nouvel entier
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Station mto: Patron Observer : Dsinscrire (9/14)
48
Les objets Observers
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Station mto: Patron Observer : Notification (10/14)
49
Les objets Observers
12
12
Maintenant, le Dog nest plus un observer, il ne reoit plus les notifications du Sujet
Nouvel entier
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Station mto: Le patron Observer (11/14) Dfinition:
Le patron observer dfinit une dpendance 1--plusieurs entre des objets de faon que chaque changement de ltat de lobjet, tous ces dpendants sont notifis et mis jour automatiquement.
50
Observer
8
8
Les objets Observers
8
Mise jour/notification automatique
1--plusieurs Les objets dpendants Lobjet qui tient les mises jours
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le ConcreteSubject hrite toujours de linterface Subject. Il implmente la mthode notifyObservers() qui est sense mettre jour lobserver quand ltat change.
Station mto: Diagramme de classes du patron (12/14)
51
Subject
registerObserver() removeObserver() notifyObservers()
Observer
Update()
observers
ConcreteSubject
registerObserver(){} removeObserver() {} notifyObservers() {} getState() setState()
ConcreteObserver
Update() //autres mthodes
subject
Les objets utilisent cette interfaces pour sinscrire comme observer et aussi se dsinscrire
Chaque Subject possde un tableau dobservers
Tous les observers potentiels doivent implmenter linterface "Observer"
Toutes classes qui implmente lobserver est un observer concret. Chaque observer concret sinscrit auprs dun sujet concret pour recevoir lupdate
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Station mto: La puissance du couplage faible (13/14) Deux objets, qui sont faiblement coupls, entrent en interaction
avec trs peu de connaissance de lun envers lautre. Le patron Observer permet de raliser une conception ou le
Subject et lObserver sont faiblement coupls Couplage faible : plus dindpendance et de flexibilit
La seule chose que le Subject a besoin de connaitre sur lObserver est quil implmente une certaine interface.
On peut ajouter/remplacer/supprimer un observer tout moment sans toucher au Subject
On peut rutiliser le Subject ou lObserver facilement parcequil ne sont pas fortement coupls.
La modification du Subject ou de lObserver naffecte pas lautre classe
52
Rgle 4: Opter pour une conception faiblement couple entre les objets qui interagissent
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Station mto: La conception finale (14/14)
53
Subject
registerObserver() removeObserver() notifyObservers()
Observer
update()
observers
WeathetData
registerObserver(){} removeObserver() {} notifyObservers() {} getTemperature() getHumidity() getPressure() measurementChanged()
subject
DisplayElement
display()
Les trois afficheurs pointent sur le WeatherData afin de permettre leur inscription et leur dsinscription
CurrentConditionsDisplay
update() display()
ForecastDisplay
update() display()
StatisticsDisplay
update() display()
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le Patron Observateur
54
Le patron de conception observateur/observable est utilis pour envoyer un signal des modules qui jouent le rle d'observateur.
En cas de notification, les observateurs effectuent alors l'action adquate en fonction des informations qui parviennent depuis les modules qu'ils observent (les "observables").
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Bases de lOO: Abstraction, Encapsulation, Polymorphisme & Hritage
Principes de lOO Encapsuler ce qui varie Favoriser la composition sur lhritage Programmer avec des interfaces et non des implmentations Opter pour une conception faiblement couple entre les objets
qui interagissent Patron de lOO
Strategy: dfinit une famille dalgorithmes interchangeables Observer: dfinit une dpendance1--plusieurs entre objets, de
faon que pour chaque changement de ltat dun objet , ses dpendants sont notifis et mis jour automatiquement.
Rcapitulatif (1/2)
55 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le patron observer dfinit une relation 1--plusieurs entre objets.
Le Subject/Observable met jour les observers travers une interface commune.
Lobserver est faiblement coupl avec le Subject. Ce dernier ne connait rien deux part quils implmentent linterface Observer.
On peut rcuprer les donnes du Subject en mode pull/push. (Le Subject fait le push, semble plus correct)
On ne dpend pas dun ordre spcifique de notification entre les observers
Java possde plusieurs implmentations de ce patron
Rcapitulatif (2/2)
56
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Exercice 1. Appliquer le patron Observer sur lapplication station mto en se
basant sur les implmentations du Subject et de lObserver offertes par Java :
java.util.Observable : Subject du patron (Attention! Il sagit dune classe) java.util.Observer : Observer du patron
57
Observable
addObserver(Observer o) deleteObserver(Observer o) notifyObservers(Object arg) setChanged()
Observer
update(Observable o, Object arg)
Pour dire explicitement que ltat de lobservable a chang. Elle ne fait pas la notification.
Ou o est utilis pour rcuprer le message, et arg est un argument passer lobserver (mettez le null, si pas besoin de passer un argument) Il sagit dune classe. Les mthodes
offertes sont dj implmentes.
2. Expliquer comment Java utilise le patron observer pour la gestion des vnements sur les interfaces graphiques.
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Exercice (1/2) Les mthodes getSecondes, getMinutes et getHeures permettent daccder aux
valeurs des secondes, minutes et heures respectivement. La classe Chrono est une classe concrte implantant linterface de la classe AbstractChrono. Lorsquune seconde passe (tick()), les Displays doivent afficher les heures, les minutes et les secondes et les Sonneries doit faire entendre un tintement chaque heure.
58
AbstractChrono
getSecondes() getMinutes() getHeures() tick()
int secondes; int minutes; int heures;
Sonnerie2
ding()
DisplayNumerique
afficheTempsEcoule()
Chrono DisplayAiguille
afficheTempsEcoule()
Sonnerie1
ding()
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Exercice (2/2) Utiliser le pattern Observer pour dfinir les interactions entre Chrono, Display et
Sonnerie
Donnez le diagramme de classes et limplmentation.
public static void main(String[] args) { Chrono c=new Chrono();
Sonnerie_Observer S1=new Sonnerie1(c);
Sonnerie_Observer S2=new Sonnerie2(c);
Display_Observer D1= new DisplayNumerique(c);
Display_Observer D2= new DisplayAiguille(c);
for(int i=1;i
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
StarCoffee : Spcification (1/10)
61
Objectif: Mettre en uvre un systme de gestion des offres de boisson pour la clientle de StarCoffee
Besoin: Dcrire les ajouts en extra, et calculer le prix total Th, Th--la-menthe, Th--la-mente-aux-pignons, etc.. Caf, Caf-au-Lait, Caf-au-Lait--la-mousse, etc..
Conception: OO Concevoir une supre classe Boisson que toutes les autres
classes hritent. Dfinir autant de classes quil y en a de types de boissons :
Beverage.java, Coffee.java, CoffeeWithMilk.java, CoffeeWithMilkWithWhip.java, Tea.java, TeaWithMint.java, TeaWithMintWithPine.java, etc.
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
StarCoffee : Conception (2/10)
62
Description getDescription() cost()
Beverage
Coffee
cost()
CoffeeWithMilk
cost()
CoffeeWithMilk WithWhip
cost()
Tea
cost() TeaWithMint
cost() TeaWithMintWit
hPine cost()
Chaque sous classe implmente la mthode cost() qui reprsente le prix du boisson
Mthode abstraite dfinir dans les classes drives
Retourne la description
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
StarCoffee : Problme (3/10) Problme : En plus des deux produits prsents prcdemment,
StarCoffee offre une varit dautres boissons et condiments: (Si on offre 2 types de Th, on doit ajouter plusieurs autres classes (selon les condiments possibles), etc. Constat: clatement du diagramme de classes par un nombre ingrable
de classes
63
Description Milk Mint Pine Whip getDescription() cost() hasMilk() setMilk() hasMint() setMint() hasPine() setPine() hasWhip() setWhip
Beverage
Solution : Utiliser des variables dinstance dans la supre classe qui reprsenteront les condiments (pignon, mousse, lait, menthe).
Des boolans
Des get et set pour les booleans des condiments
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
StarCoffee : Nouvelle conception (4/10)
64
Description Milk Mint Pine Whip getDescription() cost() hasMilk() setMilk() hasMint() setMint() hasPine() setPine() hasWhip() setWhip()
Beverage
Coffee
cost()
Tea
cost()
Dans chaque classe drive, on ajoute les condiments (set), puis cest la mthode cost() qui calcule le prix total (en vrifiant avec has)
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
cost()
StarCoffee : Un boisson dcor (5/10)
65
cost() La classe Tea hrite de Beverage et possde une mthode cost() qui calcule le prix du boisson
1. On commence par lobjet Tea
2. Le client choisit la menthe, alors on cre un objet Mint qui enveloppe le Tea
cost() cost()
Lobjet Mint est un dcorateur. Son type est un miroir de lobjet quil dcore (Beverage).
Lobjet Mint possde une mthode cost() et travers le polymorphisme, on peut traiter chaque Beverage envelopp dans le Mint comme un Beverage aussi.
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Lobjet Pine est un dcorateur, donc il est un miroir du type Tea et inclut une mthode cost()
Lobjet Tea, envelopp dans un Mint et un Pine, reste toujours un Beverage. Alors on peut faire avec lui ce quon peut faire avec les Beverage, y compris linvocation de sa mthode cost()
cost()
StarCoffee : Un boisson dcor (6/10)
66
cost() cost()
3. Le client veut aussi des pignons, alors on cre un objet Pine qui emballe le Mint
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
cost() cost() cost()
Invocation de la mthode cost() du dcorateur extrieur
StarCoffee : Le cot du boisson dcor (7/10)
67
Lide est de calculer le cot en partant du dcorateur le plus extrieur (Pine) et puis, ce dernier dlgue le calcul lobjet dcor, etc.
0.500 0.200 0.300
1.000
Pine appelle cost() de Mint Mint appelle cost() de Tea
Tea retourne son prix: 0.500 Mint ajoute son prix au rsultat de cost() de Tea, et retourne le nouveau total: 0.700
Pine ajoute son prix au rsultat de Mint, et retourne le rsultat total: 1.000
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
StarCoffee : Le patron Decorator (8/10)
68
Dfinition: Le patron decorator attache des responsabilits
additionnelles un objet dynamiquement. Les dcorateurs offrent une alternative flexible de sous-classement afin dtendre les fonctionnalits.
Decorator
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
StarCoffee : Le diagramme de classes du patron(9/10)
69
Component
methodA() methodB() //autres mthodes
Decorator
methodA() methodB() //autres mthodes
ConcreteComponent
methodA() methodB() //autres mthodes
Chaque dcorateur possde un composant, qui veut dire que le dcorateur possde un attribut qui contient une rfrence dun composant
Chaque composant peut tre utilis lui seul, ou envelopp dans des dcorateurs
Les dcorateurs implmentent la mme interface (ou classe abstraite) que lobjet quils dcoreront
ConcreteDecoratorA
methodA() methodB() Newbehavior() //autres mthodes
Component WrappedObj
ConcreteDecoratorB
methodA() methodB() //autres mthodes
Component WrappedObj Object newState
Le ConcreteDecorator possde un attribut qui reprsente lobjet quil dcore. Il peut ajouter ses propres mthodes et attributs.
Le ConcreteComponent est lobjet quon va lui ajouter dynamiquement des nouveaux comportements. Il tend lobjet Component.
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
StarCoffee : La conception finale (10/10)
70
CondimentDecorator
getDescription();
Component
Milk
cost()
Beverage beverage
Beverage
getDescription() cost(); //autres mthodes
description
Coffee cost()
Tea cost()
Mint
cost()
Beverage beverage
Pine
cost()
Beverage beverage
Whip
cost()
Beverage beverage
Beverage agit comme notre classe abstraite component
Les deux composants concrets, 1 par type de boisson
Le constructeur du dcorateur prend le boisson dcorer en entre et retourne le boisson dcor.
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Bases de lOO: Abstraction, Encapsulation, Polymorphisme & Hritage Principes de lOO
Encapsuler ce qui varie Favoriser la composition sur lhritage Programmer avec des interfaces et non des implmentations Opter pour une conception faiblement couple Les classes doivent tre ouvertes pour les extensions et fermes pour
les modifications Patron de lOO
Strategy: dfinit une famille dalgorithmes interchangeables Observer: dfinit une dpendance1--plusieurs entre objets. decorator: attache des responsabilits additionnelles un objet
dynamiquement. Les dcorateurs offrent une alternative flexible de sous-classement afin dtendre les fonctionnalits.
Rcapitulatif (1/2)
71 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Lhritage est une forme dextension, mais il nest pas ncessairement la meilleure manire pour obtenir la flexibilit dans notre conception
Le patron decorator implique un ensemble de classes de dcorations qui sont utilises pour envelopper les composants concrets.
Les classes dcorateurs refltent le type de composant quils dcorent.
Les dcorateurs changent le comportement de leurs composants tout en ajoutant des nouvelles fonctionnalits aprs/avant (ou la place de) lappel des mthodes des composants
On peut envelopper un composant dans nimporte quel nombre de dcorateurs
Les dcorateurs sont transparents par rapport au client du composant
Rcapitulatif (2/2)
72
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Exercice (1/3) 1. Comment faire pour obtenir un caf avec "double mousse"? 2. StarCoffee a ajout un nouveau boisson (Citronnade) au systme,
comment procder pour linclure dans la conception actuelle? 3. StarCoffee veut introduire des tailles pour ses menus: SMALL,
MEDIUM et LARGE. Comment prendre en charge cette nouvelle spcification, si la taille modifie seulement les prix des composants concrets?
73 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Exercice (2/3) Avec le patron decorator, le package java.io doit donner plus de
sens, puisquil se base largement sur ce patron.
74
FileInputStream est un composant dcor. Le package java.io offre plusieurs objets pour la lecture des octets: FileInputStream, StringBufferInputStream, ByteArrayInputStream, etc.
BufferedInputStream est un dcorateur concret. Il ajoute deux comportements: (i) il tamponne les entres afin damliorer la performance, et (ii) ajoute la mthode readLine() pour lire une ligne de caractres la fois.
LineNumberInputStream est aussi un dcorateur concret. Il ajoute la capacit de compter les nombres de lignes en lisant les donnes.
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Exercice (3/3): Dcoration de java.io 1. Ecrire un dcorateur qui convertit tous les caractres majuscules
en minuscules dans le flux dentre (InputStream).
75
InputStream
FileInputStream StringBufferInputStream
BufferedInputStream PushBackInputStream
LineNumberInputStream
ByteArrayInputStream
DataInputStream
Abstract Component
Abstract Decorator
Decorator
Conctrete Component
FilterInputStream
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Lobjectif de cet exercice est de mettre en uvre un systme flexible de gestion des offres de voiture pour la clientle de StarCar. Le besoin de cette socit se rsume dcrire les options demandes par le client (VitreElectrique, AirBag et ABS) et inclure son cout au prix total de la voiture choisie. Deux types de voiture sont grs par la socit, savoir, camionnette et berline. Chaque voiture est caractrise par un cout et une description textuelle. Le prix de chaque type de voiture ainsi que celui de chaque option est fixer au moment de la cration.
En utilisant le patron Decorator, donnez le diagramme de classes de lapplication CarStar. (Prcisez les mthodes et les attributs, correspondant au bout de code ci-dessous) 76
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
public static void main(String[] args) {
Voiture v1=new Camionnette ("P404",10000);
Voiture v2=new Berline ("P407",20000);
v1=new ABS(v1, 800);//800 reprsente le prix de loption ABS
v2=new VitreElectrique(v2, 1000); // 1000 reprsente le prix de loption
v2=new AirBag(v2, 1200); // 1200 reprsente le prix de loption
System.out.println("La voiture est une "+v1.getDescription());
//affiche: La voiture est une P404 avec ABS
System.out.println("Son prix est:"+ v1.cost());
//affiche: Son prix est 10800
System.out.println("La voiture est une "+v2.getDescription());
//affiche: La voiture est une P407 avec VitreElectrique, AirBag
System.out.println("Son prix est:"+ v2.cost());
//affiche: Son prix est 22200
77 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le patron "Adapter"
78
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le patron adapter : Les adaptateurs (1/7)
79
Cble American du PC Prise Europenne Adaptateur
Ladaptateur convertit une interface une autre
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Classe du vendeur
Mme code
Le patron adapter : Les adaptateurs dans lOO (2/7)
80
Notre systme existant
Classe du vendeur
Linterface ne correspond par ce quon a dj cod. a ne va pas march! (supposant quon ne peut pas changer de vendeur)
Adaptateur
Nouveau code Mme code
Notre systme existant
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le patron adapter : Dinde et Canard (3/7)
81
Supposant que le dinde marche et cancane comme le canard
interface Duck{ void quack(); void fly(); }
class MallardDuck implements Duck{ public void quack(){ System.out.println("Quack");} public void fly(){ System.out.println("Fly");}
}
interface Turkey{ void gobble(); void fly(); }
Un canard peut cancaner et voler Une simple implmentation du comportement du canard
Le dinde ne cancane pas, mais glougloute
Le dinde peut voler (courte distance)
class WildTurkey implements Turkey{ public void gobble(){ System.out.println("Gobble");} public void fly(){ System.out.println("Fly for a short distance");}
} Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le patron adapter : Ladaptateur du dinde(4/7)
82
Supposons quon a un manque de canards et on va utiliser des dindes leur pace Il faut crire un "adapter"
Respecter linterface des canards
Translation des mthodes
class TurkeyAdapter implements Duck{ Turkey turkey; TurkeyAdapter(Turkey turkey){ this.turkey=turkey;} public void quack(){ } public void fly(){ } }
turkey.gobble();
for(int i=0;i
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le patron adapter (6/7)
85 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Adapter : Le diagramme de classes du patron (7/7)
86
Client
Adapter
Request()
Target
Request() LAdapter implmente linterface Target
Adaptee
specificRequest()
Le client voit seulement linterface Target.
Ladapter est compos dun Adaptee
Toutes les requtes sont dlgues Adaptee
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le patron "Faade"
87 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
88
Screen
up() down()
Amplifier
tuner dvdPlayer . on() off() setCD() setDVD()
Tuner
on() off() setAm() setFM()
amplifier DVDPlayer
on() off() play() stop() pause()
amplifier
Le patron Facade: Dmarrer un home-cinma (1/4)
Et bien dautres classes
Dmarrer le HC: baisser la lumire allumer lcran dmarrer lampli dmarrer le DvDplayer le brancher avec lmpli jouer le DvD etc..
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 89
Le patron Facade: Les classes dun Home cinma (2/4)
Screen
up() down()
Amplifier
tuner dvdPlayer .
on() off() setCD() setDVD()
Tuner
on() off() setAm() setFM()
amplifier
DVDPlayer
on() off() play() stop() pause()
amplifier
CDPlayer
on() off() play() stop() pause()
amplifier Projector
on() off()
HomeCinema
WatchTV() WatchDVD() .
La Faade: une nouvelle classe pour le HomeCinema avec peu de mthode
La classe Faade traite les composants du HomeCinema comme des sous-systmes quil invoque pour implmenter ses mthodes
WatchDVD()
Le client invoque les mthodes sur la Faade
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le patron faade (3/4)
90
Dfinition: Le patron Faade prsente une interface unifie pour un
ensemble de sous-interfaces dans un systme. La faade dfinit une interface de haut niveau qui rend facile lutilisation du systme.
Faade
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Faade: Le diagramme de classes du patron (4/4)
91
Client Faade
Une interface unifie et simple utiliser
Les classes des sous-systmes
Systmes complexes
Un client heureux car son travail devient facile grce la faade
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Testons nos connaissances!
92
Patron Rle
Decorator Convertit une interface en une autre
Adapter Ne modifie pas linterface, mais ajoute des responsabilits
Facade Rend les interfaces simples
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le patron "Singleton"
93 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Singleton : Spcification (1/12)
94
Objectif: Crer un type dobjet pour lequel on cre seulement une seule instance
Cest le patron ayant le diagramme de classes le plus simple Il y a plusieurs objets dont on a besoin dune seule instance:
pool dimpression, boite de dialogue, objet qui manipule les prfrences, objet de logging, objet agissant comme pilote de carte graphique/imprimante
La cration de plus dune instance de ces objets est une source de problme, telle que la sur-utilisation des ressources, des comportements incorrectes de programme, des rsultats inconsistants, etc.
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Singleton : Crer un singleton (2/12)
95
Comment crer un seul objet?
public class MonObjet{ private MonObjet() {} }
Cest une classe qui ne peut pas tre instancie, car elle possde un constructeur priv
Et si un autre objet veut crer un MonObjet? Est-ce quil peut appeler new sur MonObjet une autre fois?
Pour toute classe, est ce quon peut linstancier plus quune fois?
Que signifie ce code ?
New MonObjet()
Oui
Oui (il faut que la classe soit publique)
Qui peut utiliser ce constructeur? Le code de MonObjet est le seul code qui peut lappeler (dans une mthode)
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Singleton : Crer un singleton (3/12)
96
Comment je peux appeler cette mthode (pour crer une instance) si je nai pas dinstance?
public class MonObjet{ public static MonObjet getInstance() { } }
Cest une mthode statique qui peut tre appele partir du nom de la classe : MonObjet.getInstance()
Que signifie ce code. static
Si on met les choses ensemble, est ce quon peut instancier MonObjet? public class MonObjet{
private MonObjet(){ } public static MonObjet getInstance() { return new MonObjet(); } }
Comment faire pour crer une seule instance?
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 97
public class Singleton { private static Singleton uniqueInstance; private Singleton() {} public static Singleton getInstance(){ if (uniqueInstance == null) uniqueInstance = new Singleton(); return uniqueInstance; } public static void main(String args[]) { Singleton s= Singleton.getInstance(); }
}
Cette mthode nous offre une manire pour instancier la classe Singleton
Nous avons une variable statique pour stocker notre instance
Singleton : Implmentation du patron (4/12)
Le constructeur est dclar priv. Seulement la classe Singleton qui peut instancier cette classe
Si uniqueInstance nest pas nul, a veut dire quelle a t cre prcdemment
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 98
public class ChocolateBoiler{ private boolean empty; private boolean boiled; public ChocolateBoiler() { empty=true; boiled=false; } public void fill(){ if (empty){ //remplir la casserole avec du lait/chocolat empty=false; boiled=false; } } public void drain(){ if (!empty && boiled){ //vider la casserole empty=true; } } public void boil(){ if (!empty && !boiled){ //faire bouillir boiled=true; } }
}
Le code dmarre lorsque la casserole est vide
Singleton : Lusine de chocolat (5/12)
Pour remplir la casserole, elle doit tre vide. Lorsquelle est pleine, on met empty false.
Pour vide la casserole, elle doit tre pleine et dj mixe. une fois vide, on met empty true.
Pour mixer le contenu de la casserole, elle doit tre pleine et non dj mixe. Lorsquelle est pleine, on met boiled true.
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 99
public class ChocolateBoiler { private boolean empty; private boolean boiled; private static ChocolateBoiler uniqueInstance; private ChocolateBoiler() { empty=true; boiled=false; } public static ChocolateBoiler getInstance() { if (uniqueInstance == null) uniqueInstance = new ChocolateBoiler(); return uniqueInstance; } //reste du code
}
Singleton : Lusine de chocolat (6/12)
Amliorer le code de lusine de chocolat en le transformant en Singleton
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Singleton : Le patron Singleton(7/12)
100
Dfinition: Le patron Singleton assure une seule instance pour une
classe, et offre un point daccs global cette classe.
Singleton
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Singleton: Le diagramme de classes du patron (8/12)
101
La variable de classe uniqueInstance tient la seule instance du Singleton
La mthode getInstance() est statique. Cest une mthode de classe quon peut y accder partout dans le code avec Singleton.getInstance(). Il sagit dune instanciation facile de cette classe
- static uniqueInstance //autre donnes utiles
+ static getInstance() //autre mthodes utiles
Singleton
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 102
Singleton : Problme des threads (9/12)
Supposant que nous avons deux threads qui vont excuter la mthode getInstance(). Est-ce quil y a un cas o on cre 2 instances?
return uniqueInstance;
if (uniqueInstance == null)
uniqueInstance = new ChocolateBoiler();
Thread-1 Thread-2 Valeur de UniqueInstance
public static ChocolateBoiler getInstance()
public static ChocolateBoiler getInstance()
if (uniqueInstance == null)
uniqueInstance = new ChocolateBoiler(); return uniqueInstance;
null
null
null
null
Object1
Object1
Object2
Object2
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
public class Singleton { private static Singleton uniqueInstance; private Singleton() {} public static synchronized Singleton getInstance(){ if (uniqueInstance == null) uniqueInstance = new Singleton(); return uniqueInstance; } //autre mthodes utiles
}
103
Singleton : Gestion du multi-threading (10/12)
Solution 1: synchroniser laccs la mthode getInstance()
Un seule thread peut accder, la fois, cette mthode
Inconvnient: synchronized rduit la performance dun facteur de 100 Si la mthode getInstance() nest pas critique pour notre application, on peut
se contenter de cette solution
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
public class Singleton { private static Singleton uniqueInstance = new Singleton(); private Singleton() {} public static Singleton getInstance(){ return uniqueInstance; } //autre mthodes utiles
}
104
Singleton : Gestion du multi-threading (11/12)
Solution 2: cration au moment de la dfinition de la variable de classe
Il y a dj une instance, il faut juste la retourner
La JVM cre une instance de Singleton lors du chargement de la classe. La JVM garantit que linstance va tre cre avant que les threads accdent la variable statique uniqueInstance.
Initialisation par le JVM avant accs des threads
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
public class Singleton { private volatile static Singleton uniqueInstance; private Singleton() {} public static Singleton getInstance(){ if (uniqueInstance == null) { synchronized(Singleton.class) { if (uniqueInstance == null) uniqueInstance = new Singleton(); } } return uniqueInstance; } //autre mthodes utiles
}
105
Singleton : Gestion du multi-threading (12/12)
Solution 3: rduire lutilisation de la synchronisation dans getInstance()
On synchronise seulement la premire fois
Le mot cl volatile assure que les threads grent la variable uniqueInstance correctement au moment de son initialisation
*volatile: inclus java depuis jdk5
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Bases de lOO: Abstraction, Encapsulation, Polymorphisme & Hritage Principes de lOO
Encapsuler ce qui varie Favoriser la composition sur lhritage Programmer avec des interfaces et non des implmentations Opter pour une conception faiblement couple Les classes doivent tre ouvertes pour les extensions et fermes pour les
modifications Dpendre des abstractions. Ne jamais dpendre de classes concrtes
Patron de lOO Strategy: dfinit une famille dalgorithmes interchangeables Observer: dfinit une dpendance1--plusieurs entre objets. decorator: attache des responsabilits additionnelles un objet dynamiquement. Abstract Factory: offre une interface de cration de familles dobjets Factory Method: dfinit une interface de cration des objets Singleton: assure une classe une seule instance et lui offre un point daccs global
Rcapitulatif (1/2)
106
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le patron singleton assure la cration dau plus une instance dune classe de notre application
Le patron offre aussi un seul point daccs global cette instance Limplmentation Java du patron utilise un constructeur priv une
mthode statique combine avec une variable statique Le dveloppeur examine la performance et les contraintes des
ressources et choisit soigneusement une implmentation pour une application multi-thread
Rcapitulatif (2/2)
107 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le patron "Command"
108
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Home-Automation : Spcification (1/28)
109
Objectif: Mettre en uvre un systme de contrle distant dun ensemble dappareils dans une maison
Besoin: programmer les fonctionnalits dun contrleur distant (avec 7 slots) selon des classes (prdfinies par le vendeur) de gestion des appareils installs dans la maison.
Conception: OO Prvoir les relations entre les boutons du contrleur distant
(ON-OFF) avec les fonctionnalits des appareils installs: setTemperature(), setVolume(), setDirection(), etc..
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 110
Contrleur distant
Il y a des boutons on et off pour chaque slot
Il y a 7 slots programmer. On met un appareil diffrent dans chaque slot, et on le contrle travers les boutons
Ces deux boutons ont utiliss pour contrler la tlvision
Un bouton global UNDO pour annuler laction du dernier bouton activ
Ces deux boutons ont utiliss pour contrler la chaine Streo, etc
Home-Automation : Analyse du contrleur distant (2/28)
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 111
Home-Automation : Les classes du vendeur (3/28)
Stereo
on() off() setCD() setRadio() setVolume()
Appliance
on() off()
Faucet
openValue() closeValue()
AirCondition
setTemperature()
Security
arm() desarm()
Light
on() off()
GardenLight
setDuskTime() setDawnTime() manualOn() manualOff()
CeilingLight
on() off() dim()
GarageDoor
up() down() stop() lightOn() lightOff()
OutDoorLight
on() off()
Sprinkler
waterOn() waterOff()
Les classes du vendeur nous donnent une ide sur les fonctionnalits des appareils installs dans la maison :
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Home-Automation : Discussion de la conception (4/28)
112
On sattendait des classes avec des mthodes on()-off() pour bien correspondre avec le contrleur distant
Cest important de voir a comme sparation des proccupation : le contrleur doit savoir comment interprter lappui sur le bouton et crer des requtes, mais il ne doit pas connaitre beaucoup sur les appareils et leurs manires de fonctionnement (comment allumer une lampe) En dautre terme, le contrleur met des requtes gnriques Une entit prendra en charge la transformation de cette requte
en action
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Home-Automation : Discussion de la conception (4/28)
113
Comment mettre des requtes des objets sans rien connatre des oprations demandes ? ou sans rien connatre de celui qui la requte est destine ?
Dissocier (dcoupler) lobjet qui invoque une opration de
lobjet qui possde les connaissances ncessaires pour raliser cette opration. En dautre terme, le contrleur met des requtes gnriques Une entit prendra en charge la transformation de cette requte
en action
Utiliser le patron Command Objet Command: Encapsuler une requte sous forme dobjet
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Command : Commander un dner (5/28)
114
Waitress
Order
Customer
Order-Cook
Le client donne sa commande la serveuse
La serveuse rcupre la commande et la met sur le comptoir, et la lance
Le cuisinier prpare le repas selon la commande
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Command : Etudes des interactions (6/28)
115
createOrder()
takeOrder()
orderUp()
makeBurger(), makeShake(), makeShips()
output()
Je veux un burger,
un shake et des frites
La serveuse rcupre la commande et la met sur le comptoir, et la lance
Il y a toutes les instructions ncessaires pour prparer le repas
Le cuisinier suit les instructions de la commande
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 116
La commande (papier) est une requte pour prparer le repas Sil sagit dun objet, il peut tre pass de la serveuse au comptoir Son interface consiste une seule mthode orderUp(), qui encapsule les actions
ncessaires pour prparer le repas La serveuse na besoin de savoir comment prparer le repas!
La tche de la serveuse est de prendre la commande et dinvoquer la mthode orderUp() dessus La mthode takeOrder() de la serveuse peut tre paramtre avec diffrentes
commandes de plusieurs clients. Ceci ne la drange pas car elle sait que orderUp() supporte sa commande
Le cuisinier possde les connaissances ncessaires pour prparer le repas Suite linvocation de orderUp(), le cuisinier implmente toutes les mthodes
ncessaires pour crer le repas Noter quil est compltement dcoupl de la serveuse
La serveuse encapsule les dtails du repas dans la commande Le cuisinier prend ses instructions de la commande, et il na pas besoin de la contacter
Command : Les rles et les responsabilits (7/28)
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Command : Du dner vers le patron Commande (8/28)
117
createCommandObject( )
setCommand()
execute()
action1(), action2()
La commande consiste un ensemble dactions et un receveur Lobjet Command offre une
seule mthode execute() qui encapsule les actions
de ceci rsulte linvocation des actions sur le Receiver
create Command
Object execute()
setCommand()
execute()
action1() action2()
..
action1() action2()
..
public void execute(){ receiver.action1(); receiver.action2(); }
Plus tard, le client demande linvoker dexcuter sa commande
Le client cre la commande.
Linvoker appelle la mthode execute() de lobjet Command
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Command : Correspondance (9/28)
118
Dner Command Pattern
Serveuse (Waitress)
Command
Cuisinier (Order-Cook)
execute()
orderUp() Client
Commande (Order)
invoke
Client (Customer)
Receiver
takeOrder() setCommand()
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Command : Le patron Command (10/28)
119
Dfinition: Le patron Command encapsule une requte comme un
objet, ainsi il nous permet de paramtrer dautres objets avec diffrentes requtes, files dattentes ou longues requtes, et supporte lannulation dune opration
Command
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Home-Automation : Des Commandes (11/28)
120
execute(){ receiver.action()
}
action()
execute()
Une requte encapsule
execute()
execute() execute()
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Command : Le diagramme de classes du patron (12/28)
121
Client
Le client est responsable de crer une ConcretCommand et affecter son Receiver
Invoker
setCommand()
Receiver
action()
ConctretCommand
execute() undo()
Command
execute() undo()
Linvoker tient la commande et un certain moment demande la commande de raliser une requte en excutant sa mthode execute()
Interface de tous les commandes. La commande est invoque travers sa mthode excute, qui demande au Receiver de raliser des actions
public void execute(){ receiver.action(); }
Le Receiver connait comment raliser le travail demand afin de satisfaire la requte.
Le ConcretCommand dfinit une lisaison entre une action et un Receiver Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Home-Automation : Notre premier objet Commande (13/28)
122
public interface Command{ public void execute();
}
Implmentons linterface Command
Implmentons une Commande pour allumer la lumire Light
on() off()
public class LightOnCommand implements Command { Light light; public LightOnCommand(Light light){ this.light = light; } public void execute(){ light.on(); }
}
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Home-Automation : Notre premier objet Commande (14/28)
123
Utilisons lobjet Commande
public class SimpleRemoteControl{ Command slot; public SimpleRemoteControl() {} public void setCommand(Command command ){ slot=command; } public void buttonWasPressed(){ slot.execute(); }
}
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Home-Automation : Notre premier objet Commande (15/28)
124
Testons la fonctionnalit du contrleur distant
public class RemoteControlTest{ public static void main(String argv[]) { SimpleRemoteControl remote = new SimpleRemoteControl(); Light light=new Light(); LightOnCommand lightOn=new LightOnCommand (light); remote.setCommand(lightOn); //passer la commande linvoker remote.buttonWasPressed(); //simuler lappui sur le bouton
}
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Home-Automation : 2me Commande (16/28)
125
Dvelopper la classe GarageDoorOpenCommand
public class GarageDoorOpenCommand implements Command { GarageDoor garageDoor; public GarageDoorOpenCommand (GarageDoor garageDoor){ this.garageDoor = garageDoor; } public void execute(){ garageDoor.up(); garageDoor.lightOn(); }
}
GarageDoor
up() down() stop() lightOn() lightOff()
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Home-Automation : Une autre Commande (17/28)
126
Ajoutant cette commande au slot du contrleur distant public class RemoteControlTest{ public static void main(String argv[]) { SimpleRemoteControl remote = new SimpleRemoteControl(); Light light = new Light(); LightOnCommand lightOn=new LightOnCommand(light); GarageDoor garageDoor = new GarageDoor(); GarageDoorOpenCommand garageOpen = new
GarageDoorOpenCommand(garageDoor); remote.setCommand(lightOn); //encapsuler la commande remote.buttonWasPressed(); //allumer la lumire remote.setCommand(garageOpen); //encapsuler la commande remote.buttonWasPressed(); //ouvrir la porte du garage
}
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 127
Contrleur distant Linvoker
Home-Automation : Le contrleur distant (18/28)
execute()
execute()
execute()
execute()
execute()
execute()
off() on()
Les actions de la mthode execute() sont invoques sur le Receiver
Light GarageDoor Stereo
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Home-Automation : Le diagramme de classes (19/28)
128
RemoteLoader
Le client
Light
on() off()
LightOnCommand
execute()
Command
execute()
public void execute(){ light.on(); }
LightOffCommand
execute() public void execute(){ light.off(); }
RemoteControl
onCommands offCommands
setCommand() onButtonWasPushed() offButtonWasPushed()
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 129
class RemoteControl{ Command onCommands[]; Command offCommands[]; public RemoteControl() { onCommands = new Command[7]; offCommands = new Command[7]; Command noCommand = new NoCommand(); for(int i=0;i
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 133
class RemoteControl{ Command onCommands[]; Command offCommands[]; Command undoCommand; public RemoteControl() { onCommands = new Command[7]; offCommands = new Command[7]; Command noCommand = new NoCommand(); for(int i=0;i
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Autre utilisation du patron Command : Organiser les queues de requtes (28/28)
137
execute()
Les threads rcuprent les commandes de la queue une une, et appellent leur mthode execute(). Une fois complt, ils retournent pour une nouvelle commande.
execute()
execute()
execute()
execute() execute()
execute()
Cest une manire efficace pour limiter le calcul un nombre fix de Threads
Les commandes nous offrent une manire de paquetage les morceaux de calcul (computation). Les calculs (commandes cres par des applications) seront placs dans des queues (queue de jobs) pour tre excuts.
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Bases de lOO: Abstraction, Encapsulation, Polymorphisme & Hritage Principes de lOO
Encapsuler ce qui varie Favoriser la composition sur lhritage Programmer pour des interfaces Opter pour une conception faiblement couple Les classes doivent tre ouvertes pour les extensions et fermes pour les
modifications Dpendre des abstractions. Ne jamais dpendre de classes concrtes
Patron de lOO Strategy: dfinit une famille dalgorithmes interchangeables Observer: dfinit une dpendance1--plusieurs entre objets. Decorator: attache des responsabilits additionnelles un objet dynamiquement. Abstract Factory: offre une interface de cration de familles dobjets Factory Method: dfinit une interface de cration des objets Singleton: assure une classe une seule instance Command: encapsule une requte comme un objet
Rcapitulatif (1/2)
138
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le patron Command dcouple un objet, faisant des requtes, de lobjet qui sait comment la raliser
Un objet Command est au centre de ce dcouplage et encapsule le Receiver avec une action (ou des actions)
LInvoker excute la requte dun objet Command en appelant sa mthode execute(), qui invoque les actions sur le Receiver
Le patron Command supporte lannulation (undo) par limplmentation dune mthode undo() -dans la commande- qui restore lancien tat du systme (avant lexcution de la mthode execute())
Les Macro-Commandes sont des simples extensions de Command qui permettent linvocation de multiple commandes. Pareil, les macro-commandes peuvent supporter les mthodes dannulation (undo).
Le patron Command est utilis aussi pour implmenter lorganisation des requtes (Jobs) et la gestion de la journalisation (logging)
Rcapitulatif (2/2)
139 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Exercice 1 On vous demande de participer la cration dun nouvel outil graphique. Cet
outil permettra de crer de manire intuitive des dessins avec un niveau de complexit plus ou moins lev. Les dessins pourront tre composs dun ensemble de points, droites, arc de cercles ou autres formes simples telles que des cercles ou des polygones. Cet outil sera similaire au programme appel Paint sous lenvironnement Windows. La figure suivante prsente un diagramme de classes simplifi pour cette application :
140
Vous tes charg de concevoir le mcanisme qui permettra de garder une trace des actions de lutilisateur. Ce dernier pourra ainsi annuler les dernires actions faites.
Question: Faites les modifications ncessaires au diagramme de classes pour implanter le patron Commande.
Application +ouvrir(doc:Dessin)+fermer()+sauvegarder():boolean
Dessin +ajouterPoint(position:Vecteur2D)+ajouterDroite(pt1:Vecteur2D,pt2:Vecteur2D)+ajouterCercle(rayon:float,centre:Vecteur2D) +ajouterPolygone(listePts:[]Vecteur2D)+afficher()
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le but de cet exercice est de tester la puissance du pattern Command. Pour ce faire, nous disposons dune calculatrice offrant les oprations arithmtiques de base (+, - et *) sur 2 rels et nous voulons transformer les actions (des utilisateurs) de calculs sur cette calculatrice en des commandes. 1. Donne le digramme de classes dcrivant cette transformation avec le pattern
Command. 2. Implanter ce diagramme tout en respectant le client suivant :
141
Exercice 2
public class Client { public static void main(String[] args) { Calculatrice c=new Calculatrice(); PlusCommand plus =new PlusCommand(c); MultipCommand mult=new MultipCommand (c); SoustCommand sous =new SoustCommand(c); CalculatriceControl control =new CalculatriceControl(); control.setCommand(0, plus); control.setCommand(1, sous); control.setCommand(2, mult); control.MultiButtonPressed(2, 5, 15); control.SoustButtonPressed(1, 17, 10); control.PlusButtonPressed(0, 12, 15); }}
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le Modle-Vue-Contrleur
142
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le modle MVC: destin rpondre aux besoins des applications interactives en sparant les problmatiques lies aux diffrents composants au sein de leur architecture respective.
Ce paradigme regroupe les fonctions en trois catgories : un modle (modle de donnes), une vue (prsentation, interface utilisateur) un contrleur (logique de contrle, gestion des vnements, synchronisation)
Architecture Modle/Vue/Contrleur
143
L'ide est de bien sparer les donnes, la prsentation et les traitements.
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le modle reprsente le cur (algorithmique) de l'application : traitements des donnes, interactions avec la base de donnes, etc. dcrit les donnes manipules par l'application. regroupe la gestion de ces donnes et est responsable de leur intgrit. La base de donnes sera l'un de ses composants.
Le modle comporte des mthodes standards pour mettre jour ces donnes (insertion, suppression, changement de valeur).
Les rsultats renvoys par le modle ne s'occupent pas de la prsentation.
Le modle ne contient aucun lien direct vers le contrleur ou la vue. Sa communication avec la vue s'effectue au travers du patron
Observateur.
Le Modle
144
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Ce avec quoi l'utilisateur interagit se nomme prcisment la vue. prsenter les rsultats renvoys par le modle. recevoir toute action de l'utilisateur (hover, clic de souris, slection d'un bouton radio,
cochage d'une case, entre de texte, de mouvements, de voix, etc.).
Ces diffrents vnements sont envoys au contrleur. La vue n'effectue pas de traitement,
afficher les rsultats des traitements effectus par le modle et interagir avec l'utilisateur.
Plusieurs vues peuvent afficher des informations partielles ou non d'un mme modle.
La Vue
145 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le contrleur prend en charge la gestion des vnements de synchronisation pour mettre jour la vue ou le modle
reoit tous les vnements de l'utilisateur et enclenche les actions effectuer
Si une action ncessite un changement des donnes, le contrleur demande la modification des donnes au modle, et ce dernier notifie la vue que les donnes ont chang pour qu'elle se mette jour.
D'aprs le patron de conception observateur/observable, la vue est un observateur du modle qui est lui observable
Le contrleur n'effectue aucun traitement, ne modifie aucune donne. Il analyse la requte du client et se contente d'appeler le modle adquat et de
renvoyer la vue correspondant la demande.
Le Contrleur
146
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
lorsqu'un client envoie une requte l'application : la requte envoye depuis la vue est analyse par le contrleur (par
exemple un clic de souris pour lancer un traitement de donnes) ; le contrleur demande au modle appropri d'effectuer les traitements et
notifie la vue que la requte est traite (via par exemple un callback) ; la vue notifie fait une requte au modle pour se mettre jour (par exemple
affiche le rsultat du traitement via le modle).
Flux de traitement
147 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
L'architecture trois tiers est un modle en couches, c'est--dire, que chaque couche communique seulement avec ses couches adjacentes le flux de contrle traverse le systme de haut en bas
Dans le modle MVC, la vue peut consulter directement le modle (lecture) sans passer par le contrleur. Par contre, elle doit ncessairement passer par le contrleur pour effectuer une modification (criture). le contrleur peut alors envoyer des requtes toutes les vues de manire ce
qu'elles se mettent jour.
La diffrence fondamentale se trouve dans le fait que l'architecture 3-Tier spare la couche mtier de la couche accs aux donnes.
Pour qu'une application MVC soit une vraie application 3-Tier il faut lui ajouter une couche d'abstraction d'accs aux donnes de type DAO (Data Access Object).
Inversement pour qu'une application 3-Tier respecte MVC il faut lui ajouter une couche de contrle entre la couche mtier et la couche prsentation.
Architecture MVC ou 3-Tier
148
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Le patron "Factory"
149 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
PizzaStore : Crer des pizzas (1/37)
150
Pizzeria: Crer des pizzas
Pizza orderPizza(){ Pizza pizza=new Pizza(); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; }
Pour la flexibilit, on veut que celui-ci soit une classe abstraite ou interface, sauf quon ne peut pas instancier lun des deux derniers!
On veut plus quun type de pizza.
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
PizzaStore : Plusieurs types de pizza (2/37)
151
Pizzeria: Crer plusieurs types de pizza On passe le type du pizza travers le mthode orderPizza()
Selon le type de pizza, on cre la pizza concrte, et on la place dans la variable "pizza" (interface et classe mre des pizzas).
Une fois on a la pizza, on prpare la sauce, le nappage (tomate/crme fraiche) et le fromage , puis on la fait cuire, la coupe, et on la met dans une boite.
Pizza orderPizza( String type ){ Pizza pizza; if (type.equals("cheese"){ pizza=new CheesePizza(); } else if (type.equals("greek"){ pizza=new GreekPizza(); } else if (type.equals("pepperoni"){ pizza=new PepperoniPizza(); } pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; }
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
PizzaStore : Autres types de pizza (3/37)
152
Les concurrents ont ajout un nouveau type de pizza: (avec Calamars) Ajouter ClamPizza au menu
On na pas vendu beaucoup de GreekPizza dernirement Suspendre GreekPizza du menu
Partie variable: On modifie le code autant que la slection de pizza change.
Partie invariable: Gnralement, ces oprations sont les mmes pour des annes et des annes.
C
e
c
o
d
e
e
s
t
N
O
N
f
e
r
m
p
o
u
r
l
a
m
o
d
i
f
i
c
a
t
i
o
n
!
Pizza orderPizza(String type){ Pizza pizza; if (type.equals("cheese"){ pizza=new CheesePizza(); } else if (type.equals("greek"){ pizza=new GreekPizza(); } else if (type.equals("pepperoni"){ pizza=new PepperoniPizza(); } else if (type.equals("clam"){ pizza=new ClamPizza(); } pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; }
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
PizzaStore : Encapsuler la cration (4/37)
153
Rgle 1 de lOO: Encapsuler ce qui varie
On place ce code dans un objet qui soccupera de la cration des pizzas concrtes. Si un autre objet a besoin dune pizza concrte, cest cet objet quil faut appeler.
Pizza orderPizza(String type){ Pizza pizza;
pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza;
}
if (type.equals("cheese"){ pizza=new CheesePizza(); } else if (type.equals("pepperoni"){ pizza=new PepperoniPizza(); } else if (type.equals("clam"){ pizza=new ClamPizza(); }
On attribue le nom Factory ce nouvel objet Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
PizzaStore : Un Simple Factory (5/37)
154
Le seul rle de SimplePizzaFactory est de crer des pizzas pour ces clients
Initialement, on dfinit la mthode createPizza() dans le Factory. Cest la mthode que tous les clients utilisent pour instancier des nouveaux objets.
Cest le code quon a retirer de la mthode orderPizza().
public class SimplePizzaFactory { public Pizza createPizza(String type){ Pizza pizza=null;
if (type.equals("cheese"){ pizza=new CheesePizza(); } else if (type.equals("pepperoni"){ pizza=new PepperoniPizza(); } else if (type.equals("clam"){ pizza=new ClamPizza(); } return pizza; }
}
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
PizzaStore : Retravaillons la classe PizzaStore (6/37)
155
Maintenant, PizzaStore utilise SimplePizzaFactory pour crer des pizzas PizzaStore rcupre la rfrence du factory travers le constructeur.
La mthode orderPizza() utilise le factory pour crer ses pizzas.
Noter quon a remplac loprateur new par une mthode concrte Plus dinstanciation concrte ici
public class PizzaStore { SimplePizzaFactory factory; public PizzaStore(SimplePizzaFactory factory){ this.factory=factory; } public Pizza orderPizza(String type){ Pizza pizza; pizza=factory.createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } }
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
PizzaStore : Le diagramme de classes (7/37)
156
Actuellement, Simple Factory nest pas un patron. Cest plutt un "style" de programmation
On dfinit Pizza comme classe abstraite, avec quelque implmentations qui peuvent tre redfinies
Elle doit tre la seule partie de notre application qui pointe vers les classes des pizzas concrtes
Pizza prepare() bake() cut() box()
ClamPizza PepperoniPizza
CheesePizza
SimplePizzaFactory
createPizza()
PizzaStore
orderPizza()
PizzaStore cre des instances travers SimplePizzaFactory
La mthode de cration est souvent statique
Chaque produit implmente la classe abstraite Pizza
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
PizzaStore : Franchise de PizzaStore (8/37)
157
Objectif: Franchiser PizzaStore: Crer plusieurs stores dans plusieurs villes (Sfax, Tunis, etc.)
Besoin: Dvelopper une application qui gre la cration des pizzas pour chaque store Chaque store offre diffrent types de pizza
Conception: OO
Moins de fromage dans les pizzas, etc.
Des pizzas familles de grande taille, beaucoup de fromage, etc.
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
PizzaStore : Diffrent styles des PizzaStores (9/37)
158
Si on prpare les mmes pizzas
SfaxPizzaFactory sffactory = new SfaxPizzaFactory(); PizzaStore sfstore = new PizzaStore(sffactory); sfstore.orderPizza("cheese");
TunisPizzaFactory tnfactory = new TunisPizzaFactory(); PizzaStore tnstore = new PizzaStore(tnfactory); tnstore.orderPizza("cheese");
Crer des pizzas travers SfaxPizzaFactory
Crer les mmes pizzas travers TunisPizzaFactory
Et si chaque PizzaStore prpare ses propres styles de pizza
Je prpare les pizzas depuis des annes et je veux ajouter mes propres
touches damlioration des procdures de mon PizzaStore
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
On donne la libert aux franchises de crer leurs propres styles Dplacer la cration dans une la mthode createPizza() et garder la
mme mthode orderPizza() pour tous les stores Chaque rgion ltend afin de spcifier son propre style
159
PizzaStore : Le framework de PizzaStore (10/37)
public abstract class PizzaStore { public Pizza orderPizza(String type){ Pizza pizza; pizza = createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } abstract Pizza createPizza(String type); }
CreatePizza() est une mthode PizzaStore plutt que dans le Factory
Tout ceci apparat le mme
On a transfr notre objet Factory dans cette mthode
Notre "mthode Factory" est maintenant abstraite dans PizzaStore Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
160
PizzaStore : Les styles de pizzas (11/37)
PizzaStore
createPizza() orderPizza()
SfaxStylePizzaStore
createPizza()
TunisStylePizzaStore
createPizza()
Pizza createPizza(String type) { Pizza pizza=null; if (type.equals("cheese"){
pizza=new SfaxStyleCheesePizza(); } else if (type.equals("pepperoni"){
pizza=new SfaxStylePepperoniPizza(); } else if (type.equals("clam"){
pizza=new SfaxStyleClamPizza(); } return pizza;
}
Pizza createPizza(String type) { Pizza pizza=null; if (type.equals("cheese"){
pizza=new TunisStyleCheesePizza(); } else if (type.equals("pepperoni"){
pizza=new TunisStylePepperoniPizza(); } else if (type.equals("clam"){
pizza=new TunisStyleClamPizza(); } return pizza;
}
Mthode abstraite, dfinir dans les classes drives
Crer des pizzas avec les ingrdients spcifiques Tunis
Crer des pizzas avec les ingrdients spcifiques Sfax
-
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
public class SfaxStylePizzaStore extends PizzaStore { Pizza createPizza(String item) { if (item.equals("cheese"){
return new SfaxStyleCheesePizza(); } else if (item.equals("pepperoni"){
return new SfaxStylePepperoniPizza(); } else if (item.equals("clam"){
return new SfaxStyleClamPizza(); }
} }
Les bnfices dune franchise On obtient des fonctionnalits des pizzas communes (prepare(), bake(), cut() et box()) Chaque rgion dfinit sa propre mthode createPizza() qui spcifie son style de pizza
161
PizzaStore : Un PizzaStore de Style Sfaxien (12/37)
On implmente createPizza() puisquelle est abstraite: Cest la "mthode Factory"
On hrite la mthode orderPizza() de PizzaStore
Crer des pizzas du style sfaxien!!
Rq: Toutes les responsabilits dinstanciation sont dplaces vers la mthode createPizza() qui agit comme un factory
La mthode factory gre la cration des objets et leur encapsulation Dcouplage du code du client dans la supre classe de la cration de lobjet dans les sous-
classes
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
PizzaStore : Commander des pizzas (13/37)
Je voudrai une pizza de grande taille avec beaucoup
de fromage du style tunisien
Je voudrai une pizza de taille moyenne avec
peu de