SlideShare ist ein Scribd-Unternehmen logo
1 von 239
Design Patterns  JAVA Conception d’applications objet B.Vinot
Contenu du cours ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],exercices
Pourquoi faire de l'objet(1) ?
Pourquoi faire de l'objet(2) ?
Introduction aux Design Patterns Les Patterns GRASS General ResponsabilityAssignement Software Patterns
Les Patterns : Introduction ,[object Object],[object Object],[object Object],[object Object]
Les Patterns : Définition ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Exemple : Les Patterns Grasp ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Le pattern GRASP : Expert ,[object Object],[object Object],[object Object],[object Object],[object Object]
Le pattern GRASP : Créateur ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Le pattern GRASP : Couplage ,[object Object],[object Object],[object Object],[object Object],[object Object]
Le pattern GRASP : Cohésion ,[object Object],[object Object],[object Object],[object Object]
Le pattern GRASP : Contrôleur ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Principes fondamentaux de conception Ouverture-Fermeture OCP Inversion des dépendances DIP Substitution de Liskov LSP Séparation des interfaces ISP
Les objectifs du DESIGN ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Gestion des évolutions et des dépendances entre classes ,[object Object],[object Object],[object Object],[object Object]
Exemple : utilisation de la délégation abstraite ( OCP ) ,[object Object]
L’application de l’OCP est un choix stratégique ( OCP ) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Exemple : ( OCP ) Personne nom : string age : int Personne(n : string, a : int) Appl1 Appl2 BD Appl3 Avec adr ,[object Object],[object Object],[object Object],[object Object],[object Object],ID nom age
Exemple : ( OCP ) Solution Appl1 Appl2 Personne nom : string age : int Personne(n : string, a : int) GetAdresse() : string PersonneDomicilee adresse : string PersonneDomiciliee(n : string, a : int, adr : string) GetAdresse() : string SetAdresse(p : string) : void Rend une chaîne vide: Appl3 peut alors utiliser des Personnes ,[object Object],[object Object],[object Object],[object Object],Appl3
Principes de substitution de LISkOV ( LSP ) ,[object Object],[object Object],[object Object]
Principes de substitution de LISkOV  ( LSP ) : exemple class Rectangle {  int longueur, largeur;  public: virtual void setValeur(int long, int larg) {longueur = long; largeur = larg; }; class Carre : public Rectangle {  public: virtual void setValeur(int long, int larg) {    if (long != larg) throw std::exception(« long !=larg&quot;);   super.setValeur(long, larg); } };  void utiliserRectangle(int lng) { leRectangle.setValeur(lng, lng * 2);  assert(leRectangle.getArea() == (length*length*2)); Que se passe-t-il   si le Rectangle est un carré? Héritage<>Composition
Principes d’inversion des dépendances ( DIP ) ,[object Object]
Principes d’inversion des dépendances ( DIP ) ,[object Object],[object Object],[object Object],[object Object],[object Object]
L’abstraction comme technique d’inversion des dépendances ( DIP ) ,[object Object],Pour inverser la dépendance de A vers B, on introduit une classe d'interface I dont dérive B comme suit :
Principes de séparation des interfaces ( ISP ) ,[object Object],[object Object]
Principes de séparation des interfaces ( ISP ) ,[object Object],[object Object],[object Object],[object Object],[object Object]
Principes de séparation des interfaces ( ISP )
Techniques de séparation ( ISP ) ,[object Object],[object Object],[object Object]
Séparation par héritage multiple ( ISP ) ,[object Object]
Séparation par adaptateur ( ISP ) ,[object Object]
Processus Objet UP XP-Agile Winston  Royce.  Managing the  Development of Large  Software Systems .  1970
UP:  Caractéristiques essentielles   ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],UP  RUP  XUP
UP & les modèles UML (1)
UP & les modèles UML (2) Modèle des cas d’utilisation  Expose les cas d’utilisation et leurs relations avec les utilisateurs Modèle d’analyse Détaille les cas d’utilisation et procède à une première répartition du comportement du système entre divers objets Modèle de conception Définit la structure statique du système sous forme de sous système, classes et interfaces ; Définit les cas d’utilisation réalisés sous forme de collaborations entre les sous systèmes les classes et les interfaces Modèle d’implémentation Intègre les composants (code source) et la correspondance entre les classes et les composants Modèle de test Décrit les cas de test vérifiant les cas d’utilisation Modèle de déploiement Définit les nœuds physiques des ordinateurs et l’affectation de ces composants sur ces nœuds. Modèle d'architecture Description de l’architecture (réutilisable)
UP & L'organisation matricielle
Processus Objet XP-Agile Extrem programing La programmation extrême Les processus agiles
Pourquoi une nouvelle Méthode ? Les approches classiques de développement type &quot;waterfall&quot;, basées sur la fameuse  Séquence   spécification / conception / réalisation / validation, souffrent de problèmes chroniques : ,[object Object],[object Object],[object Object],[object Object]
Les méthodes agiles ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Les valeurs d' XP (1) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Les valeurs d' XP (2) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Binôme (1) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Binôme (2) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
TU ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
La Planification ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Conditions d’application ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Les principes de base ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
histoires d’utilisateurs ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Une histoire est une unité de livraison RMQ  : Une histoire est un très gros use case
La planification est un jeu XP tente de désamorcer les conflits Un vrai dialogue Client Développeur ,[object Object],[object Object],[object Object]
Être courageux ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Déroulement Scrum
Processus Objet Tests Refactoring
Test et Junit
Junit
Junit : Ecrire le test package com.moi.test.junit;  import junit.framework.TestCase;  public class MaClasseTest extends TestCase {     private MaClasse maClasse = null;     public MaClasseTest(String arg0) {          super(arg0);    }     public static void main(String[] args) {           junit.swingui.TestRunner.run(MaClasseTest.class);    }     protected void setUp() throws Exception {           super.setUp();            maClasse = new MaClasse();     }     protected void tearDown() throws Exception {           super.tearDown();            maClasse = null;     }     public void testAdditioner() {           assertTrue(maClasse.additioner(2,2) == 4);   }  }
Junit : lancement du test Regrouper les tests : Sur un projet ou un package Faire new JunitTestSuite (Other) Junit4
Tests : Les couches Blabla Objets métier CTRL BD Serialisation ,[object Object],[object Object],String global
Couverture de test
Le Refactoring :Principes (1) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Le Refactoring :Principes (2) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Le refactoring dans Eclipse (1) ,[object Object],[object Object],[object Object],[object Object],[object Object]
Le refactoring dans Eclipse (2) ,[object Object],[object Object],[object Object],[object Object]
Le refactoring dans Eclipse (3) ,[object Object],[object Object],[object Object]
Le refactoring dans Eclipse (4) ,[object Object]
Refactoring : exercice(1) Vidéo-Club ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Bonus : Chaque location donne un point, si une nouveauté est louée plus qu'un jour, alors un point supplémentaire.
Refactoring : exercice(2) Vidéo-Club
Refactoring : exercice(3) Vidéo-Club
Refactoring : correction Vidéo-Club
Les Design patterns Le GoF Comportement Structure Création
Les Design Patterns ,[object Object],[object Object],[object Object],[object Object],[object Object],Le choix des Design Patterns et de leur codage est un choix d ’architecture Les outils permettent d ’instancier les Design Patterns et de générer automatiquement le code
Présentation des patrons de conception ,[object Object],[object Object],[object Object],[object Object]
Description des patrons de conception ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Classification des patterns Création Comportement Structure
Les Design patterns de comportement (1) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Les Design patterns de comportement (2) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
l ’Automate : contexte ,[object Object],[object Object],[object Object]
State : Préambule ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
State : UML Client Etat +Op1(Context) +Op2(Context) +Op3(Context) * Etat1 +Op1(Context) +Op2(Context) Etat2 +Op2(Context) +Op3(Context)
State : Participants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
State : Exercice1- La banque SilverState(0-1000) do: Interet = 10% RedState(<0) do: Interet = 0 do: Frais = 15 GoldenState(>1000) do: Interet = 50% [ balance > 1000 ] [ balance < 0 ] [ balance > 0 ] [ balance < 1000 ] [ balance < 0 ] la banque
State : Exercice1- La banque balance<0 => Interet 0% Balance entre 0 et 1000 => Interet 10% Balance > 1000 => Interet 50% balance<0 => Pénalité de 15 la banque
State : Exercice1 int main() { Account account(&quot;Jim&quot;);  account.Deposit(500.0);  account.PayInterest  ();  account.Deposit(300.0); account.PayInterest  ();  account.Deposit(550.0);  account.PayInterest();  account.Withdraw(2000.00); account.PayInterest();  account.Withdraw(1100.00)  ; account.Withdraw(1000); account.PayInterest(); account.Deposit(2000); return 0; } Gold Silver r Silver Red  Silver la banque
State + Singleton
State + Singleton Exo2 Objet  o; o.C1();o.C2();o.C3();o.C3(); Objet o1; o1.C1();o1.C3();o1.C2(); o1.C1();o1.C2();o1.C3(); o1.C1();o1.C3(); Automate
State : Remarques ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Plus simple
Stratégie : contexte ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Stratègie : UML
Stratègie : Participants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Stratègie : Exo ,[object Object],[object Object],[object Object],[object Object],public static void main(String[] args) { Entreprise e= new Entreprise(); Employe trouve; e.Ajouter(new Employe (&quot;Tchutchu&quot; , 999999 , 0)); e.Ajouter(new Employe (&quot;Duchmoll&quot; , 1000 , 10)); e.Ajouter(new Employe (&quot;Casta&quot; , 10000 , 30)); e.setMaStrategie(new RechercherGrossesVacances()); trouve = e.Rechercher(); System.out.println (&quot;Virer le paresseux : &quot; + trouve.getNom()); e.setMaStrategie(new RechercherGrosSalaire()); trouve = e.Rechercher(); System.out.println (&quot;Virer le plus cher : &quot; + trouve.getNom()); } Virer le paresseux : Casta Virer le plus cher : Tchutchu
Patron de méthode : principe ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Patron de méthode : Exemple TravaillerMatin(); Dejeuner(); TravaillerApresMidi(); Loisir(); Dormir(); Patron de méthode vivre If (age > 15) TravaillerMatin(); else Jouer(); ………… . MiamMiam RonRon C’est drôle
Patron de méthode BlaBlater: BlaBla TravaillerMatin:   BlaBlater(); TravaillerApresMidi:   BlaBlater(); Loisir:   BlaBlater Personneb age : int Dejeuner() <<{abstract}>> TravaillerMatin() <<{abstract}>> TravaillerApresMidi() <<{abstract}>> Loisir() Dormir() Jouer() <<abstract>> Vivre() Chirurgien TravaillerMatin() TravaillerApresMidi() Loisir() Professeur TravaillerMatin() TravaillerApresMidi() Loisir() BlaBlater() TravaillerMatin: Ouvrir(); TravaillerApresMidi: Fermer(); Loisir: Histoire grivoise
Patron de méthode TravaillerMatin(); Dejeuner(); TravaillerApresMidi(); Loisir(); Dormir(); TravaillerMatin: Dormir(); TravaillerApresMidi: AllerANPE(); Loisir: Pleurer();
Patron de méthode : Exo : Impôts ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],(Calcul sur le revenu annuel) Déclaration :  Revenu annuel-loyer mensuel-fortune-nombre d’enfants
Patron de méthode : Exo : Impôts
l’Observer : le contexte ,[object Object],[object Object],[object Object]
l’Observer : la solution ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
l’Observer : UML Réutilisable Rmq : souvent UpDate contient des paramètres (evt, le sujet, l'état  du sujet, …)
l ’Observer : la dynamique
Observer : Participants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Observer : Java setChanged ()  {changed = true;} NotifyObservers()  { if (changed) { for each observer update(); changed = false; } Cela permet d'optimiser en n'appelant pas les observers à chaque changement d'état du sujet,mais seulement après un setChanged(). import java.util.*;
Observer : Java- Swing Public class Exemple{ JFrame cadre; Public static main(){ Exemple e = new Exemple(); e.go();} Public void go(){ cadre =new JFrame();   Jbutton b = new Jbutton (« Dois-je le faire »); b.AddActionListener(new Ange()); b.AddActionListener(new Demon()); ………………………………… .} } class Ange implements ActionListener { Public void ActionPerformed(ActionEvent e) {Print « Non »}}  class Ange implements ActionListener { Public void ActionPerformed(ActionEvent e) {Print « Oui »}} Dois-je le faire Non Oui
Observer : Exercice1 Mer-Montagne Meteo.Calculer met température entre 0 et 20. Skieur.update va en vacances si la température est < 10°  Nageur.update va en vacances si la température est >= 10° Meteo m = new Meteo(); Nageur n = new Nageur(); Skieur s =new Skieur(); m.addObserver(n); m.addObserver(s); m.calculer(); m.setChanged(); m.calculer(); m.setChanged(); m.calculer(); m.setChanged(); m.calculer(); le skieur va a la montagne : 8 le nageur va a la mer : 12 le skieur va a la montagne : 6 8 8 12 ? Observable -changed: bool +addObserver(Observer) +deleteObserver(Observer) +countObservers(): int +deleteObservers() +notifyObservers() #setChanged() Observer Meteo -temperature: int +setChanged() +calculer() +getTemperature(): int Skieur +update(p1: Observable, p2: Object) Nageur +update(p1: Observable, p2: Object) Main +main(args: String)
Observer : Exercice2 Les villes
Visitor ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Visitor : UML
Visiteur et l’objet Composite Iterator iter =employees.iterator(); {  Employee e; while (iter.hasNext())  { e =(Employee)iter.next();   e.Accept(visitor);} } RMQ : Il est possible d’explorer l’ensemble d’un composite avec un visiteur. Dans ce cas Employee et Employees ont tous les deux une méthode Accept et sont donc des Elements.
Visitor :exercice Salaire Vacances public static void main(String[] args) { Employees e = new Employees();  e.Attach(new Clerk(&quot;Hank&quot;, 25000.0, 14));  e.Attach(new Director(&quot;Elly&quot;, 35000.0, 16));  e.Attach(new President(&quot;Sarko&quot;, 45000.0, 21));  e.Accept(new IncomeVisitor());  e.Accept(new VacationVisitor());  } ,[object Object],[object Object],[object Object],[object Object]
Visitor :correction Salaire Vacances
Mémento : UML La classe à surveiller-----La mémoire----Le programme client (main)  UnDo-ReDo
Mémento : Participants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Mémento : Exemple(1) import java.util.*; // &quot;Originator&quot;  class SalesProspect { private String name; private String phone; private double budget; public String getName() { return name; } public void setName(String value) { name = value; } public String  getPhone() { return phone; } public void setPhone (String value) { phone = value; } public double getBudget() { return budget; } public void setBudget (double value) { budget = value; } public Memento SaveMemento()   {return (new Memento( name, phone, budget ));} public void RestoreMemento( Memento memento ) { this.name = memento.getName(); this.phone = memento.getPhone(); this.budget = memento.getBudget(); } public void Afficher() { System.out.println( &quot;Sales prospect ---- &quot; ); System.out.println( &quot;Name: &quot; + this.name ); System.out.println( &quot;Phone: &quot; + this.phone ); System.out.println( &quot;Budget:&quot; + this.budget ); } } class Memento { private String name; private String phone; private double budget; // Constructors public Memento( String name, String phone, double budget ) { this.name = name; this.phone = phone; this.budget = budget; } public String getName() { return name; } public void setName(String value) { name = value; } public String  getPhone() { return phone; } public void setPhone (String value) { phone = value; } public double getBudget() { return budget; } public void setBudget (double value) { budget = value; } } // &quot;Caretaker&quot; class ProspectMemory { private Memento memento; public void setMemento  (Memento  value){  memento = value; } public Memento getMemento () { return memento; } }
Mémento : Exemple(2) public class MementoApp { public static void main(String argv[]) { SalesProspect s = new SalesProspect(); s.setName ( &quot;Landru&quot;); s.setPhone (&quot;08080808&quot;); s.setBudget( 25000.0); s.Afficher(); // Store internal state ProspectMemory m = new ProspectMemory(); m.setMemento( s.SaveMemento()); // Continue changing originator s.setName( &quot;Tintin&quot;); s.setPhone( &quot;33333333&quot;); s.setBudget( 1.0); s.Afficher(); // Restore saved state s.RestoreMemento( m.getMemento() ); s.Afficher(); } }
Memento : UML-Dynamique : Client : Caretaker : Originator : Memento <<create>> SaveMemento(): void <<create>> SetState(): void rend le memento SetMemento(p Memento): void GetMemento(): void RestoreMemento(m): void GetState(): void mis a jour de l' é tat()
L’Itérateur-Iterator : le contexte ,[object Object],[object Object],[object Object]
Itérateur: UML
Iterateur : Participants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Itérateur : remarques ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Itérateur & Composite ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Itérateur : Exercice ,[object Object],[object Object],[object Object],[object Object],le prix d'un ordi
Chaîne de Responsabilité ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Chain of Resp : UML ,[object Object],[object Object],[object Object]
Chain of Resp : Participants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Chain of Resp : Exo Président <100000 Vice-président <25000 Directeur <10000 Comité >=100000 Director grouillot = new Director();  VicePresident Sam = new VicePresident();  President Tammy = new President();  Grouillot.SetSuccessor(Sam);  Sam.SetSuccessor(Tammy);  Purchase p = new Purchase( 350.00, &quot;Formation&quot;);  Grouillot.ProcessRequest(p);  p = new Purchase( 24000, &quot;Voiture&quot;);  Grouillot.ProcessRequest(p); p =new Purchase ( 99000, &quot;Maison&quot;); Grouillot.ProcessRequest(p); p = new Purchase( 122100.00, &quot;Usine&quot;);  Grouillot.ProcessRequest(p);  U M V F
Command ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Command : UML Configurateur Utilisateur
Command  : Participants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Command : Exo Architecture ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Je construis les murs ext Je construis le toit Je casse le toit Je construis le toit Je casse le toit Je construis le toit Je construis les murs int
Command : Correction Architecture Je construis les murs Je construis le toit Je casse le toit Je construis le toit Je casse le toit Je construis le toit Je construis les murs
Interpreter : UML
Mediator : UML Mediator ConcreteMediator Colleague +mediator bouton liste textArea Controleur menu Rmq :Façade-Observer
Les Design patterns Le GoF Structure ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Proxy :le contexte ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Proxy : UML Proxy.Operation1() { fait qqchose….. leSujet.Operation1();} Proxy.Proxy(Sujet param){ leSujet = param;}
Proxy : Participants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Proxy Distant RPC RMI CORBA DCOM WEBSERVICE Stub skeleton IDL Interface WSDL SujetReel +Operation1() Proxy +Operation1() +Proxy(p: Sujet) Sujet +Operation1() Client Call Send Call RMIC
Proxy Distant :RMI (1) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Proxy Distant :RMI (2) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Proxy Distant :Exercice Bonjour de loin
Proxy de protection :exercice (1) le patron et les grouillots
Proxy de protection :exercice (2) le patron et les grouillots
Proxy de protection avec InvocationHandler Moi même Les autres getNom() getSexe() getInterest() getSexyOuNon() SetNom(String) setSexe(String) setInterest(String) setSexyOuNon(int) Rmq : setSexyOuNon   () fait la moyenne des notes obtenues getNom() getSexe() getInterest() getSexyOuNon() SetNom(String) setSexe(String) setInterest(String) setSexyOuNon(int) BeanPersonne <<interface>> ~getNom(): String ~getSexe(): String ~getInterets(): String ~getSexyOuNon(): int ~setNom(nom: String) ~setSexe(sexe: String) ~setInterets(interets: String) ~setSexyOuNon(note: int)
Proxy de protection avec InvocationHandler
Méthode invoke de non Propriétaire InvocationHandlerNonProprietaire public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException {  try { if (method.getName().startsWith(&quot;get&quot;)) { return method.invoke(personne, args);  }  else if (method.getName().equals(&quot;setSexyOuNon&quot;)) { return method.invoke(personne, args);}   else if (method.getName().startsWith(&quot;set&quot;)) { throw new IllegalAccessException(); }    } catch (InvocationTargetException e) {  e.printStackTrace();} return null; }
Méthode invoke de Propriétaire InvocationHandlerProprietaire public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException {  try { if (method.getName().startsWith(&quot;get&quot;)) { return method.invoke(personne, args);  } else if (method.getName().equals(&quot;setSexyOuNon&quot;)) { throw new IllegalAccessException();} else if (method.getName().startsWith(&quot;set&quot;)) { return method.invoke(personne, args);}    } catch (InvocationTargetException e) {e.printStackTrace();}  return null; }
Proxy invocationHandler :Exercice(1) le club de rencontres Rmq basedonnees est une Hashtable ---------------------------------------------- Passage difficile :
Proxy invocationHandler :Exercice(2) le club de rencontres
Decorator : Présentation Problème : nombreux héritages Solution : Héritage   héritage + agrégation (poupée russe)
Decorator :Le problème(1) Nous allons revoir la façon dont on abuse généralement de l’héritage et vous allez apprendre comment « décorer » vos classes au moment de l’exécution  en utilisant une forme de composition. Pourquoi?  Une fois que vous connaîtrez les techniques de décoration, vous pourrez affecter à vos objets (ou à ceux des autres) de nouvelles responsabilités  sans  modifier le code des classes sous-jacentes.  RMQ :Le principe d’Ouverture (n’hésitez pas à étendre nos classes) et de Fermeture (Pas touche à mon code) Un Deca avec du lait et du citron
Decorator :Le problème(2) Ecrire les méthodes Boisson::Cout et Colombia::Cout Boisson.Cout() { If GetLait() then cout += coutDuLait If GetVanille() then cout += coutVanille ………………………………………… . Return cout; } Colombia::Cout () { Return 25+ super.Cout() } Que se passe-t-il si on rajoute la crème Chantilly? Il faut modifier Boisson.Cout --- Pas touche à mon code
Decorator : UML Decorateuri.Operation(): fait qq chose super.Operation() Cela revient à rajouter une responsabilité à une classe mais sans en changer l'interface. Comparer avec le composite ComposantConcret.Operation :  fin de la chaîne Decorateur.Operation() : monComposant.Operation()
Decorator : la solution construction Deca Lait Citron La boisson Les ingrédients ,[object Object],[object Object],[object Object],[object Object],[object Object],Un Deca avec du lait et du citron De l'extérieure, on ne voit que le citron. Component +Operation() ComposantConcret +Operation() Decorateur +Operation() -monComposant 1 Decorateur1 +Operation() Decorateur2 +Operation()
Decorator : la solution Un Deca avec du lait et du citron Deca Lait Citron La boisson Les ingrédients ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Component +Operation() ComposantConcret +Operation() Decorateur +Operation() -monComposant 1 Decorateur1 +Operation() Decorateur2 +Operation()
Decorator : Participants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Decorator : Exemple On utilise l’héritage entre Ingrédient et boisson par Snobisme Boisson::Cout est abstraite Colombia::Cout return 25 (le coût du Colombia sans ingrédient Lait::Cout return le cout du Lait(10) + Le coût de  maBoisson Utilisation  : Boisson b1 = new Colombia() b1.cout() => 25 Boisson b2 =new Colombia() b2 = new Lait(b2); b2.cout()=> 25 + 10 b2 = new Citron(b2); ….. Colombia Que se passe-t-il si on rajoute la crème Chantilly? Il faut rajouter la classe Chantilly Lait Colombia Citron Lait Colombia
Decorator : Un mauvais exemple(1)
Decorator : un mauvais exemple (2)
Decorator : Exercice les soldats
l ’Adaptateur : le contexte ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
l ’Adaptateur : Uml et Exemple
L'adaptateur : Participants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
L'adaptateur : Exercice Canards oies Canard.Cancaner    &quot;Coincoin&quot; Leurre.Cancaner    &quot;Silence&quot; CanardPlastique    &quot;Pchiff&quot; Oie.Cacarder    &quot; CoincoinCoincoin &quot; Pb : Faire cancaner une troupe de Cancaneur contenant des oies
Composite : Le contexte & UML ,[object Object],[object Object],[object Object],[object Object],Comparer avec le décorateur
Composite : Participants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Composite : Exercice // Configuration Peripherique p1 = new Peripherique (&quot;DVD&quot;, 100,8); Peripherique p2 = new Peripherique (&quot;Disque Dur&quot;, 1000,9); Peripherique p3 = new Peripherique (&quot;Modem ADSL&quot;, 1,8); Peripherique p4 = new Peripherique (&quot;Pentium&quot;, 3500 ,386); Peripherique p5 = new Peripherique (&quot;Ventilo &quot;, 150,15); Container carteMere = new Container (&quot;Carte mère&quot;); carteMere.Ajouter(p4);carteMere.Ajouter(p5); TourDeLuxe tour = new TourDeLuxe (&quot;tour&quot;,100); tour.Ajouter(p1);tour.Ajouter(p2);tour.Ajouter(carteMere); Container ordi = new Container (&quot;IBM&quot;); Ordi.Ajouter (tour);ordi.Ajouter (p3); // Utilisation System.out.println(  &quot;le prix total est de : &quot; +  ordi.GetPrix()  ); Composite Leaf le prix d'un ordi Ordi IBM Tour DVD HD Carte mère Modem Adsl Carte mére Pentium Ventilo
Composite : Solution le prix d'un ordi
Façade : UML
La Façade : le contexte ,[object Object],[object Object],[object Object],[object Object],[object Object]
La Façade : les bénéfices ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Façade : Participants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Exemple : Transformation d'une liste en pile
Façade : Exo ,[object Object],[object Object],[object Object],Facade f =new Facade(); System.out.println(f.AccepterPret(100000,1000,20000,55000)); System.out.println(f.AccepterPret(200000,1000,20000,55000)); System.out.println(f.AccepterPret(300000,1000,20000,55000)); true Refus caution trop faible false Refus salaire trop faible Refus caution trop faible Refus apport trop faible false La banque Prêt, salaire, apport, caution
Flyweight : Poids mouche :UML Utilisation :  beaucoup de petits objets à se partager à plusieurs. Exemple : les caractères d'un document   PluriGleton
Poids mouche : Exemple : une forêt ,[object Object],[object Object],[object Object],[object Object],[object Object]
Bridge : UML Rmq : ressemble au state
Bridge : Exemple #include <iostream> using namespace std; // .h class Implementor; class Abstraction  {  protected :Implementor *implementor;  public :   void SetImplementor(Implementor *value);    virtual void Operation();} ; class Implementor  { public : virtual void Operation()=0; } ;  class RefinedAbstraction : public Abstraction  {  public  :void Operation();};  class ConcreteImplementorA : public Implementor  {  public : void Operation()  ;  } ;  class ConcreteImplementorB : public Implementor  {  public : void Operation() ;}; // .cpp  void Abstraction::SetImplementor(Implementor *value) {implementor = value;}  void Abstraction::Operation() { implementor->Operation(); }  void RefinedAbstraction::Operation(){  implementor->Operation(); }  void ConcreteImplementorA::Operation(){cout << &quot;OperationA&quot; << endl;}  void ConcreteImplementorB::Operation(){ cout << &quot;OperationB&quot; << endl;} int main()  {  Abstraction *ab = new RefinedAbstraction();  ab->SetImplementor(  new ConcreteImplementorA());  ab->Operation();  ab->SetImplementor(new ConcreteImplementorB());  ab->Operation();  }
Les Design patterns Le GoF Création ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],Le singleton
Le singleton uml
Amélioration du singleton L'usine à singleton : Remplacer singletons par singleton Rmq : En C++, mettre en private le constructeur de copie et l'opérateur  d'affectation Rmq : En multi thread, utiliser un mutex ou synchronized.                                                    
Fabrication : Présentation Le problème : If cas1 alors return new c1(); If cas2 alors return new c2(); If cas3 alors return new c3(); Problème de dépendance, ce sous programme dépend de c1,c2,c3…. Et ce problème arrive à chaque fois que l'on veut créer un des ces objets. C'est du code  Beurgh!   La fabrication va garder et prendre en charge ce code Beurgh, au moins Il sera à un seul endroit. Règle  POO : Remplacer le switch par le polymorphisme Fabrication : Garder le switch ce qui évitera de faire des New (et des dépendances)
Fabrication : Problème de dépendance ,[object Object],[object Object],[object Object],[object Object]
Fabrication : exemple les pizzerias(1) L'usine Les produits
Fabrication : exemple les pizzerias(2) : qq celleDeBrest : Pizzeria brest-fromage : Pizza commanderPizza(type: String): pizza creerPizza(item: String): pizza preparer(): void cuire(): void couper(): void emballer(): void [B] Pizza  creerPizza (String item)  if (item.equals(&quot;fromage&quot;)) { return new PizzaFromageStyleBrest();}  else if…… Pizzeria fabriqueBrest = new FabriqueDePizzasBrest(); [A]  Pizza pizza = fabriqueBrest.commanderPizza(  &quot;fromage&quot;  ); [B] System.out.println(&quot;Luc a commandé une &quot; + pizza.getNom() + &quot;&quot;); [A]
Fabrication : le Design pattern
Fabrication : Participants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Fabrication exercice les livres Fabrique Le produit FabriquePage fab = new FabriquePage(); Page i = fab.CreatePage(&quot;Intro&quot;); i.Afficher(); i=fab.CreatePage(&quot;Conclusion&quot;); i.Afficher();
Fabrication Abstraite : motivation Application IHM Motif IHM windows Application IHM IHM Motif IHM windows L ’application utilise IHM sans savoir si il s ’agit de Motif ou bien de Windows
Fabrication Abstraite : Structure <<instancie>> Application
Fabrication Abstraite : Constituants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Fabrique Abstraite : Avantages et inconvénients ,[object Object],[object Object],[object Object],[object Object],[object Object],Les trains FabriqueAbstraite CreerProduitA() CreerProduitB()
Builder-Monteur Rmq : Le monteur (Builder) est utilisé pour construire différentes sortes d’objets selon une certaine méthodologie (étapes par étapes). Chaque étape dépend du type de l’objet, mais la succession des étapes en est indépendante.  (comparer avec le patron de méthode) ,[object Object],[object Object],[object Object],[object Object],[object Object]
Builder : UML
Builder : Participants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Builder : Exemple voici la partie A du produit1 voici la partie B du produit1 voici la partie A du produit2 voici la partie B du produit2
Builder : Exo void main() { Shop shop = new Shop(); VehicleBuilder b2 = new CarBuilder(); VehicleBuilder b3 = new MotorCycleBuilder(); shop.Construct(b2); b2.GetVehicle().Show(); shop.Construct(b3); b3.GetVehicle().Show(); } Usine de véhicules Vehicule type : String moteur : String roue : String porte : String Show() : void VehiculeBuilder GetVehicule() : Vehicule BuildMoteur()  : void BuildRoue() : void BuildPorte() : void 1 #vehicule 1 MotoBuilder BuildMoteur() : void BuildRoue() : void BuildPorte() : void MotoBuilder() VoitureBuilder BuildMoteur() : void BuildRoue() : void BuildPorte() : void VoiturBuilder() Shop Construire(p : VehiculeBuilder) : void
Prototype ,[object Object],[object Object],[object Object],[object Object],[object Object]
Prototype : Participants ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
DP : Exercice général(1) Les stagiaires ont un nom, un sexe et une catégorie (TM, M, Moyen, B , TB). Ils font des exos  qui sont réussis en fonction de leur état (TM =4-10, M=5-10, B=10-15, TB=15-20,Moyen =11) Le prof note aléatoirement (presque) les exos mais favorise les filles. (note en fonction de l’état,  plus ou moins un nombre compris entre –10 et + 8, rajouter 2 points pour les filles (sauf pour les  très bonnes), la note finale est comprise entre 0-20.  Quand un élève obtient une note < 7 son état se dégrade, alors que si il obtient une note > 13  son état s’améliore.  Le chef vire celui ou celle qui a la plus mauvaise note à chaque exercice. Bill Gates débauche 2 fois le ou la meilleure, tandis que Google n’en débauche qu’un ou qu’une. D’autres personnes, entreprises ou organismes quelconques pourront bientôt s’ intéresser aux  stagiaires. Toutes les notes sont sauvegardées pour chaque élève. Abuser Singleton State Observer Strategie Template methode memento
DP : Exercice général(1) Abuser
DP : Exercice général(2)  Les canards ,[object Object],[object Object],[object Object],[object Object],[object Object],Adaptateur Decorateur Fabrique abstraite Composite Observer
Autres Patterns Les classes d'analyse Le raii
Les classes d'analyse ,[object Object],[object Object],[object Object],[object Object],a2 uc2 uc3 a3 protocole a1 uc1 vue1 vue2 vue3 c1 c2 c3 e1 e2 e3 e4 uc1 vue1 c1 e1 e2 m1 m2 m3 Vopc a1 vue1 c1
RAII : Présentation du pb Tout s’est mal passé et en plus On ne libère pas les ressources out Tout s’est mal passé et en plus On ne libère pas les ressources
(RAII)  à la sauce Java (Finally)
RAII à la sauce C++ Selon l'approche RAII, on peut modifier la classe Datafile pour qu'elle fasse le Open() dans  son constructeur (avec levée d'exception), et le Close() dans son destructeur. Puis l'on crée une petite classe utilitaire DBLock qui gère le verrouillage de la base :
Patterns et architecture MVC FrameWork Organisation des packages Métriques
Patterns et architecture MVC FrameWork Organisation des packages Métriques
MVC V C M Vue 1 2 3 4 5 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
MVC : Design pattern composé V C M Composite Stratégie/etat Sujet Observer UpDate()
MVC
Framework : Introduction ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Framework : Utilisation ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Composant ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Organisation des packages
Organisation des packages
Dépendances cycliques : Interface ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Métriques (1) ·  Lines of Code (LOC) : Le nombre total de lignes de code. Les lignes blanches et les commentaires ne sont pas comptabilisés ·  Number of Static Methods (NSM) : Le nombre de méthodes statiques dans   l'élément sélectionné. ·  Afferent Coupling (CA) : Le nombre de classes hors d'une package qui dépendent  d'une classe dans le package ·  Normalized Distance (RMD) : RMA + RMI - 1: Ce nombre devrait être petit, proche  de zéro pour indiquer une bonne conception des parquets. ·  Number of Classes (NOC) : Le nombre de classes dans l'élément sélectionné. ·  Specialization Index (SIX) : NORM * DIT / NOM: Moyenne de l'index de spécialisation. ·  Instability (RMI) : CE / (CA + CE) : Ce nombre vous donnera l'instabilité de votre projet. C'est-à-dire les dépendances entre les paquets. ·  Number of Attributes (NOF) : Le nombre de variables dans l'élément sélectionné. ·  Number of Packages (NOP) : Le nombre de packages dans l'élément sélectionné. ·  Method Lines of Code (MLOC) : Le nombre total de lignes de codes dans les méthodes.  Les lignes blanches et les commentaires ne sont pas comptabilisés ·  Weighted Methods per Class (WMC) : La somme de la complexité cyclomatique de  McCabe pour toutes les méthodes de la classe. ·  Number of Overridden Methods (NORM) : Le nombre de méthodes redéfinies. ·  Number of Static Attributes (NSF) : Le nombre de variables statique. ·  Nested Block Depth (NBD) : La profondeur du code
Métriques (2) ·  Number of Methods (NOM) : Le nombre de méthodes . ·  Lack of Cohesion of Methods (LCOM) : Une mesure de la cohésion d'une classe. Plus le  nombre est petit et plus la classe est cohérente, un nombre proche de un indique que  la classe pourrait être découpée en sous-classe. Néanmoins, dans le cas de Javabean,  cette métrique n'est pas très correcte, car les getteurs et les settteurs sont utilisés  comme seules méthodes d'accès aux attributs. Le résultat est calculé avec la méthode  d' Henderson-Sellers : on prend m(A), le nombre de méthodes accédant à un attribut A,  on calcule la moyenne de m(A) pour tous les attributs, on soustrait le nombre de  méthodes m et on divise par (1-m). ·  McCabe Cyclomatic Complexity (VG) : La complexité cyclomatique d'une méthode.  C'est-à-dire le nombre de chemins possibles à l'intérieur d'une méthode, le nombre de  chemin est incrémenté par chaque boucle, condition, opérateur ternaire, # Il ne faut  pas que ce nombre soit trop grand pour ne pas compliquer les tests et la  compréhensibilité de la méthode. ·  Number of Parameters (PAR) : Le nombre de paramètres. ·  Abstractness (RMA) : Le nombre de classes abstraites et d'interfaces divisés par le nombre  total de classes dans un package. Cela vous donne donc le pourcentage de classes  abstraites par package ·  Number of Interfaces (NOI) : Le nombre d'interfaces. ·  Efferent Coupling (CE) : Le nombre de classes dans un packages qui dépendent d'une  classe d'un autre package.
Métriques (3) ·  Number of Children (NSC) : Le nombre total de sous-classes directes d'une classe ·  Depth of Inheritance Tree (DIT) : Distance jusqu'à la classe Object dans la hiérarchie  d'héritage. Graphe de dépendances entre packages http://metrics.sourceforge.net/update
Bibliographie ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Vidéo Google : DP & Python :  http://www.aleax.it/goo_pydp.pdf  (2h)Alex Martelli
Table des matières Les patterns Grass  5 Principes fondamentaux de conception 14 Processus objet (up-xp) 32 Processus objet (test-refactoring) 52 ______________________________________ Les design patterns 70 Les design patterns de comportement 75 Automate 76 Stratégie 86 Patron de méthode 90 Observeur 96 Visiteur 105 Memento 110 Iterateur 115 Chaîne de responsabilité 121 Commande 125 Interpréteur 130 Médiateur 131 Les design patterns de structure 132 Proxy 133 Decorateur 147 Adaptateur 158 Composite 162 Façade 167 Poids mouche 171 Pont 173 Les designs patterns de création 175 Singleton 176 Fabrication 179 Fabrication abstraite 186 Builder 190 Prototype 195 _______________________________________ Autres Patterns 200 Les classes d'analyse 201 Raii 202 Patterns et architecture 205 MVC 207
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java
Design Patterns Java

Weitere ähnliche Inhalte

Was ist angesagt?

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...
ENSET, Université Hassan II Casablanca
 
Conception et Mise en place d'une Application Web SPA pour les établissements...
Conception et Mise en place d'une Application Web SPA pour les établissements...Conception et Mise en place d'une Application Web SPA pour les établissements...
Conception et Mise en place d'une Application Web SPA pour les établissements...
Ben Ahmed Zohra
 

Was ist angesagt? (20)

Rapport de projet de conception et de développement
Rapport de projet de conception et de développementRapport de projet de conception et de développement
Rapport de projet de conception et de développement
 
Gestion des actifs applicatifs
Gestion des actifs applicatifsGestion des actifs applicatifs
Gestion des actifs applicatifs
 
UML Part2- diagramme des uses cases_mansouri
UML Part2- diagramme des uses cases_mansouriUML Part2- diagramme des uses cases_mansouri
UML Part2- diagramme des uses cases_mansouri
 
11 visual basic .net - acces aux donnees avec ado .net
11 visual basic .net - acces aux donnees avec ado .net11 visual basic .net - acces aux donnees avec ado .net
11 visual basic .net - acces aux donnees avec ado .net
 
Deep Learning : Application à la reconnaissance d’objets de classes multiples...
Deep Learning : Application à la reconnaissance d’objets de classes multiples...Deep Learning : Application à la reconnaissance d’objets de classes multiples...
Deep Learning : Application à la reconnaissance d’objets de classes multiples...
 
Partie3BI-DW-OLAP2019
Partie3BI-DW-OLAP2019Partie3BI-DW-OLAP2019
Partie3BI-DW-OLAP2019
 
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...
 
PROJET JAVA BD MySQL
PROJET JAVA BD MySQLPROJET JAVA BD MySQL
PROJET JAVA BD MySQL
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 
These
TheseThese
These
 
Conception et Mise en place d'une Application Web SPA pour les établissements...
Conception et Mise en place d'une Application Web SPA pour les établissements...Conception et Mise en place d'une Application Web SPA pour les établissements...
Conception et Mise en place d'une Application Web SPA pour les établissements...
 
Prez PFE
Prez PFEPrez PFE
Prez PFE
 
Speech de PFE de Ahmed Jebali - CM- ISAMM-Encadré par Wafa Bourkhis (Design)...
Speech de PFE de Ahmed Jebali - CM- ISAMM-Encadré par Wafa Bourkhis  (Design)...Speech de PFE de Ahmed Jebali - CM- ISAMM-Encadré par Wafa Bourkhis  (Design)...
Speech de PFE de Ahmed Jebali - CM- ISAMM-Encadré par Wafa Bourkhis (Design)...
 
Cours design pattern m youssfi partie 4 composite
Cours design pattern m youssfi partie 4 compositeCours design pattern m youssfi partie 4 composite
Cours design pattern m youssfi partie 4 composite
 
Rapport de Mémoire Master Recherche
Rapport de Mémoire Master RechercheRapport de Mémoire Master Recherche
Rapport de Mémoire Master Recherche
 
BI : Analyse des Données avec Mondrian
BI : Analyse des Données avec Mondrian BI : Analyse des Données avec Mondrian
BI : Analyse des Données avec Mondrian
 
Modele-elearning
Modele-elearningModele-elearning
Modele-elearning
 
Support de cours Spring M.youssfi
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfi
 
BigData_Chp2: Hadoop & Map-Reduce
BigData_Chp2: Hadoop & Map-ReduceBigData_Chp2: Hadoop & Map-Reduce
BigData_Chp2: Hadoop & Map-Reduce
 
Chapitre 5 classes abstraites et interfaces
Chapitre 5  classes abstraites et interfacesChapitre 5  classes abstraites et interfaces
Chapitre 5 classes abstraites et interfaces
 

Andere mochten auch (7)

An Introduction to Game Programming with Flash: Design Patterns
An Introduction to Game Programming with Flash: Design PatternsAn Introduction to Game Programming with Flash: Design Patterns
An Introduction to Game Programming with Flash: Design Patterns
 
Game Programming Pattern by Restya
Game Programming Pattern by RestyaGame Programming Pattern by Restya
Game Programming Pattern by Restya
 
Design Patterns (2003)
Design Patterns (2003)Design Patterns (2003)
Design Patterns (2003)
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Design patterns : résumé
Design patterns : résuméDesign patterns : résumé
Design patterns : résumé
 
Java - implémentation des concepts objets
Java - implémentation des concepts objetsJava - implémentation des concepts objets
Java - implémentation des concepts objets
 
Cours design pattern m youssfi partie 3 decorateur
Cours design pattern m youssfi partie 3 decorateurCours design pattern m youssfi partie 3 decorateur
Cours design pattern m youssfi partie 3 decorateur
 

Ähnlich wie Design Patterns Java

U M L Analyse Et Conception Objet
U M L Analyse Et Conception ObjetU M L Analyse Et Conception Objet
U M L Analyse Et Conception Objet
Amine Chkr
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
cyrilgandon
 
Correction examen-java-avancé-1
Correction examen-java-avancé-1Correction examen-java-avancé-1
Correction examen-java-avancé-1
vangogue
 

Ähnlich wie Design Patterns Java (20)

Cours spring
Cours springCours spring
Cours spring
 
Design poo togo_jug_final
Design poo togo_jug_finalDesign poo togo_jug_final
Design poo togo_jug_final
 
Design poo togo_jug_final
Design poo togo_jug_finalDesign poo togo_jug_final
Design poo togo_jug_final
 
U M L Analyse Et Conception Objet
U M L Analyse Et Conception ObjetU M L Analyse Et Conception Objet
U M L Analyse Et Conception Objet
 
Uml
UmlUml
Uml
 
Design applicatif avec symfony2
Design applicatif avec symfony2Design applicatif avec symfony2
Design applicatif avec symfony2
 
Qualité de code et bonnes pratiques
Qualité de code et bonnes pratiquesQualité de code et bonnes pratiques
Qualité de code et bonnes pratiques
 
Apprentissage du java
Apprentissage du javaApprentissage du java
Apprentissage du java
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Presentation Spring
Presentation SpringPresentation Spring
Presentation Spring
 
Entity_framework_db first
Entity_framework_db firstEntity_framework_db first
Entity_framework_db first
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Tutoriel java
Tutoriel javaTutoriel java
Tutoriel java
 
Correction examen-java-avancé-1
Correction examen-java-avancé-1Correction examen-java-avancé-1
Correction examen-java-avancé-1
 
10-Cours de Géniel Logiciel
10-Cours de Géniel Logiciel10-Cours de Géniel Logiciel
10-Cours de Géniel Logiciel
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategy
 
Fondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application FlexFondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application Flex
 
Fondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application FlexFondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application Flex
 
Cours partie1 elgarrai zineb
Cours partie1 elgarrai zinebCours partie1 elgarrai zineb
Cours partie1 elgarrai zineb
 

Mehr von VINOT Bernard (7)

Le robot agile
Le robot agileLe robot agile
Le robot agile
 
Introduction à l'Agilité
Introduction à l'AgilitéIntroduction à l'Agilité
Introduction à l'Agilité
 
Up1
Up1Up1
Up1
 
Un Sctroumph
Un SctroumphUn Sctroumph
Un Sctroumph
 
Automate1 Correction
Automate1 CorrectionAutomate1 Correction
Automate1 Correction
 
Definitiondesbesoinsuml
DefinitiondesbesoinsumlDefinitiondesbesoinsuml
Definitiondesbesoinsuml
 
Mini Oo
Mini OoMini Oo
Mini Oo
 

Design Patterns Java

  • 1. Design Patterns JAVA Conception d’applications objet B.Vinot
  • 2.
  • 3. Pourquoi faire de l'objet(1) ?
  • 4. Pourquoi faire de l'objet(2) ?
  • 5. Introduction aux Design Patterns Les Patterns GRASS General ResponsabilityAssignement Software Patterns
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14. Principes fondamentaux de conception Ouverture-Fermeture OCP Inversion des dépendances DIP Substitution de Liskov LSP Séparation des interfaces ISP
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22. Principes de substitution de LISkOV ( LSP ) : exemple class Rectangle { int longueur, largeur; public: virtual void setValeur(int long, int larg) {longueur = long; largeur = larg; }; class Carre : public Rectangle { public: virtual void setValeur(int long, int larg) { if (long != larg) throw std::exception(« long !=larg&quot;); super.setValeur(long, larg); } }; void utiliserRectangle(int lng) { leRectangle.setValeur(lng, lng * 2); assert(leRectangle.getArea() == (length*length*2)); Que se passe-t-il si le Rectangle est un carré? Héritage<>Composition
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28. Principes de séparation des interfaces ( ISP )
  • 29.
  • 30.
  • 31.
  • 32. Processus Objet UP XP-Agile Winston Royce. Managing the Development of Large Software Systems . 1970
  • 33.
  • 34. UP & les modèles UML (1)
  • 35. UP & les modèles UML (2) Modèle des cas d’utilisation Expose les cas d’utilisation et leurs relations avec les utilisateurs Modèle d’analyse Détaille les cas d’utilisation et procède à une première répartition du comportement du système entre divers objets Modèle de conception Définit la structure statique du système sous forme de sous système, classes et interfaces ; Définit les cas d’utilisation réalisés sous forme de collaborations entre les sous systèmes les classes et les interfaces Modèle d’implémentation Intègre les composants (code source) et la correspondance entre les classes et les composants Modèle de test Décrit les cas de test vérifiant les cas d’utilisation Modèle de déploiement Définit les nœuds physiques des ordinateurs et l’affectation de ces composants sur ces nœuds. Modèle d'architecture Description de l’architecture (réutilisable)
  • 36. UP & L'organisation matricielle
  • 37. Processus Objet XP-Agile Extrem programing La programmation extrême Les processus agiles
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 52. Processus Objet Tests Refactoring
  • 54. Junit
  • 55. Junit : Ecrire le test package com.moi.test.junit; import junit.framework.TestCase; public class MaClasseTest extends TestCase {    private MaClasse maClasse = null;    public MaClasseTest(String arg0) {          super(arg0);    }    public static void main(String[] args) {          junit.swingui.TestRunner.run(MaClasseTest.class);    }    protected void setUp() throws Exception {          super.setUp();          maClasse = new MaClasse();    }    protected void tearDown() throws Exception {          super.tearDown();          maClasse = null;    }    public void testAdditioner() {          assertTrue(maClasse.additioner(2,2) == 4);  } }
  • 56. Junit : lancement du test Regrouper les tests : Sur un projet ou un package Faire new JunitTestSuite (Other) Junit4
  • 57.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 69. Les Design patterns Le GoF Comportement Structure Création
  • 70.
  • 71.
  • 72.
  • 73. Classification des patterns Création Comportement Structure
  • 74.
  • 75.
  • 76.
  • 77.
  • 78. State : UML Client Etat +Op1(Context) +Op2(Context) +Op3(Context) * Etat1 +Op1(Context) +Op2(Context) Etat2 +Op2(Context) +Op3(Context)
  • 79.
  • 80. State : Exercice1- La banque SilverState(0-1000) do: Interet = 10% RedState(<0) do: Interet = 0 do: Frais = 15 GoldenState(>1000) do: Interet = 50% [ balance > 1000 ] [ balance < 0 ] [ balance > 0 ] [ balance < 1000 ] [ balance < 0 ] la banque
  • 81. State : Exercice1- La banque balance<0 => Interet 0% Balance entre 0 et 1000 => Interet 10% Balance > 1000 => Interet 50% balance<0 => Pénalité de 15 la banque
  • 82. State : Exercice1 int main() { Account account(&quot;Jim&quot;); account.Deposit(500.0); account.PayInterest (); account.Deposit(300.0); account.PayInterest (); account.Deposit(550.0); account.PayInterest(); account.Withdraw(2000.00); account.PayInterest(); account.Withdraw(1100.00) ; account.Withdraw(1000); account.PayInterest(); account.Deposit(2000); return 0; } Gold Silver r Silver Red Silver la banque
  • 84. State + Singleton Exo2 Objet o; o.C1();o.C2();o.C3();o.C3(); Objet o1; o1.C1();o1.C3();o1.C2(); o1.C1();o1.C2();o1.C3(); o1.C1();o1.C3(); Automate
  • 85.
  • 86.
  • 88.
  • 89.
  • 90.
  • 91. Patron de méthode : Exemple TravaillerMatin(); Dejeuner(); TravaillerApresMidi(); Loisir(); Dormir(); Patron de méthode vivre If (age > 15) TravaillerMatin(); else Jouer(); ………… . MiamMiam RonRon C’est drôle
  • 92. Patron de méthode BlaBlater: BlaBla TravaillerMatin: BlaBlater(); TravaillerApresMidi: BlaBlater(); Loisir: BlaBlater Personneb age : int Dejeuner() <<{abstract}>> TravaillerMatin() <<{abstract}>> TravaillerApresMidi() <<{abstract}>> Loisir() Dormir() Jouer() <<abstract>> Vivre() Chirurgien TravaillerMatin() TravaillerApresMidi() Loisir() Professeur TravaillerMatin() TravaillerApresMidi() Loisir() BlaBlater() TravaillerMatin: Ouvrir(); TravaillerApresMidi: Fermer(); Loisir: Histoire grivoise
  • 93. Patron de méthode TravaillerMatin(); Dejeuner(); TravaillerApresMidi(); Loisir(); Dormir(); TravaillerMatin: Dormir(); TravaillerApresMidi: AllerANPE(); Loisir: Pleurer();
  • 94.
  • 95. Patron de méthode : Exo : Impôts
  • 96.
  • 97.
  • 98. l’Observer : UML Réutilisable Rmq : souvent UpDate contient des paramètres (evt, le sujet, l'état du sujet, …)
  • 99. l ’Observer : la dynamique
  • 100.
  • 101. Observer : Java setChanged () {changed = true;} NotifyObservers() { if (changed) { for each observer update(); changed = false; } Cela permet d'optimiser en n'appelant pas les observers à chaque changement d'état du sujet,mais seulement après un setChanged(). import java.util.*;
  • 102. Observer : Java- Swing Public class Exemple{ JFrame cadre; Public static main(){ Exemple e = new Exemple(); e.go();} Public void go(){ cadre =new JFrame(); Jbutton b = new Jbutton (« Dois-je le faire »); b.AddActionListener(new Ange()); b.AddActionListener(new Demon()); ………………………………… .} } class Ange implements ActionListener { Public void ActionPerformed(ActionEvent e) {Print « Non »}} class Ange implements ActionListener { Public void ActionPerformed(ActionEvent e) {Print « Oui »}} Dois-je le faire Non Oui
  • 103. Observer : Exercice1 Mer-Montagne Meteo.Calculer met température entre 0 et 20. Skieur.update va en vacances si la température est < 10° Nageur.update va en vacances si la température est >= 10° Meteo m = new Meteo(); Nageur n = new Nageur(); Skieur s =new Skieur(); m.addObserver(n); m.addObserver(s); m.calculer(); m.setChanged(); m.calculer(); m.setChanged(); m.calculer(); m.setChanged(); m.calculer(); le skieur va a la montagne : 8 le nageur va a la mer : 12 le skieur va a la montagne : 6 8 8 12 ? Observable -changed: bool +addObserver(Observer) +deleteObserver(Observer) +countObservers(): int +deleteObservers() +notifyObservers() #setChanged() Observer Meteo -temperature: int +setChanged() +calculer() +getTemperature(): int Skieur +update(p1: Observable, p2: Object) Nageur +update(p1: Observable, p2: Object) Main +main(args: String)
  • 104. Observer : Exercice2 Les villes
  • 105.
  • 107. Visiteur et l’objet Composite Iterator iter =employees.iterator(); { Employee e; while (iter.hasNext()) { e =(Employee)iter.next(); e.Accept(visitor);} } RMQ : Il est possible d’explorer l’ensemble d’un composite avec un visiteur. Dans ce cas Employee et Employees ont tous les deux une méthode Accept et sont donc des Elements.
  • 108.
  • 110. Mémento : UML La classe à surveiller-----La mémoire----Le programme client (main) UnDo-ReDo
  • 111.
  • 112. Mémento : Exemple(1) import java.util.*; // &quot;Originator&quot; class SalesProspect { private String name; private String phone; private double budget; public String getName() { return name; } public void setName(String value) { name = value; } public String getPhone() { return phone; } public void setPhone (String value) { phone = value; } public double getBudget() { return budget; } public void setBudget (double value) { budget = value; } public Memento SaveMemento() {return (new Memento( name, phone, budget ));} public void RestoreMemento( Memento memento ) { this.name = memento.getName(); this.phone = memento.getPhone(); this.budget = memento.getBudget(); } public void Afficher() { System.out.println( &quot;Sales prospect ---- &quot; ); System.out.println( &quot;Name: &quot; + this.name ); System.out.println( &quot;Phone: &quot; + this.phone ); System.out.println( &quot;Budget:&quot; + this.budget ); } } class Memento { private String name; private String phone; private double budget; // Constructors public Memento( String name, String phone, double budget ) { this.name = name; this.phone = phone; this.budget = budget; } public String getName() { return name; } public void setName(String value) { name = value; } public String getPhone() { return phone; } public void setPhone (String value) { phone = value; } public double getBudget() { return budget; } public void setBudget (double value) { budget = value; } } // &quot;Caretaker&quot; class ProspectMemory { private Memento memento; public void setMemento (Memento value){ memento = value; } public Memento getMemento () { return memento; } }
  • 113. Mémento : Exemple(2) public class MementoApp { public static void main(String argv[]) { SalesProspect s = new SalesProspect(); s.setName ( &quot;Landru&quot;); s.setPhone (&quot;08080808&quot;); s.setBudget( 25000.0); s.Afficher(); // Store internal state ProspectMemory m = new ProspectMemory(); m.setMemento( s.SaveMemento()); // Continue changing originator s.setName( &quot;Tintin&quot;); s.setPhone( &quot;33333333&quot;); s.setBudget( 1.0); s.Afficher(); // Restore saved state s.RestoreMemento( m.getMemento() ); s.Afficher(); } }
  • 114. Memento : UML-Dynamique : Client : Caretaker : Originator : Memento <<create>> SaveMemento(): void <<create>> SetState(): void rend le memento SetMemento(p Memento): void GetMemento(): void RestoreMemento(m): void GetState(): void mis a jour de l' é tat()
  • 115.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124. Chain of Resp : Exo Président <100000 Vice-président <25000 Directeur <10000 Comité >=100000 Director grouillot = new Director(); VicePresident Sam = new VicePresident(); President Tammy = new President(); Grouillot.SetSuccessor(Sam); Sam.SetSuccessor(Tammy); Purchase p = new Purchase( 350.00, &quot;Formation&quot;); Grouillot.ProcessRequest(p); p = new Purchase( 24000, &quot;Voiture&quot;); Grouillot.ProcessRequest(p); p =new Purchase ( 99000, &quot;Maison&quot;); Grouillot.ProcessRequest(p); p = new Purchase( 122100.00, &quot;Usine&quot;); Grouillot.ProcessRequest(p); U M V F
  • 125.
  • 126. Command : UML Configurateur Utilisateur
  • 127.
  • 128.
  • 129. Command : Correction Architecture Je construis les murs Je construis le toit Je casse le toit Je construis le toit Je casse le toit Je construis le toit Je construis les murs
  • 131. Mediator : UML Mediator ConcreteMediator Colleague +mediator bouton liste textArea Controleur menu Rmq :Façade-Observer
  • 132.
  • 133.
  • 134. Proxy : UML Proxy.Operation1() { fait qqchose….. leSujet.Operation1();} Proxy.Proxy(Sujet param){ leSujet = param;}
  • 135.
  • 136. Proxy Distant RPC RMI CORBA DCOM WEBSERVICE Stub skeleton IDL Interface WSDL SujetReel +Operation1() Proxy +Operation1() +Proxy(p: Sujet) Sujet +Operation1() Client Call Send Call RMIC
  • 137.
  • 138.
  • 139. Proxy de protection :exercice (1) le patron et les grouillots
  • 140. Proxy de protection :exercice (2) le patron et les grouillots
  • 141. Proxy de protection avec InvocationHandler Moi même Les autres getNom() getSexe() getInterest() getSexyOuNon() SetNom(String) setSexe(String) setInterest(String) setSexyOuNon(int) Rmq : setSexyOuNon () fait la moyenne des notes obtenues getNom() getSexe() getInterest() getSexyOuNon() SetNom(String) setSexe(String) setInterest(String) setSexyOuNon(int) BeanPersonne <<interface>> ~getNom(): String ~getSexe(): String ~getInterets(): String ~getSexyOuNon(): int ~setNom(nom: String) ~setSexe(sexe: String) ~setInterets(interets: String) ~setSexyOuNon(note: int)
  • 142. Proxy de protection avec InvocationHandler
  • 143. Méthode invoke de non Propriétaire InvocationHandlerNonProprietaire public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException { try { if (method.getName().startsWith(&quot;get&quot;)) { return method.invoke(personne, args); } else if (method.getName().equals(&quot;setSexyOuNon&quot;)) { return method.invoke(personne, args);} else if (method.getName().startsWith(&quot;set&quot;)) { throw new IllegalAccessException(); } } catch (InvocationTargetException e) { e.printStackTrace();} return null; }
  • 144. Méthode invoke de Propriétaire InvocationHandlerProprietaire public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException { try { if (method.getName().startsWith(&quot;get&quot;)) { return method.invoke(personne, args); } else if (method.getName().equals(&quot;setSexyOuNon&quot;)) { throw new IllegalAccessException();} else if (method.getName().startsWith(&quot;set&quot;)) { return method.invoke(personne, args);} } catch (InvocationTargetException e) {e.printStackTrace();} return null; }
  • 145. Proxy invocationHandler :Exercice(1) le club de rencontres Rmq basedonnees est une Hashtable ---------------------------------------------- Passage difficile :
  • 146. Proxy invocationHandler :Exercice(2) le club de rencontres
  • 147. Decorator : Présentation Problème : nombreux héritages Solution : Héritage  héritage + agrégation (poupée russe)
  • 148. Decorator :Le problème(1) Nous allons revoir la façon dont on abuse généralement de l’héritage et vous allez apprendre comment « décorer » vos classes au moment de l’exécution en utilisant une forme de composition. Pourquoi? Une fois que vous connaîtrez les techniques de décoration, vous pourrez affecter à vos objets (ou à ceux des autres) de nouvelles responsabilités sans modifier le code des classes sous-jacentes. RMQ :Le principe d’Ouverture (n’hésitez pas à étendre nos classes) et de Fermeture (Pas touche à mon code) Un Deca avec du lait et du citron
  • 149. Decorator :Le problème(2) Ecrire les méthodes Boisson::Cout et Colombia::Cout Boisson.Cout() { If GetLait() then cout += coutDuLait If GetVanille() then cout += coutVanille ………………………………………… . Return cout; } Colombia::Cout () { Return 25+ super.Cout() } Que se passe-t-il si on rajoute la crème Chantilly? Il faut modifier Boisson.Cout --- Pas touche à mon code
  • 150. Decorator : UML Decorateuri.Operation(): fait qq chose super.Operation() Cela revient à rajouter une responsabilité à une classe mais sans en changer l'interface. Comparer avec le composite ComposantConcret.Operation : fin de la chaîne Decorateur.Operation() : monComposant.Operation()
  • 151.
  • 152.
  • 153.
  • 154. Decorator : Exemple On utilise l’héritage entre Ingrédient et boisson par Snobisme Boisson::Cout est abstraite Colombia::Cout return 25 (le coût du Colombia sans ingrédient Lait::Cout return le cout du Lait(10) + Le coût de maBoisson Utilisation : Boisson b1 = new Colombia() b1.cout() => 25 Boisson b2 =new Colombia() b2 = new Lait(b2); b2.cout()=> 25 + 10 b2 = new Citron(b2); ….. Colombia Que se passe-t-il si on rajoute la crème Chantilly? Il faut rajouter la classe Chantilly Lait Colombia Citron Lait Colombia
  • 155. Decorator : Un mauvais exemple(1)
  • 156. Decorator : un mauvais exemple (2)
  • 157. Decorator : Exercice les soldats
  • 158.
  • 159. l ’Adaptateur : Uml et Exemple
  • 160.
  • 161. L'adaptateur : Exercice Canards oies Canard.Cancaner  &quot;Coincoin&quot; Leurre.Cancaner  &quot;Silence&quot; CanardPlastique  &quot;Pchiff&quot; Oie.Cacarder  &quot; CoincoinCoincoin &quot; Pb : Faire cancaner une troupe de Cancaneur contenant des oies
  • 162.
  • 163.
  • 164. Composite : Exercice // Configuration Peripherique p1 = new Peripherique (&quot;DVD&quot;, 100,8); Peripherique p2 = new Peripherique (&quot;Disque Dur&quot;, 1000,9); Peripherique p3 = new Peripherique (&quot;Modem ADSL&quot;, 1,8); Peripherique p4 = new Peripherique (&quot;Pentium&quot;, 3500 ,386); Peripherique p5 = new Peripherique (&quot;Ventilo &quot;, 150,15); Container carteMere = new Container (&quot;Carte mère&quot;); carteMere.Ajouter(p4);carteMere.Ajouter(p5); TourDeLuxe tour = new TourDeLuxe (&quot;tour&quot;,100); tour.Ajouter(p1);tour.Ajouter(p2);tour.Ajouter(carteMere); Container ordi = new Container (&quot;IBM&quot;); Ordi.Ajouter (tour);ordi.Ajouter (p3); // Utilisation System.out.println( &quot;le prix total est de : &quot; + ordi.GetPrix() ); Composite Leaf le prix d'un ordi Ordi IBM Tour DVD HD Carte mère Modem Adsl Carte mére Pentium Ventilo
  • 165. Composite : Solution le prix d'un ordi
  • 167.
  • 168.
  • 169.
  • 170.
  • 171. Flyweight : Poids mouche :UML Utilisation : beaucoup de petits objets à se partager à plusieurs. Exemple : les caractères d'un document PluriGleton
  • 172.
  • 173. Bridge : UML Rmq : ressemble au state
  • 174. Bridge : Exemple #include <iostream> using namespace std; // .h class Implementor; class Abstraction { protected :Implementor *implementor; public : void SetImplementor(Implementor *value); virtual void Operation();} ; class Implementor { public : virtual void Operation()=0; } ; class RefinedAbstraction : public Abstraction { public :void Operation();}; class ConcreteImplementorA : public Implementor { public : void Operation() ; } ; class ConcreteImplementorB : public Implementor { public : void Operation() ;}; // .cpp void Abstraction::SetImplementor(Implementor *value) {implementor = value;} void Abstraction::Operation() { implementor->Operation(); } void RefinedAbstraction::Operation(){ implementor->Operation(); } void ConcreteImplementorA::Operation(){cout << &quot;OperationA&quot; << endl;} void ConcreteImplementorB::Operation(){ cout << &quot;OperationB&quot; << endl;} int main() { Abstraction *ab = new RefinedAbstraction(); ab->SetImplementor( new ConcreteImplementorA()); ab->Operation(); ab->SetImplementor(new ConcreteImplementorB()); ab->Operation(); }
  • 175.
  • 176.
  • 178. Amélioration du singleton L'usine à singleton : Remplacer singletons par singleton Rmq : En C++, mettre en private le constructeur de copie et l'opérateur d'affectation Rmq : En multi thread, utiliser un mutex ou synchronized.                                                    
  • 179. Fabrication : Présentation Le problème : If cas1 alors return new c1(); If cas2 alors return new c2(); If cas3 alors return new c3(); Problème de dépendance, ce sous programme dépend de c1,c2,c3…. Et ce problème arrive à chaque fois que l'on veut créer un des ces objets. C'est du code Beurgh! La fabrication va garder et prendre en charge ce code Beurgh, au moins Il sera à un seul endroit. Règle POO : Remplacer le switch par le polymorphisme Fabrication : Garder le switch ce qui évitera de faire des New (et des dépendances)
  • 180.
  • 181. Fabrication : exemple les pizzerias(1) L'usine Les produits
  • 182. Fabrication : exemple les pizzerias(2) : qq celleDeBrest : Pizzeria brest-fromage : Pizza commanderPizza(type: String): pizza creerPizza(item: String): pizza preparer(): void cuire(): void couper(): void emballer(): void [B] Pizza creerPizza (String item) if (item.equals(&quot;fromage&quot;)) { return new PizzaFromageStyleBrest();} else if…… Pizzeria fabriqueBrest = new FabriqueDePizzasBrest(); [A] Pizza pizza = fabriqueBrest.commanderPizza( &quot;fromage&quot; ); [B] System.out.println(&quot;Luc a commandé une &quot; + pizza.getNom() + &quot;&quot;); [A]
  • 183. Fabrication : le Design pattern
  • 184.
  • 185. Fabrication exercice les livres Fabrique Le produit FabriquePage fab = new FabriquePage(); Page i = fab.CreatePage(&quot;Intro&quot;); i.Afficher(); i=fab.CreatePage(&quot;Conclusion&quot;); i.Afficher();
  • 186. Fabrication Abstraite : motivation Application IHM Motif IHM windows Application IHM IHM Motif IHM windows L ’application utilise IHM sans savoir si il s ’agit de Motif ou bien de Windows
  • 187. Fabrication Abstraite : Structure <<instancie>> Application
  • 188.
  • 189.
  • 190.
  • 192.
  • 193. Builder : Exemple voici la partie A du produit1 voici la partie B du produit1 voici la partie A du produit2 voici la partie B du produit2
  • 194. Builder : Exo void main() { Shop shop = new Shop(); VehicleBuilder b2 = new CarBuilder(); VehicleBuilder b3 = new MotorCycleBuilder(); shop.Construct(b2); b2.GetVehicle().Show(); shop.Construct(b3); b3.GetVehicle().Show(); } Usine de véhicules Vehicule type : String moteur : String roue : String porte : String Show() : void VehiculeBuilder GetVehicule() : Vehicule BuildMoteur() : void BuildRoue() : void BuildPorte() : void 1 #vehicule 1 MotoBuilder BuildMoteur() : void BuildRoue() : void BuildPorte() : void MotoBuilder() VoitureBuilder BuildMoteur() : void BuildRoue() : void BuildPorte() : void VoiturBuilder() Shop Construire(p : VehiculeBuilder) : void
  • 195.
  • 196.
  • 197. DP : Exercice général(1) Les stagiaires ont un nom, un sexe et une catégorie (TM, M, Moyen, B , TB). Ils font des exos qui sont réussis en fonction de leur état (TM =4-10, M=5-10, B=10-15, TB=15-20,Moyen =11) Le prof note aléatoirement (presque) les exos mais favorise les filles. (note en fonction de l’état, plus ou moins un nombre compris entre –10 et + 8, rajouter 2 points pour les filles (sauf pour les très bonnes), la note finale est comprise entre 0-20. Quand un élève obtient une note < 7 son état se dégrade, alors que si il obtient une note > 13 son état s’améliore. Le chef vire celui ou celle qui a la plus mauvaise note à chaque exercice. Bill Gates débauche 2 fois le ou la meilleure, tandis que Google n’en débauche qu’un ou qu’une. D’autres personnes, entreprises ou organismes quelconques pourront bientôt s’ intéresser aux stagiaires. Toutes les notes sont sauvegardées pour chaque élève. Abuser Singleton State Observer Strategie Template methode memento
  • 198. DP : Exercice général(1) Abuser
  • 199.
  • 200. Autres Patterns Les classes d'analyse Le raii
  • 201.
  • 202. RAII : Présentation du pb Tout s’est mal passé et en plus On ne libère pas les ressources out Tout s’est mal passé et en plus On ne libère pas les ressources
  • 203. (RAII) à la sauce Java (Finally)
  • 204. RAII à la sauce C++ Selon l'approche RAII, on peut modifier la classe Datafile pour qu'elle fasse le Open() dans son constructeur (avec levée d'exception), et le Close() dans son destructeur. Puis l'on crée une petite classe utilitaire DBLock qui gère le verrouillage de la base :
  • 205. Patterns et architecture MVC FrameWork Organisation des packages Métriques
  • 206. Patterns et architecture MVC FrameWork Organisation des packages Métriques
  • 207.
  • 208. MVC : Design pattern composé V C M Composite Stratégie/etat Sujet Observer UpDate()
  • 209. MVC
  • 210.
  • 211.
  • 212.
  • 215.
  • 216. Métriques (1) · Lines of Code (LOC) : Le nombre total de lignes de code. Les lignes blanches et les commentaires ne sont pas comptabilisés · Number of Static Methods (NSM) : Le nombre de méthodes statiques dans l'élément sélectionné. · Afferent Coupling (CA) : Le nombre de classes hors d'une package qui dépendent d'une classe dans le package · Normalized Distance (RMD) : RMA + RMI - 1: Ce nombre devrait être petit, proche de zéro pour indiquer une bonne conception des parquets. · Number of Classes (NOC) : Le nombre de classes dans l'élément sélectionné. · Specialization Index (SIX) : NORM * DIT / NOM: Moyenne de l'index de spécialisation. · Instability (RMI) : CE / (CA + CE) : Ce nombre vous donnera l'instabilité de votre projet. C'est-à-dire les dépendances entre les paquets. · Number of Attributes (NOF) : Le nombre de variables dans l'élément sélectionné. · Number of Packages (NOP) : Le nombre de packages dans l'élément sélectionné. · Method Lines of Code (MLOC) : Le nombre total de lignes de codes dans les méthodes. Les lignes blanches et les commentaires ne sont pas comptabilisés · Weighted Methods per Class (WMC) : La somme de la complexité cyclomatique de McCabe pour toutes les méthodes de la classe. · Number of Overridden Methods (NORM) : Le nombre de méthodes redéfinies. · Number of Static Attributes (NSF) : Le nombre de variables statique. · Nested Block Depth (NBD) : La profondeur du code
  • 217. Métriques (2) · Number of Methods (NOM) : Le nombre de méthodes . · Lack of Cohesion of Methods (LCOM) : Une mesure de la cohésion d'une classe. Plus le nombre est petit et plus la classe est cohérente, un nombre proche de un indique que la classe pourrait être découpée en sous-classe. Néanmoins, dans le cas de Javabean, cette métrique n'est pas très correcte, car les getteurs et les settteurs sont utilisés comme seules méthodes d'accès aux attributs. Le résultat est calculé avec la méthode d' Henderson-Sellers : on prend m(A), le nombre de méthodes accédant à un attribut A, on calcule la moyenne de m(A) pour tous les attributs, on soustrait le nombre de méthodes m et on divise par (1-m). · McCabe Cyclomatic Complexity (VG) : La complexité cyclomatique d'une méthode. C'est-à-dire le nombre de chemins possibles à l'intérieur d'une méthode, le nombre de chemin est incrémenté par chaque boucle, condition, opérateur ternaire, # Il ne faut pas que ce nombre soit trop grand pour ne pas compliquer les tests et la compréhensibilité de la méthode. · Number of Parameters (PAR) : Le nombre de paramètres. · Abstractness (RMA) : Le nombre de classes abstraites et d'interfaces divisés par le nombre total de classes dans un package. Cela vous donne donc le pourcentage de classes abstraites par package · Number of Interfaces (NOI) : Le nombre d'interfaces. · Efferent Coupling (CE) : Le nombre de classes dans un packages qui dépendent d'une classe d'un autre package.
  • 218. Métriques (3) · Number of Children (NSC) : Le nombre total de sous-classes directes d'une classe · Depth of Inheritance Tree (DIT) : Distance jusqu'à la classe Object dans la hiérarchie d'héritage. Graphe de dépendances entre packages http://metrics.sourceforge.net/update
  • 219.
  • 220. Table des matières Les patterns Grass 5 Principes fondamentaux de conception 14 Processus objet (up-xp) 32 Processus objet (test-refactoring) 52 ______________________________________ Les design patterns 70 Les design patterns de comportement 75 Automate 76 Stratégie 86 Patron de méthode 90 Observeur 96 Visiteur 105 Memento 110 Iterateur 115 Chaîne de responsabilité 121 Commande 125 Interpréteur 130 Médiateur 131 Les design patterns de structure 132 Proxy 133 Decorateur 147 Adaptateur 158 Composite 162 Façade 167 Poids mouche 171 Pont 173 Les designs patterns de création 175 Singleton 176 Fabrication 179 Fabrication abstraite 186 Builder 190 Prototype 195 _______________________________________ Autres Patterns 200 Les classes d'analyse 201 Raii 202 Patterns et architecture 205 MVC 207