Intitulé du module :
Modélisation orientée objet et motifs de conception
Licence professionnelle (S5)
Filière : Génie Informatique et Gouvernance Digitale
Pr. KORCHIYNE Redouan
ANNÉE UNIVERSITAIRE : 2023/2024
Partie II
LES PATRONS DE CONCEPTION
(Design Patterns)
Définition
Un patron de conception (Design Pattern : DP) est une solution à un
problème récurrent dans la conception d’applications orientées
objet.
Un patron de conception décrit alors la solution éprouvée pour
résoudre ce problème d’architecture de logiciel.
Exemple :
Conception d’une application où il sera facile d’ajouter des fonctionnalités à
une classe sans la modifier.
Note :
Les Design Patterns sont indépendants des langages de programmation
utilisés.
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
3 Pr. Korchiyne Redouan
Définition…
Les cas les plus généraux sont référencés dans un
ouvrage considéré comme majeur : Design
Patterns, de Gamma et al. (appelé aussi le Gang of
Four - GoF)
Le premier Design Pattern connu est le MVC
Modèle-Vue-Contrôleur et qui permet d’obtenir
un couplage faible entre le cœur fonctionnel
d’une application et son interface.
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
4 Pr. Korchiyne Redouan
Représentation d’un DP
Les Design Patterns sont représentés par :
Nom : qui permet de l’identifier clairement
Problématique : description du problème auquel il
répond
Solution : description de la solution souvent
accompagnée d’un schéma UML
Conséquences : les avantages et les inconvénients de
cette solution
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
5 Pr. Korchiyne Redouan
Les avantages
Permet de répondre à un problème de conception grâce à une solution
éprouvée et validée par des experts.
➔ Gain en rapidité et en qualité de conception ce qui diminue également les coûts.
Les DP sont réutilisables et permettent de mettre en avant les bonnes
pratiques de conception.
Les DP étant largement documentés et connus d’un grand nombre de
développeurs ils permettent également de faciliter la communication.
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
6 Pr. Korchiyne Redouan
Organisation des patrons de conception
Les patrons de conception sont classés en trois
catégories :
Création : ils permettent d’instancier et de
configurer des classes et des objets.
Structure : ils permettent d’organiser les classes
d’une application.
Comportement : ils permettent d'organiser les
objets pour qu’ils collaborent entre eux.
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
7 Pr. Korchiyne Redouan
DP de Création (construction)
Les DP de Création/Construction : se préoccupent de
régler des problèmes liés à la création ou l’instanciation des
objets :
Abstract Factory,
Builder,
Factory Method,
Prototype,
Singleton
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
8 Pr. Korchiyne Redouan
DP de Structure
Les DP de Structure : s’occupent des questions relatives
au découplage des concepts et à l’organisation structurelle
des concepts manipulés par un logiciel.
Adapter,
Bridge,
Composite,
Decorator,
Facade,
Flyweight,
Proxy
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
9 Pr. Korchiyne Redouan
DP de Comportement
Les DP de Comportement : ont pour sujet principal l’organisation
de la collaboration des objets.
Observer, Iterator,
Strategy, Mediator,
Callback, Memento,
Chain of State,
Responsability, Template Method,
Command, Visitor
Interpreter,
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
10 Pr. Korchiyne Redouan
CRÉATION (Creational DP)
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
11 Pr. Korchiyne Redouan
FACTORY METHOD
Fabrique / factory method : ce motif résout la question
de la dépendance d’un code vis-à-vis de la classe
d’instanciation d’un objet.
L’existence d’une classe abstraite, redéfinie en différentes
classes concrètes est un trait qui doit faire se poser la
question de l’usage de ce motif
➔la classe abstraite permet de manipuler de façon abstraite les
objets, mais leur création/instanciation nécessite l’usage
explicite de la classe (c’est nécessaire).
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
12 Pr. Korchiyne Redouan
FACTORY METHOD
Le pattern « méthode de fabrication » est une version
simplifiée de « la fabrique abstraite »
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
13 Pr. Korchiyne Redouan
FACTORY METHOD : Exemple
class Class Mo...
Voiture
Program
+ getMarque() : String ~ f(Voiture) : void
+ toString() : String + main(String[]) : void
Fiat Renault
+ getMarque() : String + getMarque() : String
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
14 Pr. Korchiyne Redouan
FACTORY METHOD (1) : Java
abstract class Voiture {
public abstract String getMarque();
public String toString() {
return getMarque();
}
}
public class Renault extends Voiture {
@Override
public String getMarque() {
return "Renault";
}
}
public class Fiat extends Voiture {
@Override
public String getMarque() {
return "Fiat";
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
15 Pr. Korchiyne Redouan
FACTORY METHOD (1) : Java
public class Program {
static void f(Voiture v) {
[Link]("Voiture " + v);
}
public static void main(String[] args) {
Voiture v = new Renault();
f(v);
}
}
Voiture Renault
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
16 Pr. Korchiyne Redouan
FACTORY METHOD
La méthode createVoiture est une méthode de fabrication
elle reçoit en paramètre les critères qui permettront au
concepteur des objets Voiture d’opérer le choix du type concret
dans le code client, les types concrets n’apparaissent plus.
Le code client est devenu entièrement indépendant des types
concrets.
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
17 Pr. Korchiyne Redouan
FACTORY METHOD : Exemple
class Class Mo...
Voiture Program
+ createVoiture(String) : Voiture ~ f(Voiture) : void
+ getMarque() : String + main(String[]) : void
+ toString() : String
Fiat Renault
+ getMarque() : String + getMarque() : String
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
18 Pr. Korchiyne Redouan
FACTORY METHOD (2) : Java
abstract class Voiture {
public abstract String getMarque();
public String toString() {
return getMarque();
}
// méthode statique pour créer un objet
public static Voiture createVoiture(String origine) {
if ([Link]("fr")) return new Renault();
if ([Link]("it")) return new Fiat();
return null;
}
}
public class Renault extends Voiture { ... }
public class Fiat extends Voiture { ... }
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
19 Pr. Korchiyne Redouan
FACTORY METHOD (2) : Java
public class Program {
static void f(Voiture v) {
[Link]("Voiture " + v);
}
public static void main(String[] args) {
Voiture v = [Link]("fr");
f(v);
}
}
Voiture Renault
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
20 Pr. Korchiyne Redouan
FABRIQUE ABSTRAITE (ABSTRACT FACTORY)
Une fabrique abstraite encapsule un groupe de fabriques ayant une
thématique commune.
Le code client crée une implémentation concrète de la fabrique
abstraite, puis utilise les interfaces génériques pour créer des objets
concrets de la thématique.
Le client ne se préoccupe pas de savoir laquelle de ces fabriques a donné
un objet concret, car il n'utilise que les interfaces génériques des objets
produits.
Ce patron de conception sépare les détails d'implémentation d'un
ensemble d'objets de leur usage générique.
Exemple : la classe DocumentCreator fournit une interface
permettant de créer différents produits
(e.g. createLetter() et createResume()).
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
21 Pr. Korchiyne Redouan
ABSTRACT FACTORY
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
22 Pr. Korchiyne Redouan
ABSTRACT FACTORY : Exemple
class Class Mo...
Program
~ application(Fabrique) : void
+ main(String[]) : void
Fabrique Voiture
Camionnette
+ createCamionnette() : Camionnette + getModele() : String
+ createVoiture() : Voiture + getModele() : String
+ toString() : String + toString() : String
Trafic Ducato CinqueCento Kangoo
+ getModele() : String + getModele() : String + getModele() : String + getModele() : String
FabriqueFrancaise FabriqueItalienne
+ createCamionnette() : Camionnette + createCamionnette() : Camionnette
+ createVoiture() : Voiture + createVoiture() : Voiture
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
23 Pr. Korchiyne Redouan
ABSTRACT FACTORY : Java
abstract class Voiture {
abstract public String getModele();
public String toString() {
return getModele();
}
}
public class Kangoo extends Voiture {
@Override
public String getModele() {
return "Kangoo";
}
}
public class CinqueCento extends Voiture {
@Override
public String getModele() {
return "500";
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
24 Pr. Korchiyne Redouan
ABSTRACT FACTORY : Java
abstract class Camionnette {
abstract public String getModele() ;
public String toString(){
return getModele();
}
}
public class Trafic extends Camionnette {
@Override
public String getModele() {
return "Trafic";
}
}
public class Ducato extends Camionnette {
@Override
public String getModele() {
return "Ducato";
}
COO
} & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
25 Pr. Korchiyne Redouan
ABSTRACT FACTORY : Java
abstract class Fabrique {
abstract public Voiture createVoiture();
abstract public Camionnette createCamionnette();
}
public class FabriqueFrancaise extends Fabrique {
@Override
public Voiture createVoiture() { return new Kangoo(); }
@Override
public Camionnette createCamionnette() { return new Trafic(); }
}
public class FabriqueItalienne extends Fabrique {
@Override
public Voiture createVoiture() { return new CinqueCento(); }
@Override
public Camionnette createCamionnette() { return new Ducato(); }
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
26 Pr. Korchiyne Redouan
ABSTRACT FACTORY : Java
public class Program {
static void application(Fabrique f) {
Voiture v = [Link]();
Camionnette c = [Link]();
[Link](v);
[Link](c);
}
public static void main(String[] args) {
FabriqueItalienne fi = new FabriqueItalienne();
application(fi);
FabriqueFrancaise fr = new FabriqueFrancaise();
application(fr);
}
500
}
Ducato
Kangoo
Trafic 2023/2024
COO & MC. Filiere LP (S5), EST-Kenitra,
27 Pr. Korchiyne Redouan
PROTOTYPE
Utilisé lorsque le coût de fabrication d’un objet est lourd et
qu’il est plus facile de dupliquer (cloner) un objet existant et
à modifier la copie ensuite :
la modification de la copie peut intervenir à deux endroits
différents :
dans la méthode de clonage (donc au moment du clonage)
dans le code client (donc après le clonage)
La méthode de construction est habituellement appelée
clone()
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
28 Pr. Korchiyne Redouan
PROTOTYPE
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
29 Pr. Korchiyne Redouan
PROTOTYPE : Exemple
class Class Mo...
Animal Program
+ clone() : Animal ~ cloningMachine(Animal) : Animal
+ print() : void + main(String[]) : void
Souris Mouton
+ clone() : Animal + clone() : Animal
+ print() : void + print() : void
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
30 Pr. Korchiyne Redouan
PROTOTYPE : Java
abstract class Animal {
abstract public Animal clone();
abstract public void print();
}
public class Mouton extends Animal {
@Override
public Animal clone() {
Mouton m = [Link]();
return m;
}
@Override
public void print() {
[Link](« un mouton");
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
31 Pr. Korchiyne Redouan
PROTOTYPE : Java
public class Souris extends Animal {
@Override
public Animal clone() {
Souris s = [Link]();
return s;
}
@Override
public void print() {
[Link]("une souris");
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
32 Pr. Korchiyne Redouan
PROTOTYPE : Java
public class Program {
static Animal cloningMachine(Animal a) {
return [Link]();
}
public static void main(String[] args) {
Mouton m = new Mouton();
cloningMachine(m).print();
}
}
un mouton
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
33 Pr. Korchiyne Redouan
Monteur (BUILDER)
Le monteur (builder) utilisé pour la création d'une variété
d'objets complexes à partir d'un objet source.
L'objet source peut consister en une variété de parties
contribuant individuellement à la création de chaque objet
complet grâce à un ensemble d'appels à l'interface commune
de la classe abstraite Monteur.
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
34 Pr. Korchiyne Redouan
BUILDER
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
35 Pr. Korchiyne Redouan
BUILDER : Exemple
class Class Mo...
MonteurVoiture Voiture
# v: Voiture - portiere: String
#v - siege: String
+ addPortiere() : void
+ addSiege() : void -monteur + setPortiere(String) : void
+ createVoiture() : void + setSiege(String) : void
+ getVoiture() : Voiture + ToString() : String
Atelier
MonteurVoitureOrdinaire MonteurVoitureLuxe
- monteur: MonteurVoiture
+ addPortiere() : void + addPortiere() : void
+ addSiege() : void + addSiege() : void + Atelier(MonteurVoiture)
+ doTheJob() : Voiture
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
36 Pr. Korchiyne Redouan
BUILDER : Java
class Voiture {
private String portiere;
private String siege;
public void setPortiere(String p) {
portiere = p;
}
public void setSiege(String s) {
siege = s;
}
public String ToString() {
return "Portiere en " + portiere + " et siege en " + siege;
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
37 Pr. Korchiyne Redouan
BUILDER : Java
abstract class MonteurVoiture {
protected Voiture v;
public void createVoiture() { v = new Voiture(); }
public Voiture getVoiture() { return v; }
public abstract void addPortiere();
public abstract void addSiege();
}
public class MonteurVoitureLuxe extends MonteurVoiture {
@Override
public void addPortiere() {
[Link]("acier blinde");
}
@Override
public void addSiege() {
[Link]("cuir");
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
38 Pr. Korchiyne Redouan
BUILDER : Java
public class MonteurVoitureOrdinaire extends MonteurVoiture {
@Override
public void addPortiere() {
[Link]("tole");
}
@Override
public void addSiege() {
[Link]("tissu");
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
39 Pr. Korchiyne Redouan
BUILDER : Java
class Atelier {
private MonteurVoiture monteur;
public Atelier(MonteurVoiture m) { monteur = m; }
public Voiture doTheJob() {
[Link]();
[Link]();
[Link]();
return [Link]();
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
40 Pr. Korchiyne Redouan
BUILDER : Java
public class Program {
public static void main(String[] args) {
MonteurVoitureLuxe m = new MonteurVoitureLuxe();
Atelier a = new Atelier(m);
[Link]([Link]());
}
}
Portiere en acier blinde et siege en cuir
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
41 Pr. Korchiyne Redouan
SINGLETON
Le singleton est utilisé pour restreindre l'instanciation d'une
classe à un seul objet (ou bien à quelques objets seulement).
On implémente le singleton en écrivant une classe contenant
une méthode qui crée une instance uniquement s'il n'en
existe pas encore sinon elle renvoie une référence vers l'objet
qui existe déjà.
Dans les langages OO, il faudra veiller à ce que le
constructeur de la classe soit privé.
Le singleton doit être implémenté avec précaution dans les
applications multi-thread.
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
42 Pr. Korchiyne Redouan
SINGLETON
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
43 Pr. Korchiyne Redouan
SINGLETON : Exemple
class Class Mo...
Logger -theUniqueLogger
Program
- theUniqueLogger: Logger = new Logger()
+ f() : void
+ g() : void + getLogger() : Logger
+ main(String[]) : void + log(String) : void
- Logger()
- Logger(Logger)
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
44 Pr. Korchiyne Redouan
SINGLETON : Java
class Logger {
private static Logger theUniqueLogger = new Logger();
private Logger() { } // rend impossible l’instanciation
private Logger(Logger l) { } // rend impossible la copie
public void log(String message) {
[Link](message);
}
// synchronized pour le multithread
public static synchronized Logger getLogger() {
return theUniqueLogger;
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
45 Pr. Korchiyne Redouan
SINGLETON : Java
public class Program {
public static void f() {
Logger l = [Link]();
[Link]("je suis dans f");
}
public static void g() {
Logger l = [Link]();
[Link]("je suis dans g");
}
public static void main(String[] args) {
Logger l = [Link]();
[Link]("demarrage");
f();
g();
demarrage
}
je suis dans f
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024 je suis dans g
46 Pr. Korchiyne Redouan
STRUCTURE
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
47 Pr. Korchiyne Redouan
ADAPTER
Le pattern adaptateur/adapter permet de convertir
l’interface d’un objet en une autre interface (transtypage).
Pour des raisons de compatibilité (reprendre une ancienne
classe mais l’adapter à une nouvelle interface de
manipulation).
Pour une question de réutilisabilité (récupérer un objet dans
un autre cadre que pour lequel il a été défini).
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
48 Pr. Korchiyne Redouan
ADAPTER
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
49 Pr. Korchiyne Redouan
ADAPTER : Exemple
class Class Mo...
Chargeur «interface»
IChargeable
- telephone: IChargeable -telephone
+ Recharger(int) : void
- voltage: int = 10 {readOnly}
+ brancherPortable(IChargeable) : void
AdaptateurSamSaoule AdaptateurSonneEricSonne
- telephone: PortableSamSaoule - telephone: PortableSonneEricSonne
+ AdaptateurSamSaoule(PortableSamSaoule) + AdaptateurSonneEricSonne(PortableSonneEricSonne)
+ Recharger(int) : void + Recharger(int) : void
PortableDeTest
-telephone -telephone
+ Recharger(int) : void
PortableSamSaoule PortableSonneEricSonne
+ ChargerPortable(int) : void + ChargerBatteries(int) : void
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
50 Pr. Korchiyne Redouan
ADAPTER : Java
public interface IChargeable {
void Recharger(int volts);
}
public class Chargeur {
private IChargeable telephone;
private final int voltage = 10;
public void brancherPortable(IChargeable portable) {
[Link]("branchement d'un portable");
[Link] = portable;
[Link](voltage);
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
51 Pr. Korchiyne Redouan
ADAPTER : Java
public class PortableSamSaoule {
// ne se recharge qu'avec du 5 volts
public void ChargerPortable(int volts) {
[Link]("Portable SamSaoule en charge");
[Link]("voltage : " + volts);
}
}
public class PortableSonneEricSonne {
// ne se recharge qu'avec du 10 volts
public void ChargerBatteries(int volts) {
[Link]("Portable SonneEricSonne en charge");
[Link]("voltage : " + volts);
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
52 Pr. Korchiyne Redouan
ADAPTER : Java
public class AdaptateurSamSaoule implements IChargeable {
// référence sur le portable adapté
private PortableSamSaoule telephone;
public AdaptateurSamSaoule(PortableSamSaoule portable) {
[Link] = portable;
}
// le portable SamSaoule n'a besoin que de 5 volts
public void Recharger(int volts) {
// on modifie le voltage
int nouveauVoltage = volts > 5 ? 5 : volts;
[Link](nouveauVoltage);
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
53 Pr. Korchiyne Redouan
ADAPTER : Java
public class AdaptateurSonneEricSonne implements IChargeable {
// référence sur le portable adapté
private PortableSonneEricSonne telephone;
public AdaptateurSonneEricSonne(
PortableSonneEricSonne portable) {
[Link] = portable;
}
public void Recharger(int volts) {
[Link](volts);
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
54 Pr. Korchiyne Redouan
ADAPTER : Java
public class Program {
public static void main(String[] args) {
// on crée le chargeur
Chargeur chargeur = new Chargeur();
// on crée le portable et son adaptateur
PortableSonneEricSonne portableSonne = new PortableSonneEricSonne();
AdaptateurSonneEricSonne adapateurSonne = new AdaptateurSonneEricSonne(
portableSonne);
// on donne le portable à charger mais en utilisant son adaptateur
[Link](adapateurSonne);
// on crée le portable et son adaptateur
PortableSamSaoule portableSam = new PortableSamSaoule();
AdaptateurSamSaoule adapateurSam = new AdaptateurSamSaoule(portableSam);
// on donne le portable à charger mais en utilisant son adaptateur
[Link](adapateurSam);
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
55 Pr. Korchiyne Redouan
BRIDGE
Le pont (BRIDGE) est un DP de la famille "Structuration", qui permet
de découpler l'interface d'une classe et son implémentation.
La partie "Concrète" (implémentation réelle) peut alors varier,
indépendamment de celle "Abstraite" (définition virtuelle), tant qu'elle
respecte le contrat de réécriture associé qui les lie (obligation de se
conformer aux signatures des fonctions/méthodes, et de leurs fournir
un "corps physique" d'implémentation).
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
56 Pr. Korchiyne Redouan
BRIDGE : Java
public interface Drawer {
void drawRectangle(int x, int y, int l, int h);
}
public class Drawer1 implements Drawer {
@Override
public void drawRectangle(int x, int y, int l, int h) {
[Link]("Drawing 1");
[Link]("Ligne 1 : ("+x+","+y+","+x+l+","+y+")");
[Link]("Ligne 2 : ("+x+","+y+h+","+x+l+","+y+h+")");
[Link]("Ligne 3 : ("+x+","+y+","+x+","+y+h+")");
[Link]("Ligne 4 : ("+x+l+","+y+","+x+l+","+y+h+")");
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
57 Pr. Korchiyne Redouan
BRIDGE : Java
public class Drawer2 implements Drawer {
@Override
public void drawRectangle(int x, int y, int l, int h) {
[Link]("Drawing 2");
[Link]("Ligne 1 : ("+x+","+y+","+x+l+","+y+")");
[Link]("Ligne 2 : ("+x+l+","+y+","+x+l+","+y+h+")");
[Link]("Ligne 3 : ("+x+l+","+y+h+","+x+","+y+h+")");
[Link]("Ligne 4 : ("+x+","+y+h+","+x+","+y+")");
}
}
public abstract class Forme {
protected Drawer d;
protected Forme(Drawer d) { this.d = d; }
public abstract void draw();
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
58 Pr. Korchiyne Redouan
BRIDGE : Java
public class Rectangle extends Forme {
private int x, y, l, h;
public Rectangle(int x, int y, int l, int h, Drawer d) {
super(d); this.x = x; this.y = y; this.l = l; this.h = h;
}
public void draw() { [Link](x,y,l,h); }
}
public class RectangleBis extends Forme {
private int x, y, l, h;
public RectangleBis(int x, int y, int l, int h) {
super(new Drawer2()); this.x = x; this.y = y; this.l = l; this.h = h;
}
public void draw() { [Link](x,y,l,h); }
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
59 Pr. Korchiyne Redouan
BRIDGE : Java
public class Program {
public static void main(String[] args) {
Forme []s = new Forme[2];
s[0] = new Rectangle(0,0,1,1,new Drawer2());
s[1] = new RectangleBis(1,1,2,2);
for (int i=0; i<2; i++)
s[i].draw(); Drawing 1
} Ligne 1 : (0,0,1,0)
} Ligne 2 : (0,1,1,1)
Ligne 3 : (0,0,0,1)
Ligne 4 : (1,0,1,1)
Drawing 2
Ligne 1 : (1,1,3,1)
Ligne 2 : (3,1,3,3)
Ligne 3 : (3,3,1,3)
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024 Ligne 4 : (1,3,1,1)
60 Pr. Korchiyne Redouan
COMPOSITE
Est un pattern permettant de représenter des arborescences
et d’y réaliser des traitements uniformes.
Les composants des interfaces graphiques sont typiques de ce
pattern.
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
61 Pr. Korchiyne Redouan
COMPOSITE : Java
public abstract class Noeud {
protected String nom;
public Noeud(String nom){
[Link] = nom;
}
public abstract void afficher();
}
public class Fichier extends Noeud {
public Fichier(String nom){
super(nom);
}
@Override
public void afficher() {
[Link]("Ficher : " + nom);
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
62 Pr. Korchiyne Redouan
COMPOSITE : Java
import [Link];
public class Repertoire extends Noeud {
private Vector<Noeud> listeN = new Vector<Noeud>();
public Repertoire(String nom){
super(nom);
}
public void ajouter(Noeud...a){
for(Noeud n : a)
[Link](n);
}
public void afficher() {
[Link]("Repertoire : " + nom);
for(Noeud n : listeN)
[Link]();
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
63 Pr. Korchiyne Redouan
COMPOSITE : Java
public class Program {
public static void main(String[] args) {
Repertoire r1 = new Repertoire("Rep 1");
Repertoire r2 = new Repertoire("Rep 2");
Repertoire r3 = new Repertoire("Rep 3");
Repertoire r4 = new Repertoire("Rep 4");
Fichier f1 = new Fichier("File 1"); Fichier f2 = new Fichier("File 2");
Fichier f3 = new Fichier("File 3"); Fichier f4 = new Fichier("File 4");
Fichier f5 = new Fichier("File 5"); Fichier f6 = new Fichier("File 6");
Fichier f7 = new Fichier("File 7"); Repertoire : Rep 1
[Link](f1, r2, r3); Ficher : File 1
[Link](f2, r4, f3); Repertoire : Rep 2
[Link](f4, f5); Ficher : File 2
[Link](f6, f7); Repertoire : Rep 4
[Link](); Ficher : File 6
} Ficher : File 7
Ficher : File 3
}
Repertoire : Rep 3
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024 Ficher : File 4
64 Pr. Korchiyne Redouan Ficher : File 5
DECORATOR
Le pattern décorateur permet d’embellir fonctionnellement
des objets existants. Cette alternative à la dérivation (qui
n’est pas toujours possible) est plus flexible
on rencontre fréquemment ce pattern dans les hiérarchies
d’entrées/sorties
ou les interfaces graphiques
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
65 Pr. Korchiyne Redouan
DECORATOR
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
66 Pr. Korchiyne Redouan
DECORATOR : Java
public interface Boisson {
public void print();
}
public class Eau implements Boisson {
@Override
public void print() {
[Link]("Eau");
}
}
public class Lait implements Boisson {
@Override
public void print() {
[Link]("Lait");
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
67 Pr. Korchiyne Redouan
DECORATOR : Java
public class Additif implements Boisson {
Boisson b;
public Additif(Boisson b) {
this.b = b;
} public void print() {
if (b != null) {
[Link](); [Link]('+');
}
}
}
public class Sucre extends Additif {
public Sucre(Boisson b) {
super(b);
}
public void print(){
[Link](); [Link]("sucre");
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
68 Pr. Korchiyne Redouan
DECORATOR : Java
public class Glacon extends Additif {
public Glacon(Boisson b) {
super(b);
}
public void print(){
[Link](); [Link]("Glacon");
}
}
public class CafeSoluble extends Additif {
public CafeSoluble(Boisson b) {
super(b);
}
public void print(){
[Link](); [Link]("CafeSoluble");
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
69 Pr. Korchiyne Redouan
DECORATOR : Java
public class Program {
public static void main(String[] args) {
Boisson b = new CafeSoluble(new Sucre(new Eau()));
[Link]();
[Link]();
Boisson b2 = new CafeSoluble(new Sucre(new Glacon(new Lait())));
[Link]();
[Link]();
}
}
eau+sucre+cafesoluble
lait+glacon+sucre+cafesoluble
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
70 Pr. Korchiyne Redouan
FACADE
Permet de simplifier l’utilisation d’un sous-système
complexe vue que :
➔ le sous-système contient de très/trop nombreux composants
➔ l’interface est très/trop compliquée et/ ou mal-conçue
Attention : Facade ne doit pas masquer le sous-système, il
doit juste offrir une simplification
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
71 Pr. Korchiyne Redouan
FACADE
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
72 Pr. Korchiyne Redouan
FLYWEIGHT
Poids-mouche est un pattern chargé d’éviter la création de
trop nombreuses instances de petites classes lorsque la
granularité conceptuelle le nécessite
l’exemple typique est celui du concept de caractère+attributs
dans un traitement de texte
l’idée est d’externaliser certaines données, ex. attributs
appeler une méthode prenant en paramètre les attributs
(internalisation dynamique)
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
73 Pr. Korchiyne Redouan
FLYWEIGHT
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
74 Pr. Korchiyne Redouan
Exemple Java
public interface IImagePion {
public void drawAt(int x, int y);
}
public class ImagePion implements IImagePion {
private String name;
public ImagePion(String name) {
[Link] = name;
[Link]("creation ImagePion " + name);
}
public void setName(String n) {
name = n;
}
@Override
public void drawAt(int x, int y) {
[Link](name + " at " + x + ',' + y);
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
75 Pr. Korchiyne Redouan
Exemple Java
public class FlyWeightPourJeu {
private static ImagePion blanc = null;
private static ImagePion noir = null;
public static ImagePion getImagePion(String n) {
if ([Link]("blanc")) {
if (blanc == null)
blanc = new ImagePion("blanc");
return blanc;
}
if ([Link]("noir")) {
if (noir == null)
noir = new ImagePion("noir");
return noir;
}
return null;
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
76 Pr. Korchiyne Redouan
Exemple Java
public abstract class Pion {
protected int x;
protected int y;
public Pion(int x, int y) {
this.x = x;
this.y = y;
}
abstract void draw();
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
77 Pr. Korchiyne Redouan
Exemple Java
public class PionBlanc extends Pion {
public PionBlanc(int x, int y) {
super(x, y); [Link]("Creation pion blanc");
}
@Override
void draw() {
ImagePion ip = [Link]("blanc");
[Link](x, y);
}
}
public class PionNoir extends Pion {
public PionNoir(int x, int y) {
super(x, y); [Link]("Creation pion noir");
}
@Override
void draw() {
ImagePion ip = [Link]("noir");
[Link](x, y);
}
} & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
COO
78 Pr. Korchiyne Redouan
Exemple Java
public class Program {
public static void main(String[] args) {
Pion []p = { new PionBlanc(1, 1),
new PionNoir(1, 2),
new PionBlanc(1, 3),
new PionNoir(1, 2), Creation pion blanc
new PionBlanc(3, 1), Creation pion noir
new PionBlanc(4, 2) }; Creation pion blanc
[Link]("avant draws"); Creation pion noir
for (int i = 0; i < 6; i++) Creation pion blanc
p[i].draw(); Creation pion blanc
} avant draws
} creation ImagePion blanc
blanc at 1,1
creation ImagePion noir
noir at 1,2
blanc at 1,3
noir at 1,2
blanc at 3,1
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024 blanc at 4,2
79 Pr. Korchiyne Redouan
FLYWEIGHT
La principale difficulté de Flyweight est de nécessiter de
repenser le concept concerné en éclatant les données en :
les données internes et qui identifieront les instances
les données externes et qui seront utilisées pour utiliser les
instances
les méthodes permettant de récupérer des instances recevront ces
données en paramètre
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
80 Pr. Korchiyne Redouan
PROXY
Délégation / mandataire / proxy est un pattern permettant
de manipuler à l’identique un objet caché à travers un
représentant
Les quatre cas d’utilisation courant sont :
Le Remote Proxy qui permet d’accéder à un objet distant
comme s’il était localement présent (stub)
Le Virtual Proxy qui permet de retarder les opérations
coûteuses jusqu’au moment où il est nécessaire de les effectuer
(deferred image loading)
le Smart Reference Proxy (smart pointer)
Le Access Proxy qui fournit un contrôle d’accès
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
81 Pr. Korchiyne Redouan
PROXY
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
82 Pr. Korchiyne Redouan
Exemple Java
public class Canape { }
public interface IVendeur {
int getCanape(Canape v);
}
public class Honnete implements IVendeur {
@Override
public int getCanape(Canape v) {
return 1750;
}
}
public class Escroc implements IVendeur {
@Override
public int getCanape(Canape v) {
return 19750;
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
83 Pr. Korchiyne Redouan
Exemple Java
public class Mandataire implements IVendeur {
private IVendeur vendeur;
public Mandataire() {
// Au début donner confiance...
vendeur = new Honnete();
}
@Override
public int getCanape(Canape v) {
int prix = [Link](v);
// C'est bon, ils ont confiance, je vais les escroquer
vendeur = new Escroc();
return prix;
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
84 Pr. Korchiyne Redouan
Exemple Java
public class Program {
static void acheteDeuxCanapes(IVendeur v) {
Canape c = new Canape();
int prix = [Link](c);
[Link]("J'ai eu un canape neuf pour " + prix);
if (prix>5000)
[Link]("Je me suis fait escroquer");
prix = [Link](c);
[Link]("J'ai eu un canape neuf pour " + prix);
if (prix>5000)
[Link]("Je me suis fait escroquer");
}
public static void main(String[] args) {
Honnete Ali = new Honnete();
Escroc Karim = new Escroc(); J'ai eu un canape neuf pour 1750
Mandataire Brahim = new Mandataire(); J'ai eu un canape neuf pour 1750
acheteDeuxCanapes(Ali); J'ai eu un canape neuf pour 19750
acheteDeuxCanapes(Karim); Je me suis fait escroquer
acheteDeuxCanapes(Brahim); J'ai eu un canape neuf pour 19750
}
}
Je me suis fait escroquer
J'ai eu un canape neuf pour 1750
J'ai eu un canape neuf pour 19750
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024 Je me suis fait escroquer
85 Pr. Korchiyne Redouan
COMPORTEMENT
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
86 Pr. Korchiyne Redouan
CHAIN OF RESPONSIBILITY
Le pattern chaîne de responsabilité est utilisé pour permettre
à un nombre d’objet quelconque de réaliser un traitement
Chaque objet capable de réaliser le traitement s’inscrit dans la
chaîne
La chaîne est parcourue jusqu’à trouver quelqu’un qui accepte
de prendre en charge le traitement
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
87 Pr. Korchiyne Redouan
CHAIN OF RESPONSIBILITY
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
88 Pr. Korchiyne Redouan
Exemple Java
public class Process {
Process next;
protected Process() {
next = null;
}
public void add(Process p) {
if (next != null)
[Link](p);
else
next = p;
}
public void doIt() {
if (next != null)
[Link]();
else
[Link]("Tout le monde s'en fiche. Traitement par
défaut...");
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
89 Pr. Korchiyne Redouan
Exemple Java
public class RealProcess extends Process {
public void doIt() {
if ([Link]() * 100 % 100 < 75) {
[Link]("non "); [Link]();
}
else
[Link]("Ok c'est bon je m'en occupe");
}
}
public class Chaine {
Process racine;
public Chaine(Process p) {
Racine = p;
}
Chaine add(Process p) {
[Link](p); return this;
}
void traiteRequete() {
if (racine != null) [Link]();
else [Link]("Personne pour s'en occuper");
}
}
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
90 Pr. Korchiyne Redouan
Exemple Java
public class Program {
public static void main(String[] args) {
RealProcess p1 = new RealProcess();
RealProcess p2 = new RealProcess();
RealProcess p3 = new RealProcess();
RealProcess p4 = new RealProcess();
RealProcess p5 = new RealProcess();
RealProcess p6 = new RealProcess();
Chaine c = new Chaine(p1);
[Link](p2).add(p3); Ok c'est bon je m'en occupe
[Link](); non
[Link]();
non
[Link](p4).add(p5).add(p6);
[Link](); non
} Tout le monde s'en fiche.
} Traitement par défaut...
non
non
non
non
Ok c'est bon je m'en occupe
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
91 Pr. Korchiyne Redouan
COMMAND
le pattern commande réifie les appels de méthodes en créant
des messages (objets)
typique des interfaces graphiques car ce pattern est une
version objet des callbacks
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
92 Pr. Korchiyne Redouan
COMMAND
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
93 Pr. Korchiyne Redouan
INTERPRETER
Interpréteur permet d’intégrer un langage à interpréter
Il facilite l’écriture d’expressions dans le langage du domaine
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
94 Pr. Korchiyne Redouan
INTERPRETER
COO & MC. Filiere LP (S5), EST-Kenitra, 2023/2024
95 Pr. Korchiyne Redouan