0% ont trouvé ce document utile (0 vote)
166 vues95 pages

Design Patterns en Génie Informatique

Transféré par

its.youssef.jabri
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
166 vues95 pages

Design Patterns en Génie Informatique

Transféré par

its.youssef.jabri
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi