Académique Documents
Professionnel Documents
Culture Documents
Wajdi LOUATI
riadh.benhalima@enis.rnu.tn
wajdi.louati@gmail.com
Historique
Motivation
Vocabulaire:
Dfinition
Dfinition : "Un patron de conception (design pattern)
SimUDuck:
Conception (1/22)
Le patron
"Strategy"
Conception: OO
Une supre classe Canard (Duck) dont tous les canards hritent
Duck
quack()
swim()
display()
Abstract
RedHeadDuck
display()
display()
10
MallardDuck
SimUDuck :
Problmes (3/22)
Duck
quack()
swim()
Modification apporte
Duck
quack()
swim()
fly()
display()
fly()
display()
11
MallardDuck
RedHeadDuck
MallardDuck
RedHeadDuck
display()
display()
display()
display()
12
RubberDuck
display()
quack(){
Redfinir squeak
}
SimUDuck :
Constat (4/22)
SimUDuck :
Solution?? (5/22)
13
15
SimUDuck :
Des interfaces? (7/X)
WoodenDuck
display()
quack(){
Redfinir rien
}
fly(){
Redfinir rien
}
14
SimUDuck :
Un autre canard (6/22)
16
Duck
Quackable
quack()
swim()
display()
MallardDuck
RedHeadDuck
RubberDuck
WoodenDuck
display()
fly()
quack()
display()
fly()
quack()
display()
quack()
display()
SimUDuck :
Inconvnients (8/22)
SimUDuck :
Moment de rflexion (9/22)
Duck
Flyable
fly()
Quackable
swim()
display()
quack()
RedHeadDuck
RubberDuck
WoodenDuck
display()
fly()
quack()
display()
fly()
quack()
display()
quack()
display()
Constat:
MallardDuck
SimUDuck :
Solution (10/22)
18
SimUDuck :
Principe de conception (11/22)
Solution:
Rgle
Cest
Prendre
en uvre
20
SimUDuck :
Sparation (12/22)
SimUDuck :
Conception des comportements (13/22)
Comportements
Mettre dehors ce qui varie
Duck class
Le comportement Fly
Le comportement Quack
Invariable
Variable
21
22
SimUDuck :
Conception des comportements (14/22)
FlyBehavior
QuackBehavior
fly()
SimUDuck :
Intgration des comportements(15/22)
quack()
FlyWithWings
fly() {
//vol
}
FlyNoWay
fly() {
//rien-ne vol pas
}
Quack
quack(){
//quack
}
Squeak
quack(){
//squeak
//rubber
}
MuteQuack
quack(){
//rien-ne
//cancane pas
}
Consquences:
23
FlyBehavior fbehavior;
QuackBehavior qbehavior;
Variable dinstance
du type INTERFACE
performQuack()
swim()
display()
performFly()
//.
SimUDuck :
Implmentation de la supre classe(16/22)
SimUDuck :
Implmentation dun canard (17/22)
25
26
SimUDuck :
Tester le code du canard(18/22)
SimUDuck :
Le comportement dynamique (19/22)
27
FlyNoWay.java,
SimUDuck :
La conception finale (20/22)
performQuack()
swim()
display()
performFly()
setFlyBehavior()
setQuackBehavior()
\\autre mthodes
implements
Quack
quack(){
//quack
}
Squeak
quack(){
//squeak
//rubber
}
MuteQuack
quack(){
//rien-ne
//cancane pas
}
FlyBehavior
fly()
extends
WoodenDuck
display(){
\\canard en bois
}
Algorithmes
interchangeables
FlyWithWings
fly() {
//vole
}
implements
FlyNoWay
fly() {
//ne vole pas
}
30
SimUDuck :
Notre premier patron (22/22)
QuackBehavior qbehavior;
FlyBehavior fbehavior;
29
QuackBehavior
quack()
Duck
MallardDuck
display(){
\\canard Mallard
}
SimUDuck :
Composition/Hritage (21/22)
31
32
Limplmentation du patron
33
Principes de lOO
35
Rcapitulatif (2/2)
Bases de lOO:
34
Rcapitulatif (1/2)
Reprsentation du patron
Exercice (1/2)
Exercice (2/2)
Individu
ComportementArme arme;
combattre()
Display ()
Reine
Display(){.}
UtiliseArme(){\\abattre avec
couteau }
Display(){.}
setArme(ComportementArme ca) {
this.arme=ca;
}
37
2.
3.
1.
2.
3.
Chevalier
ComportementCouteau
Archer
1.
Display(){.}
ComportementArc&Fleche
UtiliseArme(){\\abattre avec
arc et flche}
4.
5.
ComportementArme
UtiliseArme();
reprsente extends
reprsente implements
reprsente has-a
ComportementEpee
UtiliseArme(){\\abattre avec
pe}
38
Station mto:
Spcification (1/14)
Le patron
"Observer"
Conception: OO
39
40
Station mto:
Conception (3/14)
Station mto:
Analyse (2/14)
WeatherData
Afficher
Capteur
dhumidit
Capteur de
temprature
Weather Station
WeatherData
Object
Le fournisseur ENIS-METEO
Conditions
courantes
41
A implmenter
Station mto:
Une solution possible (4/14)
Station mto:
Constat (5/14)
{
//attributs
void setMeasurement(){
float temperature = getTemperature();
float humidity = getHumidity()
1.
2.
3.
//autres mthodes
measurementChanged()
\\autre mthodes
Capteur de
pression
getTemperature()
getHumidity()
getPressure()
Tirer (pull)
4.
44
Station mto:
Publier/Souscrire= Patron Observer (6/14)
Lorsque les donnes du sujet changent,
les observateurs sont notifis
Station mto:
Patron Observer : Sinscrire (7/14)
45
Station mto:
Patron Observer : Notification(8/14)
46
Station mto:
Patron Observer : Dsinscrire (9/14)
8
8
8
Nouvel entier
Les objets Observers
47
48
Station mto:
Patron Observer : Notification (10/14)
Maintenant, le Dog nest plus un
observer, il ne reoit plus les
notifications du Sujet
Station mto:
Le patron Observer (11/14)
Dfinition:
Observer
12
12
1--plusieurs
8
8
8
Nouvel entier
Les objets Observers
49
Station mto:
Diagramme de classes du patron (12/14)
Chaque Subject possde
un tableau dobservers
Les objets utilisent
cette interfaces pour
sinscrire comme
observer et aussi se
dsinscrire
50
<<interface>>
Subject
observers
registerObserver()
removeObserver()
notifyObservers()
<<interface>>
Observer
Update()
Le ConcreteSubject
hrite toujours de
linterface Subject. Il
implmente la mthode
notifyObservers() qui
est sense mettre
jour lobserver quand
ltat change.
registerObserver(){}
removeObserver() {}
notifyObservers() {}
getState()
setState()
subject
ConcreteObserver
Update()
//autres mthodes
51
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
ConcreteSubject
52
Station mto:
La conception finale (14/14)
<<interface>>
Subject
observers
registerObserver()
removeObserver()
notifyObservers()
WeathetData
<<interface>>
DisplayElement
<<interface>>
Observer
display()
update()
subject
registerObserver(){}
removeObserver() {}
notifyObservers() {}
getTemperature()
getHumidity()
getPressure()
measurementChanged()
Le Patron Observateur
CurrentConditionsDisplay
update()
display()
StatisticsDisplay
update()
display()
ForecastDisplay
update()
display()
Rcapitulatif (1/2)
Rcapitulatif (2/2)
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.
55
54
Exercice
Exercice (1/2)
1.
<<interface>>
Observer
Pour dire
Observable
explicitement que
ltat de lobservable addObserver(Observer o)
a chang. Elle ne fait deleteObserver(Observer o)
pas la notification.
notifyObservers(Object arg)
ding()
update(Observable o, Object
arg)
Ou
o est utilis pour rcuprer le message, et
arg est un argument passer lobserver
setChanged()
Il sagit dune classe. Les mthodes
offertes sont dj implmentes.
Sonnerie2
2.
57
ding()
58
AbstractChrono
int secondes;
int minutes;
int heures;
getSecondes()
getMinutes()
getHeures()
tick()
Chrono
DisplayNumerique
afficheTempsEcoule()
DisplayAiguille
afficheTempsEcoule()
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Exercice (2/2)
Utiliser le pattern Observer pour dfinir les interactions entre Chrono, Display et
Sonnerie
Le patron
"Decorator"
59
60
StarCoffee :
Conception (2/10)
StarCoffee :
Spcification (1/10)
Tea
StarCoffee :
Problme (3/10)
cost()
cost()
CoffeeWithMilk
cost()
63
cost()
TeaWithMintWit
hPine
cost()
62
StarCoffee :
Nouvelle conception (4/10)
Beverage
Description
Milk
Mint
Pine
Whip
TeaWithMint
CoffeeWithMilk
WithWhip
cost()
61
Retourne la description
Coffee
Conception: OO
Beverage
Description
getDescription()
cost()
Description
Milk
Mint
Pine
Whip
getDescription()
cost()
hasMilk()
setMilk()
hasMint()
setMint()
hasPine()
setPine()
hasWhip()
setWhip()
Des boolans
getDescription()
cost()
hasMilk()
setMilk()
hasMint()
setMint()
hasPine()
Des get et set pour les
setPine()
booleans des condiments
hasWhip()
setWhip LOUATI [Design patterns]
Riadh BEN HALIMA&Wajdi
Coffee
cost()
64
cost()
StarCoffee :
Un boisson dcor (5/10)
1.
Le client veut aussi des pignons, alors on cre un objet Pine qui
Lobjet Pine est un dcorateur, donc il est un
emballe le Mint
3.
La classe Tea hrite de Beverage et possde une
mthode cost() qui calcule le prix du boisson
cost()
2.
StarCoffee :
Un boisson dcor (6/10)
miroir du type Tea et inclut une mthode cost()
cost()
cost()
cost()
cost()
66
StarCoffee :
Le cot du boisson dcor (7/10)
StarCoffee :
Le patron Decorator (8/10)
Dfinition:
Invocation de la mthode
cost() du dcorateur extrieur
cost()
0.300
cost()
0.200
Decorator
cost()
0.500
1.000
67
68
StarCoffee :
Le diagramme de classes du patron(9/10)
Chaque composant peut tre utilis lui
seul, ou envelopp dans des dcorateurs
Component
Le ConcreteComponent est
lobjet quon va lui ajouter
dynamiquement des nouveaux
comportements. Il tend
lobjet Component.
methodA()
methodB()
//autres mthodes
Le ConcreteDecorator possde
un attribut qui reprsente lobjet
quil dcore. Il peut ajouter ses
propres mthodes et attributs.
69
Coffee
Decorator
methodA()
methodB()
//autres mthodes
ConcreteDecoratorA
Component WrappedObj
methodA()
methodB()
Newbehavior()
//autres mthodes
cost()
ConcreteDecoratorB
Tea
CondimentDecorator
cost()
Whip
Component WrappedObj
Object newState
methodA()
methodB()
//autres mthodes
Riadh BEN HALIMA&Wajdi
LOUATI [Design patterns]
getDescription();
Le constructeur du
dcorateur prend le
boisson dcorer en
entre et retourne le
boisson dcor.
Milk
Mint
Pine
Beverage beverage
Beverage beverage
Beverage beverage
Beverage beverage
cost()
cost()
cost()
cost()
70
Rcapitulatif (2/2)
Component
Rcapitulatif (1/2)
Beverage
description
getDescription()
cost();
//autres mthodes
ConcreteComponent
methodA()
methodB()
//autres mthodes
StarCoffee :
La conception finale (10/10)
Exercice (1/3)
Exercice (2/3)
1.
2.
3.
73
74
1.
Abstract Component
Conctrete
Component
InputStream
FileInputStream
Abstract Decorator
StringBufferInputStream
FilterInputStream
ByteArrayInputStream
PushBackInputStream
BufferedInputStream
Decorator
DataInputStream
75
LineNumberInputStream
Le patron
"Adapter"
77
78
Le patron adapter :
Les adaptateurs dans lOO (2/7)
Le patron adapter :
Les adaptateurs (1/7)
Notre
systme
existant
Prise Europenne
Adaptateur
Cble American du PC
Notre
systme
existant
Mme code
79
Classe du
vendeur
80
Adaptateur
Nouveau code
Classe du
vendeur
Mme code
Le patron adapter :
Dinde et Canard (3/7)
interface Turkey{
void gobble();
void fly();
}
81
82
Le patron adapter :
Testons ladaptateur(5/7)
public class TestAdapter{
public static voir main (String arg[])
{
MallardDuck mallard= new MallardDuck();
WildTurkey wild = new WildTurkey();
Duck turkeyAdapter = new TurkeyAdapter(wild);
test(mallard);
test(turkeyAdapter);
}
static void test(Duck duck)
{
duck.quack();
duck.fly();
}
}
Le patron adapter :
Ladaptateur du dinde(4/7)
Dfinition:
Adapter
84
Adapter :
Le diagramme de classes du patron (7/7)
Client
<<interface>>
Target
LAdapter implmente
linterface Target
Request()
Adapter
Adaptee
Request()
specificRequest()
86
Le patron Facade:
Dmarrer un home-cinma (1/4)
Tuner
dmarrer lampli
dmarrer le DvDplayer
le brancher avec lmpli
jouer le DvD
etc..
Le patron
"Faade"
87
88
Amplifier
tuner
dvdPlayer
.
on()
off()
setCD()
setDVD()
DVDPlayer
amplifier
on()
off()
play()
stop()
pause()
Screen
up()
down()
Le patron Facade:
Les classes dun Home cinma (2/4)
La Faade: une nouvelle
classe pour le
HomeCinema avec peu
de mthode
Tuner
amplifier
on()
off()
setAm()
setFM()
CDPlayer
WatchDVD()
HomeCinema
WatchTV()
WatchDVD()
.
Dfinition:
Amplifier
DVDPlayer
tuner
dvdPlayer
.
amplifier
on()
off()
play()
stop()
pause()
on()
off()
setCD()
setDVD()
amplifier
on()
off()
play()
stop()
89
pause()
Faade
Projector
Screen
on()
off()
up()
down()
Faade:
Le diagramme de classes du patron (4/4)
90
Faade
Patron
Un client heureux car
son travail devient
facile grce la faade
Systmes complexes
91
Rle
Decorator
Adapter
Facade
92
Singleton :
Spcification (1/12)
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.
Le patron
"Singleton"
93
Singleton :
Crer un singleton (2/12)
static
Oui
private MonObjet(){ }
public static MonObjet getInstance() {
return new MonObjet();
}
Le code de MonObjet est le seul code qui peut lappeler (dans une mthode)
95
Cest une mthode statique qui peut tre appele partir du nom de la
classe : MonObjet.getInstance()
New MonObjet()
Pour toute classe, est ce quon peut linstancier plus quune fois?
Singleton :
Crer un singleton (3/12)
94
96
Singleton :
Implmentation du patron (4/12)
Nous avons une variable statique
pour stocker notre instance
return uniqueInstance;
}
Si uniqueInstance nest pas nul, a veut dire
quelle a t cre prcdemment
Singleton :
Lusine de chocolat (6/12)
Singleton :
Lusine de chocolat (5/12)
public class ChocolateBoiler{
private boolean empty;
Le code dmarre lorsque
private boolean boiled;
la casserole est vide
public ChocolateBoiler() {
empty=true; boiled=false;
Pour remplir la casserole, elle
}
doit tre vide. Lorsquelle est
public void fill(){
pleine, on met empty false.
if (empty){
//remplir la casserole avec du lait/chocolat
empty=false; boiled=false;
}
Pour vide la casserole, elle doit
}
public void drain(){
tre pleine et dj mixe. une
if (!empty && boiled){
fois vide, on met empty true.
//vider la casserole
empty=true;
}
}
Pour mixer le contenu de la
public void boil(){
casserole, elle doit tre pleine et
if (!empty && !boiled){
non dj mixe. Lorsquelle est
//faire bouillir
boiled=true;
pleine, on met boiled true.
}
}
}
98
Singleton :
Le patron Singleton(7/12)
Dfinition:
Singleton
private ChocolateBoiler() {
empty=true; boiled=false;
}
public static ChocolateBoiler getInstance() {
if (uniqueInstance == null)
uniqueInstance = new ChocolateBoiler();
return uniqueInstance;
}
//reste du code
}
99
100
Singleton:
Le diagramme de classes du patron (8/12)
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?
Thread-1
Singleton
if (uniqueInstance == null)
+ static getInstance()
//autre mthodes utiles
101
uniqueInstance = new
ChocolateBoiler();
return uniqueInstance;
Singleton :
Gestion du multi-threading (10/12)
Solution 1: synchroniser laccs la mthode getInstance()
Object1
return uniqueInstance;
102
null
Object1
uniqueInstance = new
ChocolateBoiler();
null
null
if (uniqueInstance == null)
Valeur de
UniqueInstance
null
- static uniqueInstance
Thread-2
Object2
Object2
Singleton :
Gestion du multi-threading (11/12)
Solution 2: cration au moment de la dfinition de la variable de classe
private Singleton() {}
Singleton :
Gestion du multi-threading (12/12)
Rcapitulatif (1/2)
On synchronise seulement la
premire fois
106
Rcapitulatif (2/2)
107
Le patron
"Command"
108
Home-Automation :
Spcification (1/28)
Home-Automation :
Analyse du contrleur distant (2/28)
Il y a 7 slots programmer.
On met un appareil diffrent
dans chaque slot, et on le
contrle travers les boutons
Contrleur distant
109
Home-Automation :
Les classes du vendeur (3/28)
Stereo
on()
off()
setCD()
setRadio()
setVolume()
Appliance
openValue()
closeValue()
on()
off()
setDuskTime()
setDawnTime()
manualOn()
manualOff()
AirCondition
setTemperature()
Security
Light
on()
off()
GardenLight
Faucet
CeilingLight
on()
off()
dim()
GarageDoor
up()
down()
stop()
lightOn()
lightOff()
Home-Automation :
Discussion de la conception (4/28)
Les classes du vendeur nous donnent une ide sur les fonctionnalits
des appareils installs dans la maison :
111
110
arm()
desarm()
OutDoorLight
on()
off()
Sprinkler
waterOn()
waterOff()
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
112
Home-Automation :
Discussion de la conception (4/28)
Order
Command :
Commander un dner (5/28)
Le client donne sa
commande la serveuse
Waitress
Customer
La serveuse rcupre la
commande et la met sur le
comptoir, et la lance
Le cuisinier prpare le
repas selon la commande
Order-Cook
113
Command :
Etudes des interactions (6/28)
createOrder()
Il y a toutes les
instructions
ncessaires pour
prparer le repas
Je veux
un burger,
un shake et
des frites
takeOrder()
La serveuse rcupre la
commande et la met sur le
comptoir, et la lance
Le cuisinier suit
les instructions
de la commande
output()
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Command :
Les rles et les responsabilits (7/28)
orderUp()
115
114
116
Command :
Du dner vers le patron Commande (8/28)
public void execute(){
receiver.action1();
receiver.action2();
}
action1()
action2()
..
Dner
create
Command
Object
createCommandObject( )
execute()
Command :
Correspondance (9/28)
setCommand()
setCommand()
execute()
execute()
action1(), action2()
Linvoker appelle la mthode
execute() de lobjet Command
117
action1()
action2()
..
de ceci rsulte
linvocation des
actions sur le
Receiver
Command :
Le patron Command (10/28)
Command Pattern
Serveuse
(Waitress)
Command
Cuisinier
(Order-Cook)
execute()
orderUp()
Client
Commande
(Order)
invoke
Client
(Customer)
Receiver
takeOrder()
setCommand()
118
Home-Automation :
Des Commandes (11/28)
Une requte encapsule
Dfinition:
Command
action()
execute()
execute(){
receiver.action()
}
execute()
119
execute()
120
execute()
Command :
Le diagramme de classes du patron (12/28)
Le client est responsable de
crer une ConcretCommand
et affecter son Receiver
Client
Invoker
setCommand()
ConctretCommand
action()
execute()
undo()
121
execute()
undo()
Receiver
Home-Automation :
Notre premier objet Commande (14/28)
Home-Automation :
Notre premier objet Commande (13/28)
122
Home-Automation :
Notre premier objet Commande (15/28)
public SimpleRemoteControl() {}
public void setCommand(Command command ){
slot=command;
}
123
124
Home-Automation :
2me Commande (16/28)
Home-Automation :
Une autre Commande (17/28)
up()
down()
stop()
lightOn()
lightOff()
public class GarageDoorOpenCommand implements Command {
GarageDoor garageDoor;
public GarageDoorOpenCommand (GarageDoor garageDoor){
this.garageDoor = garageDoor;
}
public void execute(){
garageDoor.up();
garageDoor.lightOn();
}
}
125
Home-Automation :
Le diagramme de classes (19/28)
Home-Automation :
Le contrleur distant (18/28)
execute()
execute()
Le client
Light
Garage
Door
execute()
execute()
RemoteLoader
Stereo
RemoteControl
onCommands
offCommands
<<interface>>
Command
execute()
setCommand()
onButtonWasPushed()
offButtonWasPushed()
execute()
execute()
Light
Les actions de la mthode execute()
sont invoques sur le Receiver
Linvoker
127
Contrleur distant
on()
off()
off()
on()
128
LightOnCommand
execute()
LightOffCommand
Home-Automation :
Programmer le contrleur distant (20/28)
class RemoteControl{
Command onCommands[];
Command offCommands[];
public RemoteControl() {
onCommands = new Command[7];
offCommands = new Command[7];
Eviter la gestion de null
Command noCommand = new NoCommand();
for(int i=0;i<7;i++){
onCommands[i] = noCommand;
offCommands[i] = noCommand;
}
}
public void setCommand(int slot, Command onCommand,Command offCommand ){
onCommands[slot] = onCommand;
offCommands[slot] = offCommand;
}
public void onButtonWasPressed(int slot){
onCommands[slot].execute();
}
public void offButtonWasPressed(int slot){
offCommands[slot].execute();
}
public String toString(){
String s="";
for(int i=0;i<7;i++){
s+="Slot["+i+"] "+onCommands[i].getClass().getName() +"
"+offCommands[i].getClass().getName()+"\n";
} return s;
}}
129
class RemoteLoader{
public static void main(String arg[]){
RemoteControl remoteControl = new RemoteControl();
Light livingRoomLight=new Light();
LightOnCommand livingRoomLightOnCommand = new
LightOnCommand(livingRoomLight);
LightOffCommand livingRoomLightOffCommand = new
LightOffCommand(livingRoomLight);
remoteControl.setCommand(0, livingRoomLightOnCommand,livingRoomLightOffCommand);
remoteControl.onButtonWasPressed(0);
remoteControl.offButtonWasPressed(0);
Stereo stereo = new Stereo();
StereoOnWithCDCommand stereoOnWithCDCommand = new
StereoOnWithCDCommand(stereo);
StereoOffCommand stereoOffCommand = new StereoOffCommand(stereo);
remoteControl.setCommand(1,stereoOnWithCDCommand,stereoOffCommand);
remoteControl.onButtonWasPressed(1);
remoteControl.offButtonWasPressed(1);
System.out.println(remoteControl.toString());
}
}
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Light.java, Stereo.java
LightOnCommand,.java LightOffCommand.java,
StereoOnWithCDCommand.java, StereoOffCommand.java
class LightOnCommand
implements Command {
Light light;
public LightOnCommand(Light
light){
this.light = light;
}
public void execute(){
light.on();
}
}
130
Home-Automation :
Tester le contrleur (22/28)
131
Home-Automation :
Programmer les commandes (21/28)
class StereoOnWithCDCommand
implements Command {
Stereo stereo;
public StereoOnWithCDCommand(Stereo
stereo){
this.stereo = stereo;
}
public void execute(){
stereo.on();
stereo.setCD();
stereo.setVolume(11);
}
}
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Home-Automation :
Undo: Annuler la dernire opration (23/28)
Home-Automation :
Undo: Annuler la dernire opration (24/28)
class RemoteControl{
Command onCommands[];
Command offCommands[];
Cest ou on stockera la dernire
Command undoCommand;
commande excute pour le bouton undo
public RemoteControl() {
onCommands = new Command[7];
offCommands = new Command[7];
Command noCommand = new NoCommand();
for(int i=0;i<7;i++){
onCommands[i] = noCommand;
offCommands[i] = noCommand;
}
Initialisation NoCommand afin
undoCommand = noCommand; }
dviter le traitement de null
public void onButtonWasPressed(int slot){
onCommands[slot].execute();
undoCommand = onCommands[slot];
}
Enregistrer la dernire commande
public void offButtonWasPressed(int slot){
offCommands[slot].execute();
undoCommand = offCommands[slot];
}
Lorsquon appuie sur le bouton undo, on
public void undoButtonWasPressed(){
invoque la mthode undo() pour annuler
undoCommand.undo();
}
la dernire commande excute
} 133
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
Home-Automation :
La Macro-Commande (26/28)
Home-Automation :
Tester le contrleur avec UNDO (25/28)
Annuler lallumage de la lumire
class RemoteLoader{
public static void main(String arg[]){
//
remoteControl.onButtonWasPressed(0);
remoteControl.undoButtonWasPressed();
//
remoteControl.onButtonWasPressed(1);
remoteControl.offButtonWasPressed(1);
System.out.println(remoteControl.toString());
}
}
134
Home-Automation :
MacroCommand (27/28)
Crer les macro-commandes
Command [] on = {lightOnCommand, stereoOnWithCDCommand, tvOnCommand};
Command [] off = {lightOffCommand, stereoOffWithCDCommand, tvOffCommand};
Excuter la macro-commande
System.out.println("Macro On");
remoteControl.onButtonWasPushed(2);
System.out.println("Macro Off");
remoteControl.offButtonWasPushed(2);
136
Rcapitulatif (1/2)
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
execute()
execute()
execute()
execute()
execute()
execute()
execute()
138
Rcapitulatif (2/2)
Exercice 1
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()
140
Exercice 2
Le Modle-VueContrleur
141
142
Architecture Modle/Vue/Contrleur
Le Modle
143
144
La Vue
Le Contrleur
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.
145
146
Flux de traitement
147
le contrleur peut alors envoyer des requtes toutes les vues de manire ce
qu'elles se mettent jour.
PizzaStore :
Crer des pizzas (1/37)
Pizzeria: Crer des pizzas
Pizza orderPizza(){
Pizza pizza=new Pizza();
Le patron
"Factory"
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
149
150
PizzaStore :
Plusieurs types de pizza (2/37)
On passe le type du pizza travers
le mthode orderPizza()
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
if (type.equals("cheese"){
pizza=new CheesePizza();
} else if (type.equals("greek"){
pizza=new GreekPizza();
} else if (type.equals("pepperoni"){
pizza=new PepperoniPizza();
}
}
151
PizzaStore :
Autres types de pizza (3/37)
152
PizzaStore :
Encapsuler la cration (4/37)
PizzaStore :
Un Simple Factory (5/37)
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;
}
}
}
153
154
OnRiadh
attribue
le nom Factory
ce nouvel
objet
BEN HALIMA&Wajdi
LOUATI
[Design patterns]
PizzaStore :
Retravaillons la classe PizzaStore (6/37)
PizzaStore :
Le diagramme de classes (7/37)
Elle doit tre la seule partie de
notre application qui pointe vers les
classes des pizzas concrtes
PizzaStore rcupre la
rfrence du factory
travers le constructeur.
PizzaStore
orderPizza()
SimplePizzaFactory
createPizza()
La mthode de cration
est souvent statique
pizza=factory.createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
CheesePizza
PepperoniPizza
ClamPizza
}
Chaque produit implmente la classe abstraite Pizza
PizzaStore :
Franchise de PizzaStore (8/37)
PizzaStore :
Diffrent styles des PizzaStores (9/37)
Conception: OO
PizzaStore :
Le framework de PizzaStore (10/37)
158
PizzaStore :
Les styles de pizzas (11/37)
PizzaStore
createPizza()
orderPizza()
pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
abstract Pizza createPizza(String type);
}
159
SfaxStylePizzaStore
TunisStylePizzaStore
createPizza()
createPizza()
PizzaStore :
Un PizzaStore de Style Sfaxien (12/37)
PizzaStore :
Commander des pizzas (13/37)
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
PizzaStore tunisps =
new TunisStylePizzaStore();
sfaxps.orderPizza("cheese");
PizzaStore :
Implmenter (15/37)
PizzaStore :
Commander des pizzas (14/37)
tunisps.orderPizza("cheese");
PizzaStore sfaxps =
new SfaxStylePizzaStore();
Dcouplage du code du client dans la supre classe de la cration de lobjet dans les sousclasses
161
sfaxps.orderPizza("cheese");
PizzaStore
createPizza()
orderPizza()
SfaxStylePizzaStore
createPizza()
Pizza pizza= createPizza("cheese");
On termine la prparation
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
De style tunisien
TunisStylePizzaStore
createPizza()
163
Factory Method
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
Les crateurs
164
TunisStylePepperoniPizza
PizzaStore :
Le patron Factory Method (16/37)
Dfinition:
Factory Method
PizzaStore :
Le diagramme de classes du patron (17/37)
La classe mre de tous les produits
concrets. Elle reprsente aussi le type
gnrique qui rfrence vers les
instances des classes concrtes
Product
La mthode abstraite
facotoryMethod() que tous
les drivs de la classe
Creator implmentent
factoryMethod()
anOperation()
ConcretProduct
ConctretCreator
Le ConcretCreator
implmente la mthode
facotoryMethod(), qui
produit les produits
factoryMethod()
Le ConcretCreator est responsable de la cration de produits
concrets. Cest la classe qui connait le qui a cr chaque produit
165
166
PizzaStore :
Un PizzaStore dpendant (18/37)
La dcision: choix
du produit concret
PizzaStore :
La dpendance entre les objets (19/37)
Cette version de PizzaStore dpend de tous les objets pizzas parce quelle les cre
directement
On dit que PizzaStore dpend des implmentations des pizzas parce que chaque
changement des implmentations concrtes des pizzas, affecte le PizzaStore
Si les implmentations des pizzas
changent, on doit modifier PizzaStore
PizzaStore :
Linversion de dpendance (20/37)
PizzaStore :
Les ingrdients des pizzas (22/37)
PizzaStore :
Appliquons ce principe (21/37)
171
Le "Factory Method"
est la technique la plus
puissante dadhrence
au principe dinversion
de dpendance, mais
pas la seule...
170
PizzaStore :
Les menus des pizzas (23/37)
Sfax
Pizza Menu
Cheese Pizza
Sauce marinara, Parmesan,
Emmental
Clam Pizza
Sauce marinara, Parmesan,
Clovis, Olive verte
Pepperoni Pizza
Sauce marinara, Parmesan,
Aubergine, Poivron, Olive verte
Tunis
Pizza Menu
Cheese Pizza
Sauce tomate prune, Mozzarella,
Roquefort
Clam Pizza
Sauce tomate prune, Mozzarella,
Palourde, Olive noire
Pepperoni Pizza
Sauce tomate prune, Mozzarella,
pinard, Poivre, Olive noire
172
PizzaStore :
Les familles des ingrdients (24/37)
Chaque famille correspond un
type de sauce, un type de
fromage, un type de lgume, et un
type dolive (et dautres types)
PizzaStore :
Les factories des ingrdients (25/37)
Tunis
PlumTomatoSauce
Spinach
Mozzarella
BlackOlive
Sfax
MarinaraSauce
Eggplant
173
Parmesan
GreenOlive
PizzaStore :
Les factories de Sfax (26/37)
public class SfaxPizzaIngredientFactory implements PizzaIngredientFactory
{
public Dough createDough(){
return new ThinDough();
Pour chaque famille dingrdient, on
}
cre la version sfaxienne
public Sauce createSauce(){
return new MarinaraSauce();
}
public Cheese createCheese(){
return new Parmesan();
}
public Veggies[] createVeggies(){
Veggies veggies[]={new Garlic(), new Onion(), new Eggplant()};
return veggies;
}
public Clam createClam(){
return new Clovis();
}
Palourde() pour le
}
cas de tunis
175
A faire :
Construire un facotry pour chaque rgion: une sous-classe de
PizzaIngredientFactory qui implmente chaque create() mthode
Implmenter un ensemble de classes dingrdients, utiliser par les
factories tels que: OliveVerte, Mozzarella, SauseMarinara, etc.
Lier ceci avec notre ancien code de PizzaStore, tout en travaillant
nos factories dingrdients
174
PizzaStore :
Retravaillons la classe Pizza (27/37)
public abstract class Pizza {
Les ingrdients dune paizza
String name;
(liste non-exhaustive)
Dough dough;
Sauce sauce;
La collecte des ingrdients se fait dans cette
Cheese cheese;
mthode ( travers un factory dingrdients)
Veggies veggies[];
qui sera dfinie par les classes drives
Clam clam;
abstract void prepare();
void bake(){
System.out.println("Cuire durant 25mn 350");}
void cut(){
System.out.println("Couper en morceaux la diagonale");}
void box(){
System.out.println("Placer la pizza dans un boitier officiel");}
void setName(String s){
name=s;}
Les autres mthodes sont les
String getName(){
mmes ( lexception de prepare())
return name;}
}
176
PizzaStore :
Retravaillons les classes des Pizzas (28/37)
PizzaStore :
Retravaillons les classes des Pizzas (29/37)
PizzaStore :
Retravaillons les PizzaStores (30/37)
}
Si cest le factory de sfax, on
va prparer des clovis
178
PizzaStore :
Factories (31/37)
Dfinit linterface
Offre les
implmentations
des ingrdients
Sfax
Tunis
PizzaStore :
Commander des pizzas (33/37)
PizzaStore :
Commander des pizzas (32/37)
Je voudrai une pizza
de grande taille avec beaucoup
de fromage du style
tunisien
tunisps.orderPizza("cheese");
PizzaStore tunisps =
new TunisPizzaStore();
sfaxps.orderPizza("cheese");
PizzaStore sfaxps =
new SfaxPizzaStore();
sfaxps.orderPizza("cheese");
181
182
void prepare(){
dough = factory.createDough();
// Pte mince
sauce = factory.createSauce();
// Sauce marinara
cheese = factory.createCheese();
// Parmesan, Emmental
}
CheesePizza la tunisoise
CheesePizza la sfaxienne
Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]
PizzaStore :
Le patron Abstract Factory (35/37)
PizzaStore :
Commander des pizzas (34/37)
void prepare(){
dough = factory.createDough();
// Pte coustillante
sauce = factory.createSauce();
// Sauce tomate prune
cheese = factory.createCheese();
// Mozzarella, Roquefort
}
void prepare(){
void prepare(){
Dfinition:
Abstract Factory
pizza.bake();
pizza.cut();
pizza.box();
183
De style tunisien
pizza.bake();
pizza.cut();
pizza.box();
184
PizzaStore :
Le diagramme de classes du patron (36/37)
PizzaStore :
La conception finale (37/37)
Client
Une famille de produits
<<interface>>
AbstractFactory
createProductA()
createProductB()
SfaxPizzaStore
<<interface>>
PizzaIngredientFactory
createSauce()
createCheese()
createClam()
//etc.
ProductA1
createProductA()
createProductB()
createProductA()
createProductB()
ProductB2
ProductB1
TunisPizzaIngred SfaxPizzaIngredi
ientFActory
entFactory
createSauce()
createSauce()
createCheese()
createCheese()
createClam()
createClam()
La tche des factories est de produire les
ingrdients spcifiques chaque rgion
186
Rcapitulatif (1/2)
Palourde
<<interface>>
Sauce
PlumTomatoSauce
<<interface>>
Cheese
Parmesan
Mozzarella
Rcapitulatif (2/2)
Clovis
MarinaraSauce
<<interface>>
AbstractProductB
ConcretFactory1 ConcretFactory2
<<interface>>
Clam
<<interface>>
AbstractProductA
ProductA2