SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
DDeessiiggnn PPaatttteerrnnss 
PPaarrtt 77 
Mohamed Youssfi 
Laboratoire Signaux Systèmes Distribués et Intelligence Artificielle (SSDIA) 
ENSET, Université Hassan II Casablanca, Maroc 
Email : med@youssfi.net 
Supports de cours : http://fr.slideshare.net/mohamedyoussfi9 
Chaîne vidéo : http://youtube.com/mohamedYoussfi 
Recherche : http://www.researchgate.net/profile/Youssfi_Mohamed/publications 
med@youssfi.net
PPaatttteerrnnss :: 
- FFaaccaaddee 
-- BBBBrrrriiiiddddggggeeee 
- FFllyyWWeeiigghhtt
Problème :: SSyyssttèèmmee ccoommpplleexxee 
Un sous système est complexe s’il fait appel à plusieurs interfaces 
Client Client Client 
med@youssfi.net 
A 
C 
B 
E F 
D 
Système complexe 
??!!
PPaatttteerrnn FFaaççaaddee 
Créer une seule façade pour ce sous-système. 
Facade 
Client 
Client Client 
med@youssfi.net 
A 
C 
B 
E F 
D 
Système complexe 
??!!
PPaatttteerrnn FFaaccaaddee 
 Catégorie : 
◦ Structure 
 Objectif du pattern 
◦ Fournir une interface unique en remplacement d'un 
eennsseemmbbllee dd''iinntteerrffaacceess dd''uunn ssoouuss--ssyyssttèèmmee.. 
◦ Définir une interface de haut niveau pour rendre le sous-système 
plus simple d'utilisation.. 
 Résultat : 
◦ Le Design Pattern permet d'isoler les 
fonctionnalités d'un sous-système utiles à la 
partie cliente. 
med@youssfi.net
Diagramme de ccllaasssseess dduu ppaatttteerrnn FFaaccaaddee 
med@youssfi.net
RRaaiissoonn dd’’uuttiilliissaattiioonn 
 Le système comporte un sous-système complexe avec 
plusieurs interfaces. 
 Certaines de ces interfaces présentent des opérations qui 
ne sont pas utiles au reste du système. 
 Cela peut être le cas d'un sous-système communiquant 
aavveecc ddeess oouuttiillss ddee mmeessuurree oouu dd''uunn ssoouuss--ssyyssttèèmmee dd''aaccccèèss àà 
la base de données. 
 Il serait plus judicieux de passer par une seule interface 
présentant seulement les opérations utiles. 
 Une classe unique, la façade, présente ces opérations 
réellement nécessaires. 
med@youssfi.net
RReessppoonnssaabbiilliittééss 
 ClasseA et ClasseB : implémentent diverses 
fonctionnalités. 
 Facade : présente certaines fonctionnalités. Cette classe 
utilise les implémentations des objets ClasseA et ClasseB. 
Elle expose une version simplifiée du sous-système 
CCllaasssseeAA--CCllaasssseeBB.. 
 La partie cliente fait appel aux méthodes présentées par 
l'objet Facade. Il n'y a donc pas de dépendances entre la 
partie cliente et le sous-système ClasseA-ClasseB. 
med@youssfi.net
IImmpplléémmeennttaattiioonn 
public class ClasseA { 
public void operation1(){ 
System.out.println(Opération 1 de la classe A); 
} 
public void operation2(){ 
System.out.println(Opération 2 de la classe A); 
} 
} 
/* ClasseA.java */ 
med@youssfi.net 
public class ClasseB { 
public void operation3(){ 
System.out.println(Opération 3 de la classe B); 
} 
public void operation4(){ 
System.out.println(Opération 4 de la classe B); 
} 
} 
/* ClasseB.java */
IImmpplléémmeennttaattiioonn 
/* Facade.java */ 
public class Facade { 
private ClasseA a=new ClasseA(); 
private ClasseB b=new ClasseB(); 
public void operation2(){ 
System.out.println(Opération 2 de Facade :); 
a.operation2(); 
} 
public void operation41(){ 
System.out.println(Opération 41 de Facade :); 
b.operation4(); 
a.operation1(); 
} 
} 
med@youssfi.net
IImmpplléémmeennttaattiioonn 
/* Application.java */ 
public class Application { 
public static void main(String[] args) { 
Facade facade=new Facade(); 
facade.operation2(); facade.operation41(); 
} 
} 
Opération 2 de Facade : 
Opération 2 de la classe A 
Opération 41 de Facade : 
Opération 4 de la classe B 
Opération 1 de la classe A 
med@youssfi.net 
::CClliieenntt 
::FFaaccaaddee 
Créer 
operation41 
::CCllaassssAA 
Créer 
operation4 
::CCllaassssBB 
Créer
PPAATTTTEERRNN 
BBBBRRRRIIIIDDDDGGGGEEEE 
med@youssfi.net
PPaatttteerrnn BBrriiddggee 
 Catégorie : 
◦ Structure 
 Objectif du pattern 
◦ Découpler l'abstraction d'un concept de son 
iimmpplléémmeennttaattiioonn.. 
◦ Permettre à l'abstraction et l'implémentation de varier 
indépendamment. 
 Résultat : 
◦ Le Design Pattern permet d'isoler le lien entre 
une couche de haut niveau et celle de bas niveau. 
med@youssfi.net
DDiiaaggrraammmmee ddee ccllaassssee 
med@youssfi.net
RRaaiissoonn dd’’uuttiilliissaattiioonn 
 Le système comporte une couche bas niveau réalisant 
l'implémentation et une couche haut niveau réalisant l'abstraction. Il 
est nécessaire que chaque couche soit indépendante. 
 Cela peut être le cas du système d'édition de documents d'une 
application. Pour l'implémentation, il est possible que l'édition 
aboutisse à une sortie imprimante, une image sur disque, un document 
PPDDFF,, eettcc...... 
 Pour l'abstraction, il est possible qu'il s'agisse d'édition de factures, de 
rapports de stock, de courriers divers, etc... 
 Chaque implémentation présente une interface pour les opérations de 
bas niveau standard (sortie imprimante) 
 Chaque abstraction hérite d'une classe effectuant le lien avec cette 
interface. 
 Ainsi les abstractions peuvent utiliser ce lien pour appeler la couche 
implémentation pour leurs besoins (imprimer facture). 
med@youssfi.net
RReessppoonnssaabbiilliittééss 
 Implementation : définit l'interface de l'implémentation. Cette 
interface n'a pas besoin de correspondre à l'interface de l'Abstraction. 
L'Implementation peut, par exemple, définir des opérations primitives 
de bas niveau et l'Abstraction des opérations de haut niveau qui 
utilisent les opérations de l'Implementation. 
 ImplementationA et ImplementationB : sont des sous-classes 
concrètes de l'implémentation. 
 Abstraction : définit l'interface de l'abstraction. Elle possède une 
rrééfféérreennccee vveerrss uunn oobbjjeett IImmpplleemmeennttaattiioonn.. CC''eesstt eellllee qquuii ddééffiinniitt llee lliieenn 
entre l'abstraction et l'implémentation. Pour définir ce lien, la classe 
implémente des méthodes qui appellent des méthodes de l'objet 
Implementation. 
 AbstractionA et AbstractionB : sont des sous-classes concrètes 
de l'abstraction. Elle utilise les méthodes définies par la classe 
Abstraction. 
 La partie cliente fournit un objet Implementation à l'objet 
Abstraction. Puis, elle fait appel aux méthodes fournit par l'interface de 
l'abstraction. 
med@youssfi.net
IImmpplléémmeennttaattiioonn 
package impl; 
public interface ImplementationInteface { 
public void operationImpl1(String p); 
public void operationImpl2(int p); 
} 
/* ImplementationInterface.java */ 
/* ImplementationA.java */ 
package impl; 
public class ImplemationA implements ImplementationInteface { 
@Override 
public void operationImpl1(String p) { 
System.out.println(operationImpl1 de ImplementationA :+p); 
} 
@Override 
public void operationImpl2(int p) { 
System.out.println(operationImpl2 de ImplementationA :+p); 
} 
} 
med@youssfi.net
IImmpplléémmeennttaattiioonn 
/* ImplementationB.java */ 
package impl; 
public class ImplemationB implements ImplementationInteface { 
@Override 
public void operationImpl1(String p) { 
System.out.println(operationImpl1 de ImplementationB :+p); 
} 
@Override 
public void operationImpl2(int p) { 
System.out.println(operationImpl2 de ImplementationB :+p); 
} 
} 
med@youssfi.net
IImmpplléémmeennttaattiioonn 
/* Abstraction.java */ 
package abs; 
import impl.ImplementationInteface; 
public abstract class Abstraction { 
private ImplementationInteface implementation; 
public void operationImpl1(String p) { 
implementation.operationImpl1(p); 
} 
public void operationImpl2(int p) { 
med@youssfi.net 
implementation.operationImpl2(p); 
} 
public Abstraction(ImplementationInteface implementation) { 
this.implementation = implementation; 
} 
public abstract void operation(); 
}
IImmpplléémmeennttaattiioonn 
/* AbstractionA.java */ 
package abs; 
import impl.ImplementationInteface; 
public class AbstractionA extends Abstraction{ 
public AbstractionA(ImplementationInteface implementation) { 
super(implementation); 
} 
@Override 
public void operation() { 
System.out.println(Méthode operation de AbstractionA); 
operationImpl1(X); 
operationImpl2(5); 
operationImpl1(Y); 
med@youssfi.net 
} 
}
IImmpplléémmeennttaattiioonn 
/* AbstractionB.java */ 
package abs; 
import impl.ImplementationInteface; 
public class AbstractionB extends Abstraction{ 
public AbstractionB(ImplementationInteface implementation) { 
super(implementation); 
} 
@Override 
med@youssfi.net 
public void operation() { 
System.out.println(Méthode operation de AbstractionB); 
operationImpl2(9); 
operationImpl2(4); 
operationImpl1(Z); 
} 
}
IImmpplléémmeennttaattiioonn 
/* Facade.java */ 
public class Facade { 
private ClasseA a=new ClasseA(); 
private ClasseB b=new ClasseB(); 
public void operation2(){ 
System.out.println(Opération 2 de Facade :); 
a.operation2(); 
} 
public void operation41(){ 
System.out.println(Opération 41 de Facade :); 
b.operation4(); 
a.operation1(); 
} 
} 
med@youssfi.net
IImmpplléémmeennttaattiioonn 
/* Application.java */ 
import abs.*; import impl.*; 
public class Application { 
public static void main(String[] args) { 
ImplementationInteface implA=new ImplemationA(); 
ImplementationInteface implB=new ImplemationB(); 
Abstraction absAA=new AbstractionA(implA); Abstraction absAB=new AbstractionA(implB); 
Abstraction absBA=new AbstractionB(implA); Abstraction absBB=new AbstractionB(implB); 
System.out.println(---------------------); absAA.operation(); 
System.out.println(---------------------); absAB.operation(); 
System.out.println(---------------------); absBA.operation(); 
System.out.println(---------------------); absBB.operation(); 
} } 
--------------------- 
Méthode operation de AbstractionA 
operationImpl1 de ImplementationA :X 
operationImpl2 de ImplementationA :5 
operationImpl1 de ImplementationA :Y 
--------------------- 
Méthode operation de AbstractionA 
operationImpl1 de ImplementationB :X 
operationImpl2 de ImplementationB :5 
operationImpl1 de ImplementationB :Y 
--------------------- 
Méthode operation de AbstractionB 
operationImpl2 de ImplementationA :9 
operationImpl2 de ImplementationA :4 
operationImpl1 de ImplementationA :Z 
--------------------- 
Méthode operation de AbstractionB 
operationImpl2 de ImplementationB :9 
operationImpl2 de ImplementationB :4 
operationImpl1 de ImplementationB :Z
PPAATTTTEERRNN 
FFFFLLLLYYYYWWWWEEEEIIIIGGGGHHHHTTTT 
PPOOIIDDSS MMOOUUCCHHEE 
med@youssfi.net
PPaatttteerrnn FFllyyWWeeiigghhtt 
 Catégorie : 
◦ Structure 
 Objectif du pattern 
◦ UUttiilliisseerr llee ppaarrttaaggee ppoouurr ggéérreerr eeffffiiccaacceemmeenntt uunn ggrraanndd 
nombre d' objets de faible granularité. 
 Résultat : 
◦ Le Design Pattern permet d'isoler des 
objets partageables. 
med@youssfi.net
DDiiaaggrraammmmee ddee ccllaassssee 
med@youssfi.net
RRaaiissoonn dd’’uuttiilliissaattiioonn 
 Un système utilise un grand nombre d' instances. Cette 
quantité occupe une place très importante en mémoire. 
 Or, chacune de ces instances a des attributs extrinsèques 
(propre au contexte) et intrinsèques (propre à l'objet). 
 Cela peut être les caractéristiques des traits dans un 
logiciel de DAO. 
 LLee ttrraaiitt aa uunnee ééppaaiisssseeuurr ((ssiimmppllee oouu ddoouubbllee)),, uunnee ccoonnttiinnuuiittéé 
(continu, en pointillé), une ombre ou pas, des coordonnées. 
Les caractéristiques d'épaisseur, de continuité et d'ombre 
sont des attributs intrinsèques à un trait, 
 Tandis que les coordonnées sont des attributs 
extrinsèques. 
 Plusieurs traits possèdent des épaisseurs, continuité et 
ombre similaires. Ces similitudes correspondent à des 
styles de trait. med@youssfi.net
RRaaiissoonn dd’’uuttiilliissaattiioonn 
 En externalisant les attributs intrinsèques des objets (style de trait), on 
peut avoir en mémoire une seule instance correspondant à un groupe 
de valeurs (simple-continu-sans ombre, double-pointillé-ombre). 
 Chaque objet avec des attributs extrinsèques (trait avec les 
coordonnées) possède une référence vers une instance d'attributs 
intrinsèques (style de trait). 
 OOnn oobbttiieenntt ddeeuuxx ttyyppeess ddee ppooiiddss--mmoouucchhee :: lleess ppooiiddss--mmoouucchhee ppaarrttaaggééss 
(style de trait) et les poids mouche non partagés (le trait avec ses 
coordonnées). 
 La partie cliente demande le poids-mouche qui l'intéresse à la fabrique 
de poids-mouche. S'il s'agit d'un poids mouche non partagé, la fabrique 
le créera et le retournera. 
 S'il s'agit d'un poids-mouche partagé, la fabrique vérifiera si une 
instance existe. Si une instance existe, la fabrique la retourne, sinon la 
fabrique la crée et la retourne. 
med@youssfi.net
RReessppoonnssaabbiilliittééss 
 PoidsMouche : déclare l'interface permettant à l'objet de recevoir et 
d'agir en fonction de données extrinsèques. On externalise les 
données extrinsèques d'un objet PoidsMouche afin qu'il puisse être 
réutilisé. 
 ConcretePoidsMouche : implémente l'interface poids-mouche. Les 
informations contenues dans un ConcretePoidsMouche sont 
intrinsèques (sans lien avec son contexte). Puisque, ce type de poids 
mouche est obligatoirement partagé. 
 CCoonnccrreetteePPooiiddssMMoouucchheeNNoonnPPaarrttaaggee :: iimmpplléémmeennttee ll''iinntteerrffaaccee 
poids-mouche. Ce type de poids-mouche n'est pas partagé. Il possède 
des données intrinsèques et extrinsèques. 
 PoidsMoucheFabrique : fournit une méthode retournant une 
instance de PoidsMouche. Si les paramètres de l'instance souhaitée 
correspondent à un PoidsMouche partagé, l'objet 
PoidsMoucheFabrique retourne une instance déjà existante. Sinon 
l'objet PoidsMoucheFabrique crée une nouvelle instance. 
 La partie cliente demande à PoidsMoucheFabrique de lui fournir un 
PoidsMouche. 
med@youssfi.net
IImmpplléémmeennttaattiioonn 
public interface PoidsMouche { 
public void afficher(String context); 
} 
/* PoidsMouche.java */ 
/* ImplementationA.java */ 
public class PoidsMoucheConcret implements PoidsMouche { 
private String valeur; 
public PoidsMoucheConcret(String valeur) { 
this.valeur = valeur; 
} 
@Override 
public void afficher(String context) { 
System.out.println(Poids mouche avec la valeur +valeur+ 
,context=+context); 
} 
} 
med@youssfi.net
IImmpplléémmeennttaattiioonn 
/* PoidsMoucheNonPartage.java */ 
public class PoidsMoucheNonPartage implements PoidsMouche { 
private String valeur1; 
private String valeur2; 
public PoidsMoucheNonPartage(String valeur1, String valeur2) { 
this.valeur1 = valeur1; 
this.valeur2 = valeur2; 
med@youssfi.net 
} 
@Override 
public void afficher(String context) { 
System.out.println(Poids mouche avec valeut1=+valeur1+ 
,valeur2=+valeur2); 
} 
}
IImmpplléémmeennttaattiioonn 
/* FabriquePoidsMouche.java */ 
import java.util.HashMap; 
import java.util.Map; 
public class FabriquePoidsMouche { 
private MapString, PoidsMouche poidsMouchesPartages= 
new HashMapString,PoidsMouche(); 
public FabriquePoidsMouche() { 
poidsMouchesPartages.put(je,new PoidsMoucheConcret(je)); 
poidsMouchesPartages.put(suis,new PoidsMoucheConcret(suis)); 
poidsMouchesPartages.put(poids,new PoidsMoucheConcret(poids)); 
poidsMouchesPartages.put(mouche,new PoidsMoucheConcret(mouche)); 
} 
med@youssfi.net 
public PoidsMouche getPoidsMouche(String val){ 
PoidsMouche pm=poidsMouchesPartages.get(val); 
if (pm==null){ 
pm=new PoidsMoucheConcret(val); 
poidsMouchesPartages.put(val, pm); 
} 
return pm; 
} 
public PoidsMouche getPoidsMouche(String val1,String val2){ 
return new PoidsMoucheNonPartage(val1, val2); 
} 
}
IImmpplléémmeennttaattiioonn 
/* Client.java */ 
public class Client { 
public static void main(String[] args) { 
FabriquePoidsMouche fabrique=new FabriquePoidsMouche(); 
PoidsMouche pm=fabrique.getPoidsMouche(poids); 
PoidsMouche pmBis=fabrique.getPoidsMouche(poids); 
System.out.println(------------------);pm.afficher(Context1); pmBis.afficher(Context2); 
System.out.println(pm==pmBis); System.out.println(------------------); 
PoidsMouche pm2=fabrique.getPoidsMouche(flyweight); 
PoidsMouche pm2Bis=fabrique.getPoidsMouche(flyweight); 
pm2.afficher(Context1); pm2Bis.afficher(Context2); 
System.out.println(pm2==pm2Bis); System.out.println(------------------); 
PoidsMouche pm3=fabrique.getPoidsMouche(A,B); 
PoidsMouche pm3Bis=fabrique.getPoidsMouche(A,B); 
pm3.afficher(null); pm3Bis.afficher(null); 
System.out.println(pm3==pm3Bis); System.out.println(------------------); 
} 
} ------------------ 
Poids mouche avec la valeur poids ,context=Context1 
Poids mouche avec la valeur poids ,context=Context2 
true 
------------------ 
Poids mouche avec la valeur flyweight ,context=Context1 
Poids mouche avec la valeur flyweight ,context=Context2 
true 
------------------ 
Poids mouche avec valeut1=A ,valeur2=B 
Poids mouche avec valeut1=A ,valeur2=B 
false 
------------------

Contenu connexe

Tendances

Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)ENSET, Université Hassan II Casablanca
 
Chapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeChapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeAmir Souissi
 
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiJava entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiENSET, Université Hassan II Casablanca
 
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPYouness Boukouchi
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesENSET, Université Hassan II Casablanca
 
Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0
Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0
Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0Ayoub Rouzi
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
 

Tendances (20)

Support de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfiSupport de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfi
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
 
Support JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVCSupport JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVC
 
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
 
Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)
 
Chapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeChapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphisme
 
Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA Hibernate
Site JEE de ECommerce  Basé sur Spring IOC MVC Security JPA HibernateSite JEE de ECommerce  Basé sur Spring IOC MVC Security JPA Hibernate
Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA Hibernate
 
Support de cours Spring M.youssfi
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfi
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 
Support Java Avancé Troisième Partie
Support Java Avancé Troisième PartieSupport Java Avancé Troisième Partie
Support Java Avancé Troisième Partie
 
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiJava entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
 
Cours java
Cours javaCours java
Cours java
 
Support JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.YoussfiSupport JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.Youssfi
 
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSP
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependances
 
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfiSupport de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
 
Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0
Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0
Rapport j2ee: Gestion d’un compte bancaire En utilisant les EJB 3.0
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
 
Support NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDB
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 

En vedette

En vedette (9)

Support programmation orientée objet c# .net version f8
Support programmation orientée objet c#  .net version f8Support programmation orientée objet c#  .net version f8
Support programmation orientée objet c# .net version f8
 
Systèmes multi agents concepts et mise en oeuvre avec le middleware jade
Systèmes multi agents concepts et mise en oeuvre avec le middleware jadeSystèmes multi agents concepts et mise en oeuvre avec le middleware jade
Systèmes multi agents concepts et mise en oeuvre avec le middleware jade
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
 
Développement d'un site web de E-Commerce avec PHP (Première Partie)
Développement d'un site web de E-Commerce avec PHP (Première Partie)Développement d'un site web de E-Commerce avec PHP (Première Partie)
Développement d'un site web de E-Commerce avec PHP (Première Partie)
 
Resume
ResumeResume
Resume
 
Intelligence artificielle et système multi-agent
Intelligence artificielle et système multi-agentIntelligence artificielle et système multi-agent
Intelligence artificielle et système multi-agent
 
Support POO Java première partie
Support POO Java première partieSupport POO Java première partie
Support POO Java première partie
 
Architecture des Systèmes Multi-Agents
Architecture des Systèmes Multi-Agents Architecture des Systèmes Multi-Agents
Architecture des Systèmes Multi-Agents
 

Similaire à Cours design pattern m youssfi partie 7 facade bridge flyweight

chapitre5-Classesabstraitesetinterfaces.pdf
chapitre5-Classesabstraitesetinterfaces.pdfchapitre5-Classesabstraitesetinterfaces.pdf
chapitre5-Classesabstraitesetinterfaces.pdfMoez Moezm
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfacesAziz Darouichi
 
4 asynch task_services_thread
4 asynch task_services_thread4 asynch task_services_thread
4 asynch task_services_threadSaber LAJILI
 
Chapitre 5 classes abstraites et interfaces
Chapitre 5  classes abstraites et interfacesChapitre 5  classes abstraites et interfaces
Chapitre 5 classes abstraites et interfacesAmir Souissi
 
Marzouk architecture encouches-jee-mvc
Marzouk architecture encouches-jee-mvcMarzouk architecture encouches-jee-mvc
Marzouk architecture encouches-jee-mvcabderrahim marzouk
 
Design Patterns Java
Design Patterns JavaDesign Patterns Java
Design Patterns JavaVINOT Bernard
 
Tp1 design patternappliques
Tp1 design patternappliquesTp1 design patternappliques
Tp1 design patternappliquesMariem ZAOUALI
 
Design applicatif avec symfony2
Design applicatif avec symfony2Design applicatif avec symfony2
Design applicatif avec symfony2RomainKuzniak
 
Implémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En JavaImplémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En JavaRached Krim
 
System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07haythem_2015
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
Comment écrire du code testable ?
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?Fou Cha
 
Applications Android - cours 6 : Structure d’un projet Android
Applications Android - cours 6 :  Structure d’un projet AndroidApplications Android - cours 6 :  Structure d’un projet Android
Applications Android - cours 6 : Structure d’un projet AndroidAhmed-Chawki Chaouche
 
Utilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérienceUtilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expériencelouschwartz
 
Java 8 - interfaces
Java 8 - interfacesJava 8 - interfaces
Java 8 - interfacesFranck SIMON
 
POO - Chapitre6.pptx
POO - Chapitre6.pptxPOO - Chapitre6.pptx
POO - Chapitre6.pptxRAYENBOUAFIF1
 

Similaire à Cours design pattern m youssfi partie 7 facade bridge flyweight (20)

chapitre5-Classesabstraitesetinterfaces.pdf
chapitre5-Classesabstraitesetinterfaces.pdfchapitre5-Classesabstraitesetinterfaces.pdf
chapitre5-Classesabstraitesetinterfaces.pdf
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfaces
 
4 asynch task_services_thread
4 asynch task_services_thread4 asynch task_services_thread
4 asynch task_services_thread
 
Chapitre 5 classes abstraites et interfaces
Chapitre 5  classes abstraites et interfacesChapitre 5  classes abstraites et interfaces
Chapitre 5 classes abstraites et interfaces
 
Marzouk architecture encouches-jee-mvc
Marzouk architecture encouches-jee-mvcMarzouk architecture encouches-jee-mvc
Marzouk architecture encouches-jee-mvc
 
Design Patterns Java
Design Patterns JavaDesign Patterns Java
Design Patterns Java
 
Tp1 design patternappliques
Tp1 design patternappliquesTp1 design patternappliques
Tp1 design patternappliques
 
Design applicatif avec symfony2
Design applicatif avec symfony2Design applicatif avec symfony2
Design applicatif avec symfony2
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Implémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En JavaImplémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En Java
 
System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Comment écrire du code testable ?
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?
 
Spring ioc
Spring iocSpring ioc
Spring ioc
 
Applications Android - cours 6 : Structure d’un projet Android
Applications Android - cours 6 :  Structure d’un projet AndroidApplications Android - cours 6 :  Structure d’un projet Android
Applications Android - cours 6 : Structure d’un projet Android
 
Utilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérienceUtilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérience
 
Cours spring
Cours springCours spring
Cours spring
 
POO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdfPOO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdf
 
Java 8 - interfaces
Java 8 - interfacesJava 8 - interfaces
Java 8 - interfaces
 
POO - Chapitre6.pptx
POO - Chapitre6.pptxPOO - Chapitre6.pptx
POO - Chapitre6.pptx
 

Plus de ENSET, Université Hassan II Casablanca

Plus de ENSET, Université Hassan II Casablanca (9)

Theses Soutenues sous Direction et Co-Direction du Pr YOUSSFI
Theses Soutenues sous Direction et Co-Direction du Pr YOUSSFITheses Soutenues sous Direction et Co-Direction du Pr YOUSSFI
Theses Soutenues sous Direction et Co-Direction du Pr YOUSSFI
 
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka StreamsTraitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
 
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
 
Support distributed computing and caching avec hazelcast
Support distributed computing and caching avec hazelcastSupport distributed computing and caching avec hazelcast
Support distributed computing and caching avec hazelcast
 
Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1 Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1
 
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
 
Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)
 
Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4
 
Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
 

Cours design pattern m youssfi partie 7 facade bridge flyweight

  • 1. DDeessiiggnn PPaatttteerrnnss PPaarrtt 77 Mohamed Youssfi Laboratoire Signaux Systèmes Distribués et Intelligence Artificielle (SSDIA) ENSET, Université Hassan II Casablanca, Maroc Email : med@youssfi.net Supports de cours : http://fr.slideshare.net/mohamedyoussfi9 Chaîne vidéo : http://youtube.com/mohamedYoussfi Recherche : http://www.researchgate.net/profile/Youssfi_Mohamed/publications med@youssfi.net
  • 2. PPaatttteerrnnss :: - FFaaccaaddee -- BBBBrrrriiiiddddggggeeee - FFllyyWWeeiigghhtt
  • 3. Problème :: SSyyssttèèmmee ccoommpplleexxee Un sous système est complexe s’il fait appel à plusieurs interfaces Client Client Client med@youssfi.net A C B E F D Système complexe ??!!
  • 4. PPaatttteerrnn FFaaççaaddee Créer une seule façade pour ce sous-système. Facade Client Client Client med@youssfi.net A C B E F D Système complexe ??!!
  • 5. PPaatttteerrnn FFaaccaaddee Catégorie : ◦ Structure Objectif du pattern ◦ Fournir une interface unique en remplacement d'un eennsseemmbbllee dd''iinntteerrffaacceess dd''uunn ssoouuss--ssyyssttèèmmee.. ◦ Définir une interface de haut niveau pour rendre le sous-système plus simple d'utilisation.. Résultat : ◦ Le Design Pattern permet d'isoler les fonctionnalités d'un sous-système utiles à la partie cliente. med@youssfi.net
  • 6. Diagramme de ccllaasssseess dduu ppaatttteerrnn FFaaccaaddee med@youssfi.net
  • 7. RRaaiissoonn dd’’uuttiilliissaattiioonn Le système comporte un sous-système complexe avec plusieurs interfaces. Certaines de ces interfaces présentent des opérations qui ne sont pas utiles au reste du système. Cela peut être le cas d'un sous-système communiquant aavveecc ddeess oouuttiillss ddee mmeessuurree oouu dd''uunn ssoouuss--ssyyssttèèmmee dd''aaccccèèss àà la base de données. Il serait plus judicieux de passer par une seule interface présentant seulement les opérations utiles. Une classe unique, la façade, présente ces opérations réellement nécessaires. med@youssfi.net
  • 8. RReessppoonnssaabbiilliittééss ClasseA et ClasseB : implémentent diverses fonctionnalités. Facade : présente certaines fonctionnalités. Cette classe utilise les implémentations des objets ClasseA et ClasseB. Elle expose une version simplifiée du sous-système CCllaasssseeAA--CCllaasssseeBB.. La partie cliente fait appel aux méthodes présentées par l'objet Facade. Il n'y a donc pas de dépendances entre la partie cliente et le sous-système ClasseA-ClasseB. med@youssfi.net
  • 9. IImmpplléémmeennttaattiioonn public class ClasseA { public void operation1(){ System.out.println(Opération 1 de la classe A); } public void operation2(){ System.out.println(Opération 2 de la classe A); } } /* ClasseA.java */ med@youssfi.net public class ClasseB { public void operation3(){ System.out.println(Opération 3 de la classe B); } public void operation4(){ System.out.println(Opération 4 de la classe B); } } /* ClasseB.java */
  • 10. IImmpplléémmeennttaattiioonn /* Facade.java */ public class Facade { private ClasseA a=new ClasseA(); private ClasseB b=new ClasseB(); public void operation2(){ System.out.println(Opération 2 de Facade :); a.operation2(); } public void operation41(){ System.out.println(Opération 41 de Facade :); b.operation4(); a.operation1(); } } med@youssfi.net
  • 11. IImmpplléémmeennttaattiioonn /* Application.java */ public class Application { public static void main(String[] args) { Facade facade=new Facade(); facade.operation2(); facade.operation41(); } } Opération 2 de Facade : Opération 2 de la classe A Opération 41 de Facade : Opération 4 de la classe B Opération 1 de la classe A med@youssfi.net ::CClliieenntt ::FFaaccaaddee Créer operation41 ::CCllaassssAA Créer operation4 ::CCllaassssBB Créer
  • 13. PPaatttteerrnn BBrriiddggee Catégorie : ◦ Structure Objectif du pattern ◦ Découpler l'abstraction d'un concept de son iimmpplléémmeennttaattiioonn.. ◦ Permettre à l'abstraction et l'implémentation de varier indépendamment. Résultat : ◦ Le Design Pattern permet d'isoler le lien entre une couche de haut niveau et celle de bas niveau. med@youssfi.net
  • 15. RRaaiissoonn dd’’uuttiilliissaattiioonn Le système comporte une couche bas niveau réalisant l'implémentation et une couche haut niveau réalisant l'abstraction. Il est nécessaire que chaque couche soit indépendante. Cela peut être le cas du système d'édition de documents d'une application. Pour l'implémentation, il est possible que l'édition aboutisse à une sortie imprimante, une image sur disque, un document PPDDFF,, eettcc...... Pour l'abstraction, il est possible qu'il s'agisse d'édition de factures, de rapports de stock, de courriers divers, etc... Chaque implémentation présente une interface pour les opérations de bas niveau standard (sortie imprimante) Chaque abstraction hérite d'une classe effectuant le lien avec cette interface. Ainsi les abstractions peuvent utiliser ce lien pour appeler la couche implémentation pour leurs besoins (imprimer facture). med@youssfi.net
  • 16. RReessppoonnssaabbiilliittééss Implementation : définit l'interface de l'implémentation. Cette interface n'a pas besoin de correspondre à l'interface de l'Abstraction. L'Implementation peut, par exemple, définir des opérations primitives de bas niveau et l'Abstraction des opérations de haut niveau qui utilisent les opérations de l'Implementation. ImplementationA et ImplementationB : sont des sous-classes concrètes de l'implémentation. Abstraction : définit l'interface de l'abstraction. Elle possède une rrééfféérreennccee vveerrss uunn oobbjjeett IImmpplleemmeennttaattiioonn.. CC''eesstt eellllee qquuii ddééffiinniitt llee lliieenn entre l'abstraction et l'implémentation. Pour définir ce lien, la classe implémente des méthodes qui appellent des méthodes de l'objet Implementation. AbstractionA et AbstractionB : sont des sous-classes concrètes de l'abstraction. Elle utilise les méthodes définies par la classe Abstraction. La partie cliente fournit un objet Implementation à l'objet Abstraction. Puis, elle fait appel aux méthodes fournit par l'interface de l'abstraction. med@youssfi.net
  • 17. IImmpplléémmeennttaattiioonn package impl; public interface ImplementationInteface { public void operationImpl1(String p); public void operationImpl2(int p); } /* ImplementationInterface.java */ /* ImplementationA.java */ package impl; public class ImplemationA implements ImplementationInteface { @Override public void operationImpl1(String p) { System.out.println(operationImpl1 de ImplementationA :+p); } @Override public void operationImpl2(int p) { System.out.println(operationImpl2 de ImplementationA :+p); } } med@youssfi.net
  • 18. IImmpplléémmeennttaattiioonn /* ImplementationB.java */ package impl; public class ImplemationB implements ImplementationInteface { @Override public void operationImpl1(String p) { System.out.println(operationImpl1 de ImplementationB :+p); } @Override public void operationImpl2(int p) { System.out.println(operationImpl2 de ImplementationB :+p); } } med@youssfi.net
  • 19. IImmpplléémmeennttaattiioonn /* Abstraction.java */ package abs; import impl.ImplementationInteface; public abstract class Abstraction { private ImplementationInteface implementation; public void operationImpl1(String p) { implementation.operationImpl1(p); } public void operationImpl2(int p) { med@youssfi.net implementation.operationImpl2(p); } public Abstraction(ImplementationInteface implementation) { this.implementation = implementation; } public abstract void operation(); }
  • 20. IImmpplléémmeennttaattiioonn /* AbstractionA.java */ package abs; import impl.ImplementationInteface; public class AbstractionA extends Abstraction{ public AbstractionA(ImplementationInteface implementation) { super(implementation); } @Override public void operation() { System.out.println(Méthode operation de AbstractionA); operationImpl1(X); operationImpl2(5); operationImpl1(Y); med@youssfi.net } }
  • 21. IImmpplléémmeennttaattiioonn /* AbstractionB.java */ package abs; import impl.ImplementationInteface; public class AbstractionB extends Abstraction{ public AbstractionB(ImplementationInteface implementation) { super(implementation); } @Override med@youssfi.net public void operation() { System.out.println(Méthode operation de AbstractionB); operationImpl2(9); operationImpl2(4); operationImpl1(Z); } }
  • 22. IImmpplléémmeennttaattiioonn /* Facade.java */ public class Facade { private ClasseA a=new ClasseA(); private ClasseB b=new ClasseB(); public void operation2(){ System.out.println(Opération 2 de Facade :); a.operation2(); } public void operation41(){ System.out.println(Opération 41 de Facade :); b.operation4(); a.operation1(); } } med@youssfi.net
  • 23. IImmpplléémmeennttaattiioonn /* Application.java */ import abs.*; import impl.*; public class Application { public static void main(String[] args) { ImplementationInteface implA=new ImplemationA(); ImplementationInteface implB=new ImplemationB(); Abstraction absAA=new AbstractionA(implA); Abstraction absAB=new AbstractionA(implB); Abstraction absBA=new AbstractionB(implA); Abstraction absBB=new AbstractionB(implB); System.out.println(---------------------); absAA.operation(); System.out.println(---------------------); absAB.operation(); System.out.println(---------------------); absBA.operation(); System.out.println(---------------------); absBB.operation(); } } --------------------- Méthode operation de AbstractionA operationImpl1 de ImplementationA :X operationImpl2 de ImplementationA :5 operationImpl1 de ImplementationA :Y --------------------- Méthode operation de AbstractionA operationImpl1 de ImplementationB :X operationImpl2 de ImplementationB :5 operationImpl1 de ImplementationB :Y --------------------- Méthode operation de AbstractionB operationImpl2 de ImplementationA :9 operationImpl2 de ImplementationA :4 operationImpl1 de ImplementationA :Z --------------------- Méthode operation de AbstractionB operationImpl2 de ImplementationB :9 operationImpl2 de ImplementationB :4 operationImpl1 de ImplementationB :Z
  • 25. PPaatttteerrnn FFllyyWWeeiigghhtt Catégorie : ◦ Structure Objectif du pattern ◦ UUttiilliisseerr llee ppaarrttaaggee ppoouurr ggéérreerr eeffffiiccaacceemmeenntt uunn ggrraanndd nombre d' objets de faible granularité. Résultat : ◦ Le Design Pattern permet d'isoler des objets partageables. med@youssfi.net
  • 27. RRaaiissoonn dd’’uuttiilliissaattiioonn Un système utilise un grand nombre d' instances. Cette quantité occupe une place très importante en mémoire. Or, chacune de ces instances a des attributs extrinsèques (propre au contexte) et intrinsèques (propre à l'objet). Cela peut être les caractéristiques des traits dans un logiciel de DAO. LLee ttrraaiitt aa uunnee ééppaaiisssseeuurr ((ssiimmppllee oouu ddoouubbllee)),, uunnee ccoonnttiinnuuiittéé (continu, en pointillé), une ombre ou pas, des coordonnées. Les caractéristiques d'épaisseur, de continuité et d'ombre sont des attributs intrinsèques à un trait, Tandis que les coordonnées sont des attributs extrinsèques. Plusieurs traits possèdent des épaisseurs, continuité et ombre similaires. Ces similitudes correspondent à des styles de trait. med@youssfi.net
  • 28. RRaaiissoonn dd’’uuttiilliissaattiioonn En externalisant les attributs intrinsèques des objets (style de trait), on peut avoir en mémoire une seule instance correspondant à un groupe de valeurs (simple-continu-sans ombre, double-pointillé-ombre). Chaque objet avec des attributs extrinsèques (trait avec les coordonnées) possède une référence vers une instance d'attributs intrinsèques (style de trait). OOnn oobbttiieenntt ddeeuuxx ttyyppeess ddee ppooiiddss--mmoouucchhee :: lleess ppooiiddss--mmoouucchhee ppaarrttaaggééss (style de trait) et les poids mouche non partagés (le trait avec ses coordonnées). La partie cliente demande le poids-mouche qui l'intéresse à la fabrique de poids-mouche. S'il s'agit d'un poids mouche non partagé, la fabrique le créera et le retournera. S'il s'agit d'un poids-mouche partagé, la fabrique vérifiera si une instance existe. Si une instance existe, la fabrique la retourne, sinon la fabrique la crée et la retourne. med@youssfi.net
  • 29. RReessppoonnssaabbiilliittééss PoidsMouche : déclare l'interface permettant à l'objet de recevoir et d'agir en fonction de données extrinsèques. On externalise les données extrinsèques d'un objet PoidsMouche afin qu'il puisse être réutilisé. ConcretePoidsMouche : implémente l'interface poids-mouche. Les informations contenues dans un ConcretePoidsMouche sont intrinsèques (sans lien avec son contexte). Puisque, ce type de poids mouche est obligatoirement partagé. CCoonnccrreetteePPooiiddssMMoouucchheeNNoonnPPaarrttaaggee :: iimmpplléémmeennttee ll''iinntteerrffaaccee poids-mouche. Ce type de poids-mouche n'est pas partagé. Il possède des données intrinsèques et extrinsèques. PoidsMoucheFabrique : fournit une méthode retournant une instance de PoidsMouche. Si les paramètres de l'instance souhaitée correspondent à un PoidsMouche partagé, l'objet PoidsMoucheFabrique retourne une instance déjà existante. Sinon l'objet PoidsMoucheFabrique crée une nouvelle instance. La partie cliente demande à PoidsMoucheFabrique de lui fournir un PoidsMouche. med@youssfi.net
  • 30. IImmpplléémmeennttaattiioonn public interface PoidsMouche { public void afficher(String context); } /* PoidsMouche.java */ /* ImplementationA.java */ public class PoidsMoucheConcret implements PoidsMouche { private String valeur; public PoidsMoucheConcret(String valeur) { this.valeur = valeur; } @Override public void afficher(String context) { System.out.println(Poids mouche avec la valeur +valeur+ ,context=+context); } } med@youssfi.net
  • 31. IImmpplléémmeennttaattiioonn /* PoidsMoucheNonPartage.java */ public class PoidsMoucheNonPartage implements PoidsMouche { private String valeur1; private String valeur2; public PoidsMoucheNonPartage(String valeur1, String valeur2) { this.valeur1 = valeur1; this.valeur2 = valeur2; med@youssfi.net } @Override public void afficher(String context) { System.out.println(Poids mouche avec valeut1=+valeur1+ ,valeur2=+valeur2); } }
  • 32. IImmpplléémmeennttaattiioonn /* FabriquePoidsMouche.java */ import java.util.HashMap; import java.util.Map; public class FabriquePoidsMouche { private MapString, PoidsMouche poidsMouchesPartages= new HashMapString,PoidsMouche(); public FabriquePoidsMouche() { poidsMouchesPartages.put(je,new PoidsMoucheConcret(je)); poidsMouchesPartages.put(suis,new PoidsMoucheConcret(suis)); poidsMouchesPartages.put(poids,new PoidsMoucheConcret(poids)); poidsMouchesPartages.put(mouche,new PoidsMoucheConcret(mouche)); } med@youssfi.net public PoidsMouche getPoidsMouche(String val){ PoidsMouche pm=poidsMouchesPartages.get(val); if (pm==null){ pm=new PoidsMoucheConcret(val); poidsMouchesPartages.put(val, pm); } return pm; } public PoidsMouche getPoidsMouche(String val1,String val2){ return new PoidsMoucheNonPartage(val1, val2); } }
  • 33. IImmpplléémmeennttaattiioonn /* Client.java */ public class Client { public static void main(String[] args) { FabriquePoidsMouche fabrique=new FabriquePoidsMouche(); PoidsMouche pm=fabrique.getPoidsMouche(poids); PoidsMouche pmBis=fabrique.getPoidsMouche(poids); System.out.println(------------------);pm.afficher(Context1); pmBis.afficher(Context2); System.out.println(pm==pmBis); System.out.println(------------------); PoidsMouche pm2=fabrique.getPoidsMouche(flyweight); PoidsMouche pm2Bis=fabrique.getPoidsMouche(flyweight); pm2.afficher(Context1); pm2Bis.afficher(Context2); System.out.println(pm2==pm2Bis); System.out.println(------------------); PoidsMouche pm3=fabrique.getPoidsMouche(A,B); PoidsMouche pm3Bis=fabrique.getPoidsMouche(A,B); pm3.afficher(null); pm3Bis.afficher(null); System.out.println(pm3==pm3Bis); System.out.println(------------------); } } ------------------ Poids mouche avec la valeur poids ,context=Context1 Poids mouche avec la valeur poids ,context=Context2 true ------------------ Poids mouche avec la valeur flyweight ,context=Context1 Poids mouche avec la valeur flyweight ,context=Context2 true ------------------ Poids mouche avec valeut1=A ,valeur2=B Poids mouche avec valeut1=A ,valeur2=B false ------------------