Top Banner

of 47

DesignPatterns cours.pdf

Oct 05, 2015

Download

Documents

Wajdi Sassi

Cours design patterns ENIS 2014
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
  • Les patrons de conception (Design patterns)

    Riadh BEN HALIMA Wajdi LOUATI [email protected] [email protected]

    1

    Plan

    Historique & Motivation Le patron Strategy Le patron Observer Le patron Decorator Le patron Abstract Factory Le patron Singleton Le patron Command Le patron Adapter Le patron Faade

    2

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Historique

    3

    Notion de patron dabord apparue en architecture : larchitecture des btiments la conception des villes et de leur environnement

    Larchitecte Christopher Alexander le dfinit comme suit: Chaque modle [patron] dcrit un problme qui se manifeste constamment

    dans notre environnement, et donc dcrit le cur de la solution de ce problme, dune faon telle que lon peut rutiliser cette solution des millions de fois. [Livre: The Timeless Way of Building, Oxford University Press 1979]

    Projeter la notion de patron du logiciel : "design pattern" premiers patrons partir de 1987 (partie de la thse de Erich Gamma) puis Richard Helm, John Vlissides et Ralph Johnson (Gang of Four, GoF) premier catalogue en 1993 : Elements of Reusable Object-Oriented Software

    Vocabulaire: modles de conception= patrons de conception= motifs de conception= design

    patterns

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Motivation Pourquoi dfinir des patrons de conception

    Construire des systmes plus extensibles, plus robustes au changement Capitaliser lexprience collective des informaticiens Rutiliser les solutions qui ont fait leur preuve Identifier les avantages/inconvnients/limites de ces solutions Savoir quand les appliquer

    Complmentaire avec les API Une API propose des solutions directement utilisables Un patron explique comment structurer son application avec une API

    Patron de conception dans le cycle de dveloppement Intervient en conception dtaille Reste indpendant du langage dimplantation

    4

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Dfinition Dfinition : "Un patron de conception (design pattern)

    dcrit une structure commune et rptitive de composants en interaction (la solution) qui rsout un problme de conception dans un contexte particulier

    Au lieu de la rutilisation de code, on parle de la rutilisation de lexprience avec les patrons

    Un bon patron de conception : rsout un problme correspond une solution prouve favorise la rutilisabilit, lextensibilit, etc.

    5 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Intrt et utilisation des patrons de conception La meilleure manire dutilisation des patrons de conception est de les mmoriser

    en tte, puis reconnaitre leurs emplacements et les appliquer dans la conception des applications

    6

    Les concepts de lorient objet tels que labstraction, lhritage, et le polymorphisme ne

    te rendent pas un bon concepteur! Un concepteur pense crer une conception flexible qui est maintenable et fait face aux

    changements

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Ce quil ne faut pas attendre des patrons de conception

    Une solution universelle prte lemploi Une bibliothque de classes rutilisables Lautomatisation totale de linstanciation dun

    patron de conception La disparition du facteur humain

    7 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Trois sortes de patrons

    8

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 9

    Le patron "Strategy"

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck: Conception (1/22)

    Objectif: dveloppement dun jeu de simulation dun bassin pour les canards

    Besoin: nager, cancaner, afficher, etc.. Supporter une large varit de canards

    Conception: OO Une supre classe Canard (Duck) dont tous les canards hritent

    10

    Duck quack() swim() display()

    RedHeadDuck

    display()

    MallardDuck

    display()

    Abstract

    Autres types de Ducks

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Innovation (2/22) Objectif: Innovation (pour impressionner et vendre +) Besoin: simuler le vol des canards! Conception: OO

    Ajouter la mthode fly() la supre classe

    11

    Duck quack() swim()

    fly() display()

    RedHeadDuck

    display()

    MallardDuck

    display()

    Modification apporte

    Autres types de Ducks

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Duck quack() swim()

    fly() display()

    RedHeadDuck

    display()

    MallardDuck

    display()

    RubberDuck

    display() quack(){ }

    Hriter par tous les canards

    SimUDuck : Problmes (3/22) Besoin: Au moment de la dmonstration du simulateur, on nous

    demande de simuler des canards en caoutchouc

    12 ? Le caoutchouc ne cancane pas

    Le caoutchouc ne vole pas !

    Conception: OO Ajouter la classe RubberDuck qui hrite de la supre classe Duck

    Redfinir squeak

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Constat (4/22) Problme 1: Le canard en caoutchouc ne cancane pas! Solution : Redfinir la mthode quack() squeak()

    (rsolu) Problme 2: Le canard en caoutchouc ne vole pas!

    Toutefois, il hrite la mthode fly() de la supre classe Duck!

    Constat: Ce que nous avons cru une utilisation formidable de lhritage

    dans le but de la rutilisation, sest termin mal au moment de la mise jour!

    Une mise jour du code a caus un effet global sur lapplication!

    13 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Solution?? (5/22) Problme 2: Le canard en caoutchouc ne vole pas! Toutefois, il

    hrite la mthode fly() de la supre classe Duck!

    Question: est ce que cest rsolu pour tous types de canards?

    RubberDuck

    display() quack(){ squeak }

    14

    fly(){ Redfinir rien }

    Solution: Redfinir la mthode fly() de RubberDuck

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Un autre canard (6/22) Nouveau type de canard: Canard en bois Problmes levs:

    Ce canard ne cancane pas Ce canard ne vole pas

    Solution: redfinir (une autre fois) les mthodes quack() et fly() WoodenDuck

    display() quack(){ Redfinir rien } fly(){ Redfinir rien }

    Inconvnients de lutilisation de lhritage Il est difficile de connaitre le comportement de tous les canards Un changement non-intentionnelle, affecte les autres canards

    15 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Des interfaces? (7/X) Hypothse: On nous demande de mettre jour SimUDuck tous les 6 mois: La

    spcification demeure changeante Vrifier fly() et quack() pour chaque nouveau canard R-crire (si besoin) fly() et quack()

    Solution possible pour contourner le problme: les interfaces

    Que dites vous de cette conception ? 16

    Duck

    swim() display()

    MallardDuck

    display() fly() quack()

    RedHeadDuck

    display() fly() quack()

    RubberDuck

    display() quack()

    WoodenDuck

    display()

    Quackable

    quack()

    Flyable

    fly()

    Interface

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Inconvnients (8/22)

    Constat: Duplication de code: mthodes fly() et quack() dans les sous-classes Autant dinterfaces tant quil y a un ensemble de canards ayant exclusivement un

    comportement commun (pondre: lay() pour les canards qui peuvent dposer un uf)

    Problme: si on veut modifier/adapter lgrement la mthode fly(), il faut le faire pour toutes les classes des canards (10 classes, 100, ou +)

    17

    Duck

    swim() display()

    MallardDuck

    display() fly() quack()

    RedHeadDuck

    display() fly() quack()

    RubberDuck

    display() quack()

    WoodenDuck

    display()

    Quackable

    quack()

    Flyable

    fly()

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Moment de rflexion (9/22)

    Pas toutes les sous-classes qui ont besoin de voler (fly) ou de cancaner (quack) Lhritage nest pas la bonne solution

    Les interfaces Flyable et Quackable rsolvent une partie du problme Dtruit compltement la rutilisation du code pour ces

    comportements La maintenance et la mise jour reprsentent un vrai calvaire

    Supposant quil existe plus quune faon de voler Maintenance plus difficile

    18

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Solution (10/22)

    Solution: Design pattern : solution ultime, cheval blanc, sauveur

    19

    Donner des raisons de changement de code dans votre application

    Trouvons une solution avec l"ancienne-mode" et ce en applicant les bonnes principes de la conception OO Concevoir une application, ou un besoin de

    modification/changement peut tre appliqu avec le moindre possible dimpact sur le code existant

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Rgle 1: Identifier les aspects variables de mon application et les sparer de ce qui reste invariant

    SimUDuck : Principe de conception (11/22)

    Cest la base de tous les patrons de conception Systme plus flexible+peu de consquences inattendues

    Mise en uvre Prendre la partie qui varie et lencapsuler. De cette faon, un changement ultrieur affecte la partie variable, sans toucher celle invariable

    20

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Sparation (12/22)

    21

    La classe Duck est toujours la supre classe Les comportements fly() et quack() sont retirs, et mis dans une

    autre structure

    Duck class Le comportement Fly

    Le comportement Quack

    Mettre dehors ce qui varie Comportements

    Invariable Variable

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Rgle 2: Programmer des interfaces, et non des implmentations

    Conception initiale: linflexibilit des comportements a engendr des troubles

    On veut affecter les comportements aux instances des Ducks tout en permettant: La cration dune instance (MallardDuck), Linitialisation avec un type de comportement (type de vol) La possibilit de changer le type de vol dynamiquement (?)

    SimUDuck : Conception des comportements (13/22)

    22

    Programmer pour les super-types! On utilise des interfaces pour reprsenter chaque

    comportement: FlyBehavior et QuackBehavior

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Conception des comportements (14/22)

    23

    FlyWithWings

    fly() { //vol }

    Quack

    quack(){ //quack }

    QuackBehavior

    quack()

    FlyBehavior

    fly()

    FlyNoWay

    fly() { //rien-ne vol pas }

    Squeak quack(){ //squeak //rubber }

    MuteQuack quack(){ //rien-ne //cancane pas }

    Consquences: On peut ajouter un nouveau comportement sans modifier ni le code des

    comportements existants, ni le code des classes des canards qui utilisent les comportements voler/cancaner

    Avec cette conception, dautres objets peuvent rutiliser le comportement fly et quack, parce quils ne sont plus cachs dans les classes canards.

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Intgration des comportements(15/22)

    24

    La supre classe Duck, dont hrite tous les canards

    Duck

    FlyBehavior fbehavior; QuackBehavior qbehavior;

    performQuack() swim() display() performFly() //.

    Variable dinstance du type INTERFACE

    Ces mthodes remplacent quack() et fly()

    La cl: le canard dlgue les comportements fly et quack, au lieu dutiliser les mthodes fly() et quack() dfinies dans la supre classe Duck.

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Implmentation de la supre classe(16/22)

    25

    La supre classe Duck, dont hrite tous les canards

    public class Duck{ QuackBehavior qbehavior; FlyBehavior fbehavior; // public void performQuack(){ qbehavior.quack(); } //.. }

    Chaque type de canard initialise ces attributs selon ses besoins. (par FlyWithWings pour le MallardDuck )

    Grace au polymorphisme, la bonne mthode sera invoque dans la sous-classe du type de canard. (Dlgue la classe grant le comportement)

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Implmentation dun canard (17/22)

    26

    public class MallardDuck extend Duck{ public MallardDuck (){ fbehavior = new FlyWithWings(); qbehavior = new Quack(); } public void display(){ System.out.println("Je suis un canard Mallard"); } }

    Initialisation des attributs dclars dans la supre classe Duck

    Cette classe inclut les mthodes ralisant le comportement fly et quack, par hritage (performQuack(), etc..)

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Tester le code du canard(18/22) Dvelopper et compiler [Utiliser NetBeans/Eclipse]:

    La classe abstraite Duck (Duck.java) Le comportements: FlyBehavior.java, FlyWithWings.java et

    FlyNoWay.java,

    Le comportement : QuackBehavior.java, Quack.java, Squeak.java et MuteQuack.java

    Les classes MallardDuck.java et WoodenDuck.java Tester toutes les mthodes des canards crs dans un main:

    MallardDuckSim.java

    27 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Le comportement dynamique (19/22)

    Changement dynamique de comportement Ajouter les mthodes: setFlyBehavior() et setQuackBehavior() Dvelopper le canard RedHeadDuck (RedHeadDuck.java) Implanter le nouveau comportement "vole-force-fuse"

    FlyRocketPowered (FlyRocketPowered.java) Tester le nouveau canard dans un main RedHeadSim.java Changer le comportement "voler" de FlyWithWings

    FlyRocketPowered. Penser utiliser le setter afin dobtenir ces deux affichages: "Je peux voler" & "Je vole comme une fuse"

    Donner (et ne pas implmenter) les modifications faire afin dajouter le comportement manger: eat() 28

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : La conception finale (20/22)

    29

    FlyWithWings

    fly() { //vole }

    FlyBehavior

    fly()

    FlyNoWay

    fly() { //ne vole pas }

    Quack

    quack(){ //quack }

    QuackBehavior

    quack()

    Squeak quack(){ //squeak //rubber }

    MuteQuack quack(){ //rien-ne //cancane pas }

    Duck

    QuackBehavior qbehavior; FlyBehavior fbehavior;

    performQuack() swim() display() performFly() setFlyBehavior() setQuackBehavior() \\autre mthodes

    WoodenDuck display(){ \\canard en bois }

    MallardDuck display(){ \\canard Mallard }

    extends

    implements

    implements

    Algorithmes interchangeables Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Composition/Hritage (21/22)

    30

    Has-a: liaison intressante Chaque canard possde un FlyBehavior et QuackBehavior qui

    dlgue flying et quacking Composition (mettre les 2 classes ensemble) Encapsuler une famille dalgorithmes dans leur propre ensemble

    de classes Remplacer lhritage pour favoriser le changement dynamique du

    comportement

    Rgle 3: Favoriser la composition sur lhritage

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    SimUDuck : Notre premier patron (22/22)

    31

    Notre premier patron: STRATEGIE

    Le patron stratgie cherche principalement sparer un objet de ses comportements/algorithmes en encapsulant ces derniers dans des classes part.

    Pour ce faire, on doit alors dfinir une famille de comportements ou dalgorithmes encapsuls et interchangeables.

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 32

    Les avantages du patron

    Si les algorithmes/comportements sont dans une classe a part,

    il est beaucoup plus facile de: se retrouver dans le code principale enlever, ajouter et modifier un algorithme/comportement diminuer lutilisation de tests conditionnels liminer la redondance et le couper/coller accrotre la rutilisabilit du code ainsi que sa flexibilit

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 33

    Limplmentation du patron

    Pour implmenter le patron Strategy on doit: 1. Dfinir une interface commune tout les algorithmes ou

    comportements de mme famille. Ceci ce fait habituellement en crant une classe abstraite.

    2. Crer les classes comportant les algorithmes ou les comportements partir de linterface commune.

    3. Utiliser la stratgie voulue dans le code de lobjet.

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 34

    Reprsentation du patron

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Bases de lOO: Abstraction, Encapsulation, Polymorphisme & Hritage

    Principes de lOO Encapsuler ce qui varie Favoriser la composition sur lhritage Programmer avec des interfaces et non des implmentations

    Patron de lOO (stratgie) Le patron stratgie dfinit une famille dalgorithmes, les

    encapsule, et les rend interchangeable. Ce patron laisse lalgorithme varier indpendamment du client quil lutilise.

    Rcapitulatif (1/2)

    35 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Connaitre les bases de lOO ne fait pas de toi un bon concepteur Les meilleurs conception OO sont rutilisable, flexible et

    maintenable Les patrons nous guident construire des systmes avec les bonnes

    qualits de la conception OO Les patrons sont des expriences prouves dans lOO Les patrons ne donnent pas de code, mais plutt des solutions

    gnrales pour des problmes de conception Les patrons de sont pas invents, mais dcouverts La majorit des patrons et des principes adresses les problmes de

    changement dans le logiciel On essaie toujours de prendre ce qui varie des systmes et on

    lencapsule Les patrons offrent un langage partag qui peut maximiser la valeur

    de la communication avec les autres dveloppeurs

    Rcapitulatif (2/2)

    36

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Exercice (1/2) Ci-dessous, on donne lensemble de classes et interfaces dun jeu

    daction et daventure. Il y a des classes dindividus avec des classes pour les comportements darmes que les individus peuvent utiliser. Chaque individu peut utiliser une seule arme la fois, mais peut la changer tout moment durant le jeu. La tche demande est dordonner le tout.

    37

    ComportementArme arme; combattre() Display ()

    Individu

    Display(){.}

    Reine Display(){.}

    Archer

    Display(){.}

    Chevalier

    UtiliseArme(){\\abattre avec couteau }

    ComportementCouteau

    UtiliseArme(){\\abattre avec arc et flche}

    ComportementArc&Fleche

    UtiliseArme();

    ComportementArme

    UtiliseArme(){\\abattre avec pe}

    ComportementEpee

    setArme(ComportementArme ca) { this.arme=ca; }

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Exercice (2/2) 1. Arranger les classes 2. Identifier les classes, les classes abstraites des interfaces 3. Relier les entits pas des flches ou:

    1. reprsente extends 2. reprsente implements 3. reprsente has-a

    4. Mettre la mthode setArme() dans la classe correspondante

    5. Implmenter et tester cette conception dans un main. Penser changer dynamiquement le comportement de larcher aprs avoir finir ces arcs.

    38

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le patron "Observer"

    39 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Station mto: Spcification (1/14)

    40

    Objectif: Construire une nouvelles gnration de stations dobservation mto sur Internet

    Besoin: Afficher les conditions courantes, les statistiques mtorologique et les prvisions mto. Poursuivre les conditions mtorologiques (Temprature,

    Humidit, Pression, etc.) On veut mettre en uvre une API (ENIS-METEO) de faon

    que dautres dveloppeurs peuvent crire leur propre afficheur de mto.

    Conception: OO Une classe WeatherData qui rcupre les donnes de la station

    mto (ENIS-METEO) et les offre aux afficheurs.

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Station mto: Analyse (2/14)

    41

    Il faut crer une application qui utilise lobjet WeatherData afin de mettre jour trois afficheurs: les conditions courantes, les statistiques mtorologiques & les prvisions mto.

    Weather Station

    Capteur dhumidit

    Capteur de temprature

    Capteur de pression

    WeatherData Object Conditions

    courantes

    Afficher

    Tirer (pull)

    Le fournisseur ENIS-METEO A implmenter

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Station mto: Conception (3/14)

    42

    Nous allons dvelopper trois afficheurs: conditions courantes (CurrentConditionsDisplay.java) statistiques mtorologique (StatisticsDisplay.java) prvisions mto (ForecastDisplay.java)

    Rq: On ne sintresse pas la manire dont les variables sont fixes. On suppose que lobjet WeatherData connait comment les mettre jour partie de la station ENIS-METEO

    WeatherData

    getTemperature() getHumidity() getPressure() measurementChanged() \\autre mthodes

    Cette mthode sera appele chaque fois quon met jour les mesures

    Ces trois mthodes retournent les mesures les plus rcentes

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    public class WeatherData

    {

    //attributs void setMeasurement(){

    float temperature = getTemperature();

    float humidity = getHumidity()

    float pressure = getPressure()

    currentConditionsDisplay. update(temperature, humidity, pressure);

    statisticsDisplay. update(temperature, humidity, pressure); forecastDisplay. update(temperature, humidity, pressure);

    }

    //autres mthodes }

    Station mto: Une solution possible (4/14)

    43

    Rcuprer les mesures les plus rcentes

    Mettre jour les afficheurs avec les nouvelles mesures

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Station mto: Constat (5/14) Problme : En codant des implmentations concrtes, on ne peut pas

    ajouter/supprimer dautres afficheurs, sans faire un changement du programme! Rq: on peut au moins utiliser une interface qui contient la

    mthode update(). Solution : le patron observer Exemple:

    1. Une maison ddition commence ldition dun journal 2. Vous vous inscrivez ce journal, et pour chaque nouvelle

    dition, vous recevez votre copie 3. Vous vous dsinscrivez lorsque vous ne voulez plus recevoir

    des journaux 4. Les gens, les htels etc. peuvent constamment sinscrire et se

    dsinscrire ce journal.

    44

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Station mto: Publier/Souscrire= Patron Observer (6/14)

    45

    Les objets Observers

    Lorsque les donnes du sujet changent, les observateurs sont notifis

    2

    2

    Les observers sont inscrits au Sujet afin de recevoir les mise jour

    Lobjet Sujet gre des octets de donnes

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Station mto: Patron Observer : Sinscrire (7/14)

    46

    Les objets Observers

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Station mto: Patron Observer : Notification(8/14)

    47

    8

    8

    Maintenant, le Mouse est un observer, il reoit les notifications du Sujet

    Les objets Observers

    8

    Nouvel entier

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Station mto: Patron Observer : Dsinscrire (9/14)

    48

    Les objets Observers

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Station mto: Patron Observer : Notification (10/14)

    49

    Les objets Observers

    12

    12

    Maintenant, le Dog nest plus un observer, il ne reoit plus les notifications du Sujet

    Nouvel entier

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Station mto: Le patron Observer (11/14) Dfinition:

    Le patron observer dfinit une dpendance 1--plusieurs entre des objets de faon que chaque changement de ltat de lobjet, tous ces dpendants sont notifis et mis jour automatiquement.

    50

    Observer

    8

    8

    Les objets Observers

    8

    Mise jour/notification automatique

    1--plusieurs Les objets dpendants Lobjet qui tient les mises jours

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le ConcreteSubject hrite toujours de linterface Subject. Il implmente la mthode notifyObservers() qui est sense mettre jour lobserver quand ltat change.

    Station mto: Diagramme de classes du patron (12/14)

    51

    Subject

    registerObserver() removeObserver() notifyObservers()

    Observer

    Update()

    observers

    ConcreteSubject

    registerObserver(){} removeObserver() {} notifyObservers() {} getState() setState()

    ConcreteObserver

    Update() //autres mthodes

    subject

    Les objets utilisent cette interfaces pour sinscrire comme observer et aussi se dsinscrire

    Chaque Subject possde un tableau dobservers

    Tous les observers potentiels doivent implmenter linterface "Observer"

    Toutes classes qui implmente lobserver est un observer concret. Chaque observer concret sinscrit auprs dun sujet concret pour recevoir lupdate

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Station mto: La puissance du couplage faible (13/14) Deux objets, qui sont faiblement coupls, entrent en interaction

    avec trs peu de connaissance de lun envers lautre. Le patron Observer permet de raliser une conception ou le

    Subject et lObserver sont faiblement coupls Couplage faible : plus dindpendance et de flexibilit

    La seule chose que le Subject a besoin de connaitre sur lObserver est quil implmente une certaine interface.

    On peut ajouter/remplacer/supprimer un observer tout moment sans toucher au Subject

    On peut rutiliser le Subject ou lObserver facilement parcequil ne sont pas fortement coupls.

    La modification du Subject ou de lObserver naffecte pas lautre classe

    52

    Rgle 4: Opter pour une conception faiblement couple entre les objets qui interagissent

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Station mto: La conception finale (14/14)

    53

    Subject

    registerObserver() removeObserver() notifyObservers()

    Observer

    update()

    observers

    WeathetData

    registerObserver(){} removeObserver() {} notifyObservers() {} getTemperature() getHumidity() getPressure() measurementChanged()

    subject

    DisplayElement

    display()

    Les trois afficheurs pointent sur le WeatherData afin de permettre leur inscription et leur dsinscription

    CurrentConditionsDisplay

    update() display()

    ForecastDisplay

    update() display()

    StatisticsDisplay

    update() display()

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le Patron Observateur

    54

    Le patron de conception observateur/observable est utilis pour envoyer un signal des modules qui jouent le rle d'observateur.

    En cas de notification, les observateurs effectuent alors l'action adquate en fonction des informations qui parviennent depuis les modules qu'ils observent (les "observables").

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Bases de lOO: Abstraction, Encapsulation, Polymorphisme & Hritage

    Principes de lOO Encapsuler ce qui varie Favoriser la composition sur lhritage Programmer avec des interfaces et non des implmentations Opter pour une conception faiblement couple entre les objets

    qui interagissent Patron de lOO

    Strategy: dfinit une famille dalgorithmes interchangeables Observer: dfinit une dpendance1--plusieurs entre objets, de

    faon que pour chaque changement de ltat dun objet , ses dpendants sont notifis et mis jour automatiquement.

    Rcapitulatif (1/2)

    55 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le patron observer dfinit une relation 1--plusieurs entre objets.

    Le Subject/Observable met jour les observers travers une interface commune.

    Lobserver est faiblement coupl avec le Subject. Ce dernier ne connait rien deux part quils implmentent linterface Observer.

    On peut rcuprer les donnes du Subject en mode pull/push. (Le Subject fait le push, semble plus correct)

    On ne dpend pas dun ordre spcifique de notification entre les observers

    Java possde plusieurs implmentations de ce patron

    Rcapitulatif (2/2)

    56

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Exercice 1. Appliquer le patron Observer sur lapplication station mto en se

    basant sur les implmentations du Subject et de lObserver offertes par Java :

    java.util.Observable : Subject du patron (Attention! Il sagit dune classe) java.util.Observer : Observer du patron

    57

    Observable

    addObserver(Observer o) deleteObserver(Observer o) notifyObservers(Object arg) setChanged()

    Observer

    update(Observable o, Object arg)

    Pour dire explicitement que ltat de lobservable a chang. Elle ne fait pas la notification.

    Ou o est utilis pour rcuprer le message, et arg est un argument passer lobserver (mettez le null, si pas besoin de passer un argument) Il sagit dune classe. Les mthodes

    offertes sont dj implmentes.

    2. Expliquer comment Java utilise le patron observer pour la gestion des vnements sur les interfaces graphiques.

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Exercice (1/2) Les mthodes getSecondes, getMinutes et getHeures permettent daccder aux

    valeurs des secondes, minutes et heures respectivement. La classe Chrono est une classe concrte implantant linterface de la classe AbstractChrono. Lorsquune seconde passe (tick()), les Displays doivent afficher les heures, les minutes et les secondes et les Sonneries doit faire entendre un tintement chaque heure.

    58

    AbstractChrono

    getSecondes() getMinutes() getHeures() tick()

    int secondes; int minutes; int heures;

    Sonnerie2

    ding()

    DisplayNumerique

    afficheTempsEcoule()

    Chrono DisplayAiguille

    afficheTempsEcoule()

    Sonnerie1

    ding()

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Exercice (2/2) Utiliser le pattern Observer pour dfinir les interactions entre Chrono, Display et

    Sonnerie

    Donnez le diagramme de classes et limplmentation.

    public static void main(String[] args) { Chrono c=new Chrono();

    Sonnerie_Observer S1=new Sonnerie1(c);

    Sonnerie_Observer S2=new Sonnerie2(c);

    Display_Observer D1= new DisplayNumerique(c);

    Display_Observer D2= new DisplayAiguille(c);

    for(int i=1;i

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    StarCoffee : Spcification (1/10)

    61

    Objectif: Mettre en uvre un systme de gestion des offres de boisson pour la clientle de StarCoffee

    Besoin: Dcrire les ajouts en extra, et calculer le prix total Th, Th--la-menthe, Th--la-mente-aux-pignons, etc.. Caf, Caf-au-Lait, Caf-au-Lait--la-mousse, etc..

    Conception: OO Concevoir une supre classe Boisson que toutes les autres

    classes hritent. Dfinir autant de classes quil y en a de types de boissons :

    Beverage.java, Coffee.java, CoffeeWithMilk.java, CoffeeWithMilkWithWhip.java, Tea.java, TeaWithMint.java, TeaWithMintWithPine.java, etc.

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    StarCoffee : Conception (2/10)

    62

    Description getDescription() cost()

    Beverage

    Coffee

    cost()

    CoffeeWithMilk

    cost()

    CoffeeWithMilk WithWhip

    cost()

    Tea

    cost() TeaWithMint

    cost() TeaWithMintWit

    hPine cost()

    Chaque sous classe implmente la mthode cost() qui reprsente le prix du boisson

    Mthode abstraite dfinir dans les classes drives

    Retourne la description

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    StarCoffee : Problme (3/10) Problme : En plus des deux produits prsents prcdemment,

    StarCoffee offre une varit dautres boissons et condiments: (Si on offre 2 types de Th, on doit ajouter plusieurs autres classes (selon les condiments possibles), etc. Constat: clatement du diagramme de classes par un nombre ingrable

    de classes

    63

    Description Milk Mint Pine Whip getDescription() cost() hasMilk() setMilk() hasMint() setMint() hasPine() setPine() hasWhip() setWhip

    Beverage

    Solution : Utiliser des variables dinstance dans la supre classe qui reprsenteront les condiments (pignon, mousse, lait, menthe).

    Des boolans

    Des get et set pour les booleans des condiments

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    StarCoffee : Nouvelle conception (4/10)

    64

    Description Milk Mint Pine Whip getDescription() cost() hasMilk() setMilk() hasMint() setMint() hasPine() setPine() hasWhip() setWhip()

    Beverage

    Coffee

    cost()

    Tea

    cost()

    Dans chaque classe drive, on ajoute les condiments (set), puis cest la mthode cost() qui calcule le prix total (en vrifiant avec has)

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    cost()

    StarCoffee : Un boisson dcor (5/10)

    65

    cost() La classe Tea hrite de Beverage et possde une mthode cost() qui calcule le prix du boisson

    1. On commence par lobjet Tea

    2. Le client choisit la menthe, alors on cre un objet Mint qui enveloppe le Tea

    cost() cost()

    Lobjet Mint est un dcorateur. Son type est un miroir de lobjet quil dcore (Beverage).

    Lobjet Mint possde une mthode cost() et travers le polymorphisme, on peut traiter chaque Beverage envelopp dans le Mint comme un Beverage aussi.

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Lobjet Pine est un dcorateur, donc il est un miroir du type Tea et inclut une mthode cost()

    Lobjet Tea, envelopp dans un Mint et un Pine, reste toujours un Beverage. Alors on peut faire avec lui ce quon peut faire avec les Beverage, y compris linvocation de sa mthode cost()

    cost()

    StarCoffee : Un boisson dcor (6/10)

    66

    cost() cost()

    3. Le client veut aussi des pignons, alors on cre un objet Pine qui emballe le Mint

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    cost() cost() cost()

    Invocation de la mthode cost() du dcorateur extrieur

    StarCoffee : Le cot du boisson dcor (7/10)

    67

    Lide est de calculer le cot en partant du dcorateur le plus extrieur (Pine) et puis, ce dernier dlgue le calcul lobjet dcor, etc.

    0.500 0.200 0.300

    1.000

    Pine appelle cost() de Mint Mint appelle cost() de Tea

    Tea retourne son prix: 0.500 Mint ajoute son prix au rsultat de cost() de Tea, et retourne le nouveau total: 0.700

    Pine ajoute son prix au rsultat de Mint, et retourne le rsultat total: 1.000

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    StarCoffee : Le patron Decorator (8/10)

    68

    Dfinition: Le patron decorator attache des responsabilits

    additionnelles un objet dynamiquement. Les dcorateurs offrent une alternative flexible de sous-classement afin dtendre les fonctionnalits.

    Decorator

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    StarCoffee : Le diagramme de classes du patron(9/10)

    69

    Component

    methodA() methodB() //autres mthodes

    Decorator

    methodA() methodB() //autres mthodes

    ConcreteComponent

    methodA() methodB() //autres mthodes

    Chaque dcorateur possde un composant, qui veut dire que le dcorateur possde un attribut qui contient une rfrence dun composant

    Chaque composant peut tre utilis lui seul, ou envelopp dans des dcorateurs

    Les dcorateurs implmentent la mme interface (ou classe abstraite) que lobjet quils dcoreront

    ConcreteDecoratorA

    methodA() methodB() Newbehavior() //autres mthodes

    Component WrappedObj

    ConcreteDecoratorB

    methodA() methodB() //autres mthodes

    Component WrappedObj Object newState

    Le ConcreteDecorator possde un attribut qui reprsente lobjet quil dcore. Il peut ajouter ses propres mthodes et attributs.

    Le ConcreteComponent est lobjet quon va lui ajouter dynamiquement des nouveaux comportements. Il tend lobjet Component.

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    StarCoffee : La conception finale (10/10)

    70

    CondimentDecorator

    getDescription();

    Component

    Milk

    cost()

    Beverage beverage

    Beverage

    getDescription() cost(); //autres mthodes

    description

    Coffee cost()

    Tea cost()

    Mint

    cost()

    Beverage beverage

    Pine

    cost()

    Beverage beverage

    Whip

    cost()

    Beverage beverage

    Beverage agit comme notre classe abstraite component

    Les deux composants concrets, 1 par type de boisson

    Le constructeur du dcorateur prend le boisson dcorer en entre et retourne le boisson dcor.

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Bases de lOO: Abstraction, Encapsulation, Polymorphisme & Hritage Principes de lOO

    Encapsuler ce qui varie Favoriser la composition sur lhritage Programmer avec des interfaces et non des implmentations Opter pour une conception faiblement couple Les classes doivent tre ouvertes pour les extensions et fermes pour

    les modifications Patron de lOO

    Strategy: dfinit une famille dalgorithmes interchangeables Observer: dfinit une dpendance1--plusieurs entre objets. decorator: attache des responsabilits additionnelles un objet

    dynamiquement. Les dcorateurs offrent une alternative flexible de sous-classement afin dtendre les fonctionnalits.

    Rcapitulatif (1/2)

    71 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Lhritage est une forme dextension, mais il nest pas ncessairement la meilleure manire pour obtenir la flexibilit dans notre conception

    Le patron decorator implique un ensemble de classes de dcorations qui sont utilises pour envelopper les composants concrets.

    Les classes dcorateurs refltent le type de composant quils dcorent.

    Les dcorateurs changent le comportement de leurs composants tout en ajoutant des nouvelles fonctionnalits aprs/avant (ou la place de) lappel des mthodes des composants

    On peut envelopper un composant dans nimporte quel nombre de dcorateurs

    Les dcorateurs sont transparents par rapport au client du composant

    Rcapitulatif (2/2)

    72

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Exercice (1/3) 1. Comment faire pour obtenir un caf avec "double mousse"? 2. StarCoffee a ajout un nouveau boisson (Citronnade) au systme,

    comment procder pour linclure dans la conception actuelle? 3. StarCoffee veut introduire des tailles pour ses menus: SMALL,

    MEDIUM et LARGE. Comment prendre en charge cette nouvelle spcification, si la taille modifie seulement les prix des composants concrets?

    73 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Exercice (2/3) Avec le patron decorator, le package java.io doit donner plus de

    sens, puisquil se base largement sur ce patron.

    74

    FileInputStream est un composant dcor. Le package java.io offre plusieurs objets pour la lecture des octets: FileInputStream, StringBufferInputStream, ByteArrayInputStream, etc.

    BufferedInputStream est un dcorateur concret. Il ajoute deux comportements: (i) il tamponne les entres afin damliorer la performance, et (ii) ajoute la mthode readLine() pour lire une ligne de caractres la fois.

    LineNumberInputStream est aussi un dcorateur concret. Il ajoute la capacit de compter les nombres de lignes en lisant les donnes.

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Exercice (3/3): Dcoration de java.io 1. Ecrire un dcorateur qui convertit tous les caractres majuscules

    en minuscules dans le flux dentre (InputStream).

    75

    InputStream

    FileInputStream StringBufferInputStream

    BufferedInputStream PushBackInputStream

    LineNumberInputStream

    ByteArrayInputStream

    DataInputStream

    Abstract Component

    Abstract Decorator

    Decorator

    Conctrete Component

    FilterInputStream

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Lobjectif de cet exercice est de mettre en uvre un systme flexible de gestion des offres de voiture pour la clientle de StarCar. Le besoin de cette socit se rsume dcrire les options demandes par le client (VitreElectrique, AirBag et ABS) et inclure son cout au prix total de la voiture choisie. Deux types de voiture sont grs par la socit, savoir, camionnette et berline. Chaque voiture est caractrise par un cout et une description textuelle. Le prix de chaque type de voiture ainsi que celui de chaque option est fixer au moment de la cration.

    En utilisant le patron Decorator, donnez le diagramme de classes de lapplication CarStar. (Prcisez les mthodes et les attributs, correspondant au bout de code ci-dessous) 76

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    public static void main(String[] args) {

    Voiture v1=new Camionnette ("P404",10000);

    Voiture v2=new Berline ("P407",20000);

    v1=new ABS(v1, 800);//800 reprsente le prix de loption ABS

    v2=new VitreElectrique(v2, 1000); // 1000 reprsente le prix de loption

    v2=new AirBag(v2, 1200); // 1200 reprsente le prix de loption

    System.out.println("La voiture est une "+v1.getDescription());

    //affiche: La voiture est une P404 avec ABS

    System.out.println("Son prix est:"+ v1.cost());

    //affiche: Son prix est 10800

    System.out.println("La voiture est une "+v2.getDescription());

    //affiche: La voiture est une P407 avec VitreElectrique, AirBag

    System.out.println("Son prix est:"+ v2.cost());

    //affiche: Son prix est 22200

    77 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le patron "Adapter"

    78

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le patron adapter : Les adaptateurs (1/7)

    79

    Cble American du PC Prise Europenne Adaptateur

    Ladaptateur convertit une interface une autre

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Classe du vendeur

    Mme code

    Le patron adapter : Les adaptateurs dans lOO (2/7)

    80

    Notre systme existant

    Classe du vendeur

    Linterface ne correspond par ce quon a dj cod. a ne va pas march! (supposant quon ne peut pas changer de vendeur)

    Adaptateur

    Nouveau code Mme code

    Notre systme existant

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le patron adapter : Dinde et Canard (3/7)

    81

    Supposant que le dinde marche et cancane comme le canard

    interface Duck{ void quack(); void fly(); }

    class MallardDuck implements Duck{ public void quack(){ System.out.println("Quack");} public void fly(){ System.out.println("Fly");}

    }

    interface Turkey{ void gobble(); void fly(); }

    Un canard peut cancaner et voler Une simple implmentation du comportement du canard

    Le dinde ne cancane pas, mais glougloute

    Le dinde peut voler (courte distance)

    class WildTurkey implements Turkey{ public void gobble(){ System.out.println("Gobble");} public void fly(){ System.out.println("Fly for a short distance");}

    } Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le patron adapter : Ladaptateur du dinde(4/7)

    82

    Supposons quon a un manque de canards et on va utiliser des dindes leur pace Il faut crire un "adapter"

    Respecter linterface des canards

    Translation des mthodes

    class TurkeyAdapter implements Duck{ Turkey turkey; TurkeyAdapter(Turkey turkey){ this.turkey=turkey;} public void quack(){ } public void fly(){ } }

    turkey.gobble();

    for(int i=0;i

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le patron adapter (6/7)

    85 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Adapter : Le diagramme de classes du patron (7/7)

    86

    Client

    Adapter

    Request()

    Target

    Request() LAdapter implmente linterface Target

    Adaptee

    specificRequest()

    Le client voit seulement linterface Target.

    Ladapter est compos dun Adaptee

    Toutes les requtes sont dlgues Adaptee

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le patron "Faade"

    87 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    88

    Screen

    up() down()

    Amplifier

    tuner dvdPlayer . on() off() setCD() setDVD()

    Tuner

    on() off() setAm() setFM()

    amplifier DVDPlayer

    on() off() play() stop() pause()

    amplifier

    Le patron Facade: Dmarrer un home-cinma (1/4)

    Et bien dautres classes

    Dmarrer le HC: baisser la lumire allumer lcran dmarrer lampli dmarrer le DvDplayer le brancher avec lmpli jouer le DvD etc..

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 89

    Le patron Facade: Les classes dun Home cinma (2/4)

    Screen

    up() down()

    Amplifier

    tuner dvdPlayer .

    on() off() setCD() setDVD()

    Tuner

    on() off() setAm() setFM()

    amplifier

    DVDPlayer

    on() off() play() stop() pause()

    amplifier

    CDPlayer

    on() off() play() stop() pause()

    amplifier Projector

    on() off()

    HomeCinema

    WatchTV() WatchDVD() .

    La Faade: une nouvelle classe pour le HomeCinema avec peu de mthode

    La classe Faade traite les composants du HomeCinema comme des sous-systmes quil invoque pour implmenter ses mthodes

    WatchDVD()

    Le client invoque les mthodes sur la Faade

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le patron faade (3/4)

    90

    Dfinition: Le patron Faade prsente une interface unifie pour un

    ensemble de sous-interfaces dans un systme. La faade dfinit une interface de haut niveau qui rend facile lutilisation du systme.

    Faade

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Faade: Le diagramme de classes du patron (4/4)

    91

    Client Faade

    Une interface unifie et simple utiliser

    Les classes des sous-systmes

    Systmes complexes

    Un client heureux car son travail devient facile grce la faade

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Testons nos connaissances!

    92

    Patron Rle

    Decorator Convertit une interface en une autre

    Adapter Ne modifie pas linterface, mais ajoute des responsabilits

    Facade Rend les interfaces simples

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le patron "Singleton"

    93 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Singleton : Spcification (1/12)

    94

    Objectif: Crer un type dobjet pour lequel on cre seulement une seule instance

    Cest le patron ayant le diagramme de classes le plus simple Il y a plusieurs objets dont on a besoin dune seule instance:

    pool dimpression, boite de dialogue, objet qui manipule les prfrences, objet de logging, objet agissant comme pilote de carte graphique/imprimante

    La cration de plus dune instance de ces objets est une source de problme, telle que la sur-utilisation des ressources, des comportements incorrectes de programme, des rsultats inconsistants, etc.

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Singleton : Crer un singleton (2/12)

    95

    Comment crer un seul objet?

    public class MonObjet{ private MonObjet() {} }

    Cest une classe qui ne peut pas tre instancie, car elle possde un constructeur priv

    Et si un autre objet veut crer un MonObjet? Est-ce quil peut appeler new sur MonObjet une autre fois?

    Pour toute classe, est ce quon peut linstancier plus quune fois?

    Que signifie ce code ?

    New MonObjet()

    Oui

    Oui (il faut que la classe soit publique)

    Qui peut utiliser ce constructeur? Le code de MonObjet est le seul code qui peut lappeler (dans une mthode)

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Singleton : Crer un singleton (3/12)

    96

    Comment je peux appeler cette mthode (pour crer une instance) si je nai pas dinstance?

    public class MonObjet{ public static MonObjet getInstance() { } }

    Cest une mthode statique qui peut tre appele partir du nom de la classe : MonObjet.getInstance()

    Que signifie ce code. static

    Si on met les choses ensemble, est ce quon peut instancier MonObjet? public class MonObjet{

    private MonObjet(){ } public static MonObjet getInstance() { return new MonObjet(); } }

    Comment faire pour crer une seule instance?

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 97

    public class Singleton { private static Singleton uniqueInstance; private Singleton() {} public static Singleton getInstance(){ if (uniqueInstance == null) uniqueInstance = new Singleton(); return uniqueInstance; } public static void main(String args[]) { Singleton s= Singleton.getInstance(); }

    }

    Cette mthode nous offre une manire pour instancier la classe Singleton

    Nous avons une variable statique pour stocker notre instance

    Singleton : Implmentation du patron (4/12)

    Le constructeur est dclar priv. Seulement la classe Singleton qui peut instancier cette classe

    Si uniqueInstance nest pas nul, a veut dire quelle a t cre prcdemment

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 98

    public class ChocolateBoiler{ private boolean empty; private boolean boiled; public ChocolateBoiler() { empty=true; boiled=false; } public void fill(){ if (empty){ //remplir la casserole avec du lait/chocolat empty=false; boiled=false; } } public void drain(){ if (!empty && boiled){ //vider la casserole empty=true; } } public void boil(){ if (!empty && !boiled){ //faire bouillir boiled=true; } }

    }

    Le code dmarre lorsque la casserole est vide

    Singleton : Lusine de chocolat (5/12)

    Pour remplir la casserole, elle doit tre vide. Lorsquelle est pleine, on met empty false.

    Pour vide la casserole, elle doit tre pleine et dj mixe. une fois vide, on met empty true.

    Pour mixer le contenu de la casserole, elle doit tre pleine et non dj mixe. Lorsquelle est pleine, on met boiled true.

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 99

    public class ChocolateBoiler { private boolean empty; private boolean boiled; private static ChocolateBoiler uniqueInstance; private ChocolateBoiler() { empty=true; boiled=false; } public static ChocolateBoiler getInstance() { if (uniqueInstance == null) uniqueInstance = new ChocolateBoiler(); return uniqueInstance; } //reste du code

    }

    Singleton : Lusine de chocolat (6/12)

    Amliorer le code de lusine de chocolat en le transformant en Singleton

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Singleton : Le patron Singleton(7/12)

    100

    Dfinition: Le patron Singleton assure une seule instance pour une

    classe, et offre un point daccs global cette classe.

    Singleton

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Singleton: Le diagramme de classes du patron (8/12)

    101

    La variable de classe uniqueInstance tient la seule instance du Singleton

    La mthode getInstance() est statique. Cest une mthode de classe quon peut y accder partout dans le code avec Singleton.getInstance(). Il sagit dune instanciation facile de cette classe

    - static uniqueInstance //autre donnes utiles

    + static getInstance() //autre mthodes utiles

    Singleton

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 102

    Singleton : Problme des threads (9/12)

    Supposant que nous avons deux threads qui vont excuter la mthode getInstance(). Est-ce quil y a un cas o on cre 2 instances?

    return uniqueInstance;

    if (uniqueInstance == null)

    uniqueInstance = new ChocolateBoiler();

    Thread-1 Thread-2 Valeur de UniqueInstance

    public static ChocolateBoiler getInstance()

    public static ChocolateBoiler getInstance()

    if (uniqueInstance == null)

    uniqueInstance = new ChocolateBoiler(); return uniqueInstance;

    null

    null

    null

    null

    Object1

    Object1

    Object2

    Object2

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    public class Singleton { private static Singleton uniqueInstance; private Singleton() {} public static synchronized Singleton getInstance(){ if (uniqueInstance == null) uniqueInstance = new Singleton(); return uniqueInstance; } //autre mthodes utiles

    }

    103

    Singleton : Gestion du multi-threading (10/12)

    Solution 1: synchroniser laccs la mthode getInstance()

    Un seule thread peut accder, la fois, cette mthode

    Inconvnient: synchronized rduit la performance dun facteur de 100 Si la mthode getInstance() nest pas critique pour notre application, on peut

    se contenter de cette solution

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    public class Singleton { private static Singleton uniqueInstance = new Singleton(); private Singleton() {} public static Singleton getInstance(){ return uniqueInstance; } //autre mthodes utiles

    }

    104

    Singleton : Gestion du multi-threading (11/12)

    Solution 2: cration au moment de la dfinition de la variable de classe

    Il y a dj une instance, il faut juste la retourner

    La JVM cre une instance de Singleton lors du chargement de la classe. La JVM garantit que linstance va tre cre avant que les threads accdent la variable statique uniqueInstance.

    Initialisation par le JVM avant accs des threads

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    public class Singleton { private volatile static Singleton uniqueInstance; private Singleton() {} public static Singleton getInstance(){ if (uniqueInstance == null) { synchronized(Singleton.class) { if (uniqueInstance == null) uniqueInstance = new Singleton(); } } return uniqueInstance; } //autre mthodes utiles

    }

    105

    Singleton : Gestion du multi-threading (12/12)

    Solution 3: rduire lutilisation de la synchronisation dans getInstance()

    On synchronise seulement la premire fois

    Le mot cl volatile assure que les threads grent la variable uniqueInstance correctement au moment de son initialisation

    *volatile: inclus java depuis jdk5

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Bases de lOO: Abstraction, Encapsulation, Polymorphisme & Hritage Principes de lOO

    Encapsuler ce qui varie Favoriser la composition sur lhritage Programmer avec des interfaces et non des implmentations Opter pour une conception faiblement couple Les classes doivent tre ouvertes pour les extensions et fermes pour les

    modifications Dpendre des abstractions. Ne jamais dpendre de classes concrtes

    Patron de lOO Strategy: dfinit une famille dalgorithmes interchangeables Observer: dfinit une dpendance1--plusieurs entre objets. decorator: attache des responsabilits additionnelles un objet dynamiquement. Abstract Factory: offre une interface de cration de familles dobjets Factory Method: dfinit une interface de cration des objets Singleton: assure une classe une seule instance et lui offre un point daccs global

    Rcapitulatif (1/2)

    106

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le patron singleton assure la cration dau plus une instance dune classe de notre application

    Le patron offre aussi un seul point daccs global cette instance Limplmentation Java du patron utilise un constructeur priv une

    mthode statique combine avec une variable statique Le dveloppeur examine la performance et les contraintes des

    ressources et choisit soigneusement une implmentation pour une application multi-thread

    Rcapitulatif (2/2)

    107 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le patron "Command"

    108

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Home-Automation : Spcification (1/28)

    109

    Objectif: Mettre en uvre un systme de contrle distant dun ensemble dappareils dans une maison

    Besoin: programmer les fonctionnalits dun contrleur distant (avec 7 slots) selon des classes (prdfinies par le vendeur) de gestion des appareils installs dans la maison.

    Conception: OO Prvoir les relations entre les boutons du contrleur distant

    (ON-OFF) avec les fonctionnalits des appareils installs: setTemperature(), setVolume(), setDirection(), etc..

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 110

    Contrleur distant

    Il y a des boutons on et off pour chaque slot

    Il y a 7 slots programmer. On met un appareil diffrent dans chaque slot, et on le contrle travers les boutons

    Ces deux boutons ont utiliss pour contrler la tlvision

    Un bouton global UNDO pour annuler laction du dernier bouton activ

    Ces deux boutons ont utiliss pour contrler la chaine Streo, etc

    Home-Automation : Analyse du contrleur distant (2/28)

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 111

    Home-Automation : Les classes du vendeur (3/28)

    Stereo

    on() off() setCD() setRadio() setVolume()

    Appliance

    on() off()

    Faucet

    openValue() closeValue()

    AirCondition

    setTemperature()

    Security

    arm() desarm()

    Light

    on() off()

    GardenLight

    setDuskTime() setDawnTime() manualOn() manualOff()

    CeilingLight

    on() off() dim()

    GarageDoor

    up() down() stop() lightOn() lightOff()

    OutDoorLight

    on() off()

    Sprinkler

    waterOn() waterOff()

    Les classes du vendeur nous donnent une ide sur les fonctionnalits des appareils installs dans la maison :

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Home-Automation : Discussion de la conception (4/28)

    112

    On sattendait des classes avec des mthodes on()-off() pour bien correspondre avec le contrleur distant

    Cest important de voir a comme sparation des proccupation : le contrleur doit savoir comment interprter lappui sur le bouton et crer des requtes, mais il ne doit pas connaitre beaucoup sur les appareils et leurs manires de fonctionnement (comment allumer une lampe) En dautre terme, le contrleur met des requtes gnriques Une entit prendra en charge la transformation de cette requte

    en action

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Home-Automation : Discussion de la conception (4/28)

    113

    Comment mettre des requtes des objets sans rien connatre des oprations demandes ? ou sans rien connatre de celui qui la requte est destine ?

    Dissocier (dcoupler) lobjet qui invoque une opration de

    lobjet qui possde les connaissances ncessaires pour raliser cette opration. En dautre terme, le contrleur met des requtes gnriques Une entit prendra en charge la transformation de cette requte

    en action

    Utiliser le patron Command Objet Command: Encapsuler une requte sous forme dobjet

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Command : Commander un dner (5/28)

    114

    Waitress

    Order

    Customer

    Order-Cook

    Le client donne sa commande la serveuse

    La serveuse rcupre la commande et la met sur le comptoir, et la lance

    Le cuisinier prpare le repas selon la commande

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Command : Etudes des interactions (6/28)

    115

    createOrder()

    takeOrder()

    orderUp()

    makeBurger(), makeShake(), makeShips()

    output()

    Je veux un burger,

    un shake et des frites

    La serveuse rcupre la commande et la met sur le comptoir, et la lance

    Il y a toutes les instructions ncessaires pour prparer le repas

    Le cuisinier suit les instructions de la commande

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 116

    La commande (papier) est une requte pour prparer le repas Sil sagit dun objet, il peut tre pass de la serveuse au comptoir Son interface consiste une seule mthode orderUp(), qui encapsule les actions

    ncessaires pour prparer le repas La serveuse na besoin de savoir comment prparer le repas!

    La tche de la serveuse est de prendre la commande et dinvoquer la mthode orderUp() dessus La mthode takeOrder() de la serveuse peut tre paramtre avec diffrentes

    commandes de plusieurs clients. Ceci ne la drange pas car elle sait que orderUp() supporte sa commande

    Le cuisinier possde les connaissances ncessaires pour prparer le repas Suite linvocation de orderUp(), le cuisinier implmente toutes les mthodes

    ncessaires pour crer le repas Noter quil est compltement dcoupl de la serveuse

    La serveuse encapsule les dtails du repas dans la commande Le cuisinier prend ses instructions de la commande, et il na pas besoin de la contacter

    Command : Les rles et les responsabilits (7/28)

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Command : Du dner vers le patron Commande (8/28)

    117

    createCommandObject( )

    setCommand()

    execute()

    action1(), action2()

    La commande consiste un ensemble dactions et un receveur Lobjet Command offre une

    seule mthode execute() qui encapsule les actions

    de ceci rsulte linvocation des actions sur le Receiver

    create Command

    Object execute()

    setCommand()

    execute()

    action1() action2()

    ..

    action1() action2()

    ..

    public void execute(){ receiver.action1(); receiver.action2(); }

    Plus tard, le client demande linvoker dexcuter sa commande

    Le client cre la commande.

    Linvoker appelle la mthode execute() de lobjet Command

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Command : Correspondance (9/28)

    118

    Dner Command Pattern

    Serveuse (Waitress)

    Command

    Cuisinier (Order-Cook)

    execute()

    orderUp() Client

    Commande (Order)

    invoke

    Client (Customer)

    Receiver

    takeOrder() setCommand()

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Command : Le patron Command (10/28)

    119

    Dfinition: Le patron Command encapsule une requte comme un

    objet, ainsi il nous permet de paramtrer dautres objets avec diffrentes requtes, files dattentes ou longues requtes, et supporte lannulation dune opration

    Command

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Home-Automation : Des Commandes (11/28)

    120

    execute(){ receiver.action()

    }

    action()

    execute()

    Une requte encapsule

    execute()

    execute() execute()

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Command : Le diagramme de classes du patron (12/28)

    121

    Client

    Le client est responsable de crer une ConcretCommand et affecter son Receiver

    Invoker

    setCommand()

    Receiver

    action()

    ConctretCommand

    execute() undo()

    Command

    execute() undo()

    Linvoker tient la commande et un certain moment demande la commande de raliser une requte en excutant sa mthode execute()

    Interface de tous les commandes. La commande est invoque travers sa mthode excute, qui demande au Receiver de raliser des actions

    public void execute(){ receiver.action(); }

    Le Receiver connait comment raliser le travail demand afin de satisfaire la requte.

    Le ConcretCommand dfinit une lisaison entre une action et un Receiver Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Home-Automation : Notre premier objet Commande (13/28)

    122

    public interface Command{ public void execute();

    }

    Implmentons linterface Command

    Implmentons une Commande pour allumer la lumire Light

    on() off()

    public class LightOnCommand implements Command { Light light; public LightOnCommand(Light light){ this.light = light; } public void execute(){ light.on(); }

    }

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Home-Automation : Notre premier objet Commande (14/28)

    123

    Utilisons lobjet Commande

    public class SimpleRemoteControl{ Command slot; public SimpleRemoteControl() {} public void setCommand(Command command ){ slot=command; } public void buttonWasPressed(){ slot.execute(); }

    }

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Home-Automation : Notre premier objet Commande (15/28)

    124

    Testons la fonctionnalit du contrleur distant

    public class RemoteControlTest{ public static void main(String argv[]) { SimpleRemoteControl remote = new SimpleRemoteControl(); Light light=new Light(); LightOnCommand lightOn=new LightOnCommand (light); remote.setCommand(lightOn); //passer la commande linvoker remote.buttonWasPressed(); //simuler lappui sur le bouton

    }

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Home-Automation : 2me Commande (16/28)

    125

    Dvelopper la classe GarageDoorOpenCommand

    public class GarageDoorOpenCommand implements Command { GarageDoor garageDoor; public GarageDoorOpenCommand (GarageDoor garageDoor){ this.garageDoor = garageDoor; } public void execute(){ garageDoor.up(); garageDoor.lightOn(); }

    }

    GarageDoor

    up() down() stop() lightOn() lightOff()

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Home-Automation : Une autre Commande (17/28)

    126

    Ajoutant cette commande au slot du contrleur distant public class RemoteControlTest{ public static void main(String argv[]) { SimpleRemoteControl remote = new SimpleRemoteControl(); Light light = new Light(); LightOnCommand lightOn=new LightOnCommand(light); GarageDoor garageDoor = new GarageDoor(); GarageDoorOpenCommand garageOpen = new

    GarageDoorOpenCommand(garageDoor); remote.setCommand(lightOn); //encapsuler la commande remote.buttonWasPressed(); //allumer la lumire remote.setCommand(garageOpen); //encapsuler la commande remote.buttonWasPressed(); //ouvrir la porte du garage

    }

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 127

    Contrleur distant Linvoker

    Home-Automation : Le contrleur distant (18/28)

    execute()

    execute()

    execute()

    execute()

    execute()

    execute()

    off() on()

    Les actions de la mthode execute() sont invoques sur le Receiver

    Light GarageDoor Stereo

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Home-Automation : Le diagramme de classes (19/28)

    128

    RemoteLoader

    Le client

    Light

    on() off()

    LightOnCommand

    execute()

    Command

    execute()

    public void execute(){ light.on(); }

    LightOffCommand

    execute() public void execute(){ light.off(); }

    RemoteControl

    onCommands offCommands

    setCommand() onButtonWasPushed() offButtonWasPushed()

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 129

    class RemoteControl{ Command onCommands[]; Command offCommands[]; public RemoteControl() { onCommands = new Command[7]; offCommands = new Command[7]; Command noCommand = new NoCommand(); for(int i=0;i

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns] 133

    class RemoteControl{ Command onCommands[]; Command offCommands[]; Command undoCommand; public RemoteControl() { onCommands = new Command[7]; offCommands = new Command[7]; Command noCommand = new NoCommand(); for(int i=0;i

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Autre utilisation du patron Command : Organiser les queues de requtes (28/28)

    137

    execute()

    Les threads rcuprent les commandes de la queue une une, et appellent leur mthode execute(). Une fois complt, ils retournent pour une nouvelle commande.

    execute()

    execute()

    execute()

    execute() execute()

    execute()

    Cest une manire efficace pour limiter le calcul un nombre fix de Threads

    Les commandes nous offrent une manire de paquetage les morceaux de calcul (computation). Les calculs (commandes cres par des applications) seront placs dans des queues (queue de jobs) pour tre excuts.

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Bases de lOO: Abstraction, Encapsulation, Polymorphisme & Hritage Principes de lOO

    Encapsuler ce qui varie Favoriser la composition sur lhritage Programmer pour des interfaces Opter pour une conception faiblement couple Les classes doivent tre ouvertes pour les extensions et fermes pour les

    modifications Dpendre des abstractions. Ne jamais dpendre de classes concrtes

    Patron de lOO Strategy: dfinit une famille dalgorithmes interchangeables Observer: dfinit une dpendance1--plusieurs entre objets. Decorator: attache des responsabilits additionnelles un objet dynamiquement. Abstract Factory: offre une interface de cration de familles dobjets Factory Method: dfinit une interface de cration des objets Singleton: assure une classe une seule instance Command: encapsule une requte comme un objet

    Rcapitulatif (1/2)

    138

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le patron Command dcouple un objet, faisant des requtes, de lobjet qui sait comment la raliser

    Un objet Command est au centre de ce dcouplage et encapsule le Receiver avec une action (ou des actions)

    LInvoker excute la requte dun objet Command en appelant sa mthode execute(), qui invoque les actions sur le Receiver

    Le patron Command supporte lannulation (undo) par limplmentation dune mthode undo() -dans la commande- qui restore lancien tat du systme (avant lexcution de la mthode execute())

    Les Macro-Commandes sont des simples extensions de Command qui permettent linvocation de multiple commandes. Pareil, les macro-commandes peuvent supporter les mthodes dannulation (undo).

    Le patron Command est utilis aussi pour implmenter lorganisation des requtes (Jobs) et la gestion de la journalisation (logging)

    Rcapitulatif (2/2)

    139 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Exercice 1 On vous demande de participer la cration dun nouvel outil graphique. Cet

    outil permettra de crer de manire intuitive des dessins avec un niveau de complexit plus ou moins lev. Les dessins pourront tre composs dun ensemble de points, droites, arc de cercles ou autres formes simples telles que des cercles ou des polygones. Cet outil sera similaire au programme appel Paint sous lenvironnement Windows. La figure suivante prsente un diagramme de classes simplifi pour cette application :

    140

    Vous tes charg de concevoir le mcanisme qui permettra de garder une trace des actions de lutilisateur. Ce dernier pourra ainsi annuler les dernires actions faites.

    Question: Faites les modifications ncessaires au diagramme de classes pour implanter le patron Commande.

    Application +ouvrir(doc:Dessin)+fermer()+sauvegarder():boolean

    Dessin +ajouterPoint(position:Vecteur2D)+ajouterDroite(pt1:Vecteur2D,pt2:Vecteur2D)+ajouterCercle(rayon:float,centre:Vecteur2D) +ajouterPolygone(listePts:[]Vecteur2D)+afficher()

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le but de cet exercice est de tester la puissance du pattern Command. Pour ce faire, nous disposons dune calculatrice offrant les oprations arithmtiques de base (+, - et *) sur 2 rels et nous voulons transformer les actions (des utilisateurs) de calculs sur cette calculatrice en des commandes. 1. Donne le digramme de classes dcrivant cette transformation avec le pattern

    Command. 2. Implanter ce diagramme tout en respectant le client suivant :

    141

    Exercice 2

    public class Client { public static void main(String[] args) { Calculatrice c=new Calculatrice(); PlusCommand plus =new PlusCommand(c); MultipCommand mult=new MultipCommand (c); SoustCommand sous =new SoustCommand(c); CalculatriceControl control =new CalculatriceControl(); control.setCommand(0, plus); control.setCommand(1, sous); control.setCommand(2, mult); control.MultiButtonPressed(2, 5, 15); control.SoustButtonPressed(1, 17, 10); control.PlusButtonPressed(0, 12, 15); }}

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le Modle-Vue-Contrleur

    142

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le modle MVC: destin rpondre aux besoins des applications interactives en sparant les problmatiques lies aux diffrents composants au sein de leur architecture respective.

    Ce paradigme regroupe les fonctions en trois catgories : un modle (modle de donnes), une vue (prsentation, interface utilisateur) un contrleur (logique de contrle, gestion des vnements, synchronisation)

    Architecture Modle/Vue/Contrleur

    143

    L'ide est de bien sparer les donnes, la prsentation et les traitements.

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le modle reprsente le cur (algorithmique) de l'application : traitements des donnes, interactions avec la base de donnes, etc. dcrit les donnes manipules par l'application. regroupe la gestion de ces donnes et est responsable de leur intgrit. La base de donnes sera l'un de ses composants.

    Le modle comporte des mthodes standards pour mettre jour ces donnes (insertion, suppression, changement de valeur).

    Les rsultats renvoys par le modle ne s'occupent pas de la prsentation.

    Le modle ne contient aucun lien direct vers le contrleur ou la vue. Sa communication avec la vue s'effectue au travers du patron

    Observateur.

    Le Modle

    144

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Ce avec quoi l'utilisateur interagit se nomme prcisment la vue. prsenter les rsultats renvoys par le modle. recevoir toute action de l'utilisateur (hover, clic de souris, slection d'un bouton radio,

    cochage d'une case, entre de texte, de mouvements, de voix, etc.).

    Ces diffrents vnements sont envoys au contrleur. La vue n'effectue pas de traitement,

    afficher les rsultats des traitements effectus par le modle et interagir avec l'utilisateur.

    Plusieurs vues peuvent afficher des informations partielles ou non d'un mme modle.

    La Vue

    145 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le contrleur prend en charge la gestion des vnements de synchronisation pour mettre jour la vue ou le modle

    reoit tous les vnements de l'utilisateur et enclenche les actions effectuer

    Si une action ncessite un changement des donnes, le contrleur demande la modification des donnes au modle, et ce dernier notifie la vue que les donnes ont chang pour qu'elle se mette jour.

    D'aprs le patron de conception observateur/observable, la vue est un observateur du modle qui est lui observable

    Le contrleur n'effectue aucun traitement, ne modifie aucune donne. Il analyse la requte du client et se contente d'appeler le modle adquat et de

    renvoyer la vue correspondant la demande.

    Le Contrleur

    146

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    lorsqu'un client envoie une requte l'application : la requte envoye depuis la vue est analyse par le contrleur (par

    exemple un clic de souris pour lancer un traitement de donnes) ; le contrleur demande au modle appropri d'effectuer les traitements et

    notifie la vue que la requte est traite (via par exemple un callback) ; la vue notifie fait une requte au modle pour se mettre jour (par exemple

    affiche le rsultat du traitement via le modle).

    Flux de traitement

    147 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    L'architecture trois tiers est un modle en couches, c'est--dire, que chaque couche communique seulement avec ses couches adjacentes le flux de contrle traverse le systme de haut en bas

    Dans le modle MVC, la vue peut consulter directement le modle (lecture) sans passer par le contrleur. Par contre, elle doit ncessairement passer par le contrleur pour effectuer une modification (criture). le contrleur peut alors envoyer des requtes toutes les vues de manire ce

    qu'elles se mettent jour.

    La diffrence fondamentale se trouve dans le fait que l'architecture 3-Tier spare la couche mtier de la couche accs aux donnes.

    Pour qu'une application MVC soit une vraie application 3-Tier il faut lui ajouter une couche d'abstraction d'accs aux donnes de type DAO (Data Access Object).

    Inversement pour qu'une application 3-Tier respecte MVC il faut lui ajouter une couche de contrle entre la couche mtier et la couche prsentation.

    Architecture MVC ou 3-Tier

    148

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    Le patron "Factory"

    149 Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    PizzaStore : Crer des pizzas (1/37)

    150

    Pizzeria: Crer des pizzas

    Pizza orderPizza(){ Pizza pizza=new Pizza(); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; }

    Pour la flexibilit, on veut que celui-ci soit une classe abstraite ou interface, sauf quon ne peut pas instancier lun des deux derniers!

    On veut plus quun type de pizza.

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    PizzaStore : Plusieurs types de pizza (2/37)

    151

    Pizzeria: Crer plusieurs types de pizza On passe le type du pizza travers le mthode orderPizza()

    Selon le type de pizza, on cre la pizza concrte, et on la place dans la variable "pizza" (interface et classe mre des pizzas).

    Une fois on a la pizza, on prpare la sauce, le nappage (tomate/crme fraiche) et le fromage , puis on la fait cuire, la coupe, et on la met dans une boite.

    Pizza orderPizza( String type ){ Pizza pizza; if (type.equals("cheese"){ pizza=new CheesePizza(); } else if (type.equals("greek"){ pizza=new GreekPizza(); } else if (type.equals("pepperoni"){ pizza=new PepperoniPizza(); } pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; }

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    PizzaStore : Autres types de pizza (3/37)

    152

    Les concurrents ont ajout un nouveau type de pizza: (avec Calamars) Ajouter ClamPizza au menu

    On na pas vendu beaucoup de GreekPizza dernirement Suspendre GreekPizza du menu

    Partie variable: On modifie le code autant que la slection de pizza change.

    Partie invariable: Gnralement, ces oprations sont les mmes pour des annes et des annes.

    C

    e

    c

    o

    d

    e

    e

    s

    t

    N

    O

    N

    f

    e

    r

    m

    p

    o

    u

    r

    l

    a

    m

    o

    d

    i

    f

    i

    c

    a

    t

    i

    o

    n

    !

    Pizza orderPizza(String type){ Pizza pizza; if (type.equals("cheese"){ pizza=new CheesePizza(); } else if (type.equals("greek"){ pizza=new GreekPizza(); } else if (type.equals("pepperoni"){ pizza=new PepperoniPizza(); } else if (type.equals("clam"){ pizza=new ClamPizza(); } pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; }

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    PizzaStore : Encapsuler la cration (4/37)

    153

    Rgle 1 de lOO: Encapsuler ce qui varie

    On place ce code dans un objet qui soccupera de la cration des pizzas concrtes. Si un autre objet a besoin dune pizza concrte, cest cet objet quil faut appeler.

    Pizza orderPizza(String type){ Pizza pizza;

    pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza;

    }

    if (type.equals("cheese"){ pizza=new CheesePizza(); } else if (type.equals("pepperoni"){ pizza=new PepperoniPizza(); } else if (type.equals("clam"){ pizza=new ClamPizza(); }

    On attribue le nom Factory ce nouvel objet Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    PizzaStore : Un Simple Factory (5/37)

    154

    Le seul rle de SimplePizzaFactory est de crer des pizzas pour ces clients

    Initialement, on dfinit la mthode createPizza() dans le Factory. Cest la mthode que tous les clients utilisent pour instancier des nouveaux objets.

    Cest le code quon a retirer de la mthode orderPizza().

    public class SimplePizzaFactory { public Pizza createPizza(String type){ Pizza pizza=null;

    if (type.equals("cheese"){ pizza=new CheesePizza(); } else if (type.equals("pepperoni"){ pizza=new PepperoniPizza(); } else if (type.equals("clam"){ pizza=new ClamPizza(); } return pizza; }

    }

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    PizzaStore : Retravaillons la classe PizzaStore (6/37)

    155

    Maintenant, PizzaStore utilise SimplePizzaFactory pour crer des pizzas PizzaStore rcupre la rfrence du factory travers le constructeur.

    La mthode orderPizza() utilise le factory pour crer ses pizzas.

    Noter quon a remplac loprateur new par une mthode concrte Plus dinstanciation concrte ici

    public class PizzaStore { SimplePizzaFactory factory; public PizzaStore(SimplePizzaFactory factory){ this.factory=factory; } public Pizza orderPizza(String type){ Pizza pizza; pizza=factory.createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } }

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    PizzaStore : Le diagramme de classes (7/37)

    156

    Actuellement, Simple Factory nest pas un patron. Cest plutt un "style" de programmation

    On dfinit Pizza comme classe abstraite, avec quelque implmentations qui peuvent tre redfinies

    Elle doit tre la seule partie de notre application qui pointe vers les classes des pizzas concrtes

    Pizza prepare() bake() cut() box()

    ClamPizza PepperoniPizza

    CheesePizza

    SimplePizzaFactory

    createPizza()

    PizzaStore

    orderPizza()

    PizzaStore cre des instances travers SimplePizzaFactory

    La mthode de cration est souvent statique

    Chaque produit implmente la classe abstraite Pizza

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    PizzaStore : Franchise de PizzaStore (8/37)

    157

    Objectif: Franchiser PizzaStore: Crer plusieurs stores dans plusieurs villes (Sfax, Tunis, etc.)

    Besoin: Dvelopper une application qui gre la cration des pizzas pour chaque store Chaque store offre diffrent types de pizza

    Conception: OO

    Moins de fromage dans les pizzas, etc.

    Des pizzas familles de grande taille, beaucoup de fromage, etc.

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    PizzaStore : Diffrent styles des PizzaStores (9/37)

    158

    Si on prpare les mmes pizzas

    SfaxPizzaFactory sffactory = new SfaxPizzaFactory(); PizzaStore sfstore = new PizzaStore(sffactory); sfstore.orderPizza("cheese");

    TunisPizzaFactory tnfactory = new TunisPizzaFactory(); PizzaStore tnstore = new PizzaStore(tnfactory); tnstore.orderPizza("cheese");

    Crer des pizzas travers SfaxPizzaFactory

    Crer les mmes pizzas travers TunisPizzaFactory

    Et si chaque PizzaStore prpare ses propres styles de pizza

    Je prpare les pizzas depuis des annes et je veux ajouter mes propres

    touches damlioration des procdures de mon PizzaStore

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    On donne la libert aux franchises de crer leurs propres styles Dplacer la cration dans une la mthode createPizza() et garder la

    mme mthode orderPizza() pour tous les stores Chaque rgion ltend afin de spcifier son propre style

    159

    PizzaStore : Le framework de PizzaStore (10/37)

    public abstract class PizzaStore { public Pizza orderPizza(String type){ Pizza pizza; pizza = createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } abstract Pizza createPizza(String type); }

    CreatePizza() est une mthode PizzaStore plutt que dans le Factory

    Tout ceci apparat le mme

    On a transfr notre objet Factory dans cette mthode

    Notre "mthode Factory" est maintenant abstraite dans PizzaStore Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    160

    PizzaStore : Les styles de pizzas (11/37)

    PizzaStore

    createPizza() orderPizza()

    SfaxStylePizzaStore

    createPizza()

    TunisStylePizzaStore

    createPizza()

    Pizza createPizza(String type) { Pizza pizza=null; if (type.equals("cheese"){

    pizza=new SfaxStyleCheesePizza(); } else if (type.equals("pepperoni"){

    pizza=new SfaxStylePepperoniPizza(); } else if (type.equals("clam"){

    pizza=new SfaxStyleClamPizza(); } return pizza;

    }

    Pizza createPizza(String type) { Pizza pizza=null; if (type.equals("cheese"){

    pizza=new TunisStyleCheesePizza(); } else if (type.equals("pepperoni"){

    pizza=new TunisStylePepperoniPizza(); } else if (type.equals("clam"){

    pizza=new TunisStyleClamPizza(); } return pizza;

    }

    Mthode abstraite, dfinir dans les classes drives

    Crer des pizzas avec les ingrdients spcifiques Tunis

    Crer des pizzas avec les ingrdients spcifiques Sfax

  • Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    public class SfaxStylePizzaStore extends PizzaStore { Pizza createPizza(String item) { if (item.equals("cheese"){

    return new SfaxStyleCheesePizza(); } else if (item.equals("pepperoni"){

    return new SfaxStylePepperoniPizza(); } else if (item.equals("clam"){

    return new SfaxStyleClamPizza(); }

    } }

    Les bnfices dune franchise On obtient des fonctionnalits des pizzas communes (prepare(), bake(), cut() et box()) Chaque rgion dfinit sa propre mthode createPizza() qui spcifie son style de pizza

    161

    PizzaStore : Un PizzaStore de Style Sfaxien (12/37)

    On implmente createPizza() puisquelle est abstraite: Cest la "mthode Factory"

    On hrite la mthode orderPizza() de PizzaStore

    Crer des pizzas du style sfaxien!!

    Rq: Toutes les responsabilits dinstanciation sont dplaces vers la mthode createPizza() qui agit comme un factory

    La mthode factory gre la cration des objets et leur encapsulation Dcouplage du code du client dans la supre classe de la cration de lobjet dans les sous-

    classes

    Riadh BEN HALIMA&Wajdi LOUATI [Design patterns]

    PizzaStore : Commander des pizzas (13/37)

    Je voudrai une pizza de grande taille avec beaucoup

    de fromage du style tunisien

    Je voudrai une pizza de taille moyenne avec

    peu de