IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Utilité des décorateurs en JAVA


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 136
    Par défaut Utilité des décorateurs en JAVA
    Bonjour,

    j'ai lu des cours sur les décorateurs en JAVA mais j'aimerais bien que quelqu'un m'explique en des mots simples le principe et l'utilité des décorateurs en java....J'ai compris que c'est beaucoup plus pratique que l'héritage mais j'aimerais bien voir des exemples simples de leur utilisation...


    Merci

  2. #2
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    je ne sais pas si ça va t'éclaircir les idées mais bon ...

    On utilise un pattern décorateur pour ajouter (ou modifier) dynamiquement un ou plusieurs comportement(s) à un objet existant.

    En gros tu as un objet de base auquel, lors de sa création, tu peux ajouter différent comportements. Ton code ne change pas outre mesure puisque l'objet décoré expose la même interface que l'objet "de base".

    l'API java.io utilise pas mal de décorateurs. Par exemple tu as des InputStream qui sont les objets de base et tu peux, lors de la création ajouter des comportements comme la lecture avec un tampon, dans un tableau de byte ...

    En cherchant un peu sur le net tu devrais trouver un tas d'exemples ....

    Explications dans les cours de formation et tutoriels pour apprendre java : http://java.developpez.com/cours/

  3. #3
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Par exemple, dans un de mes logiciels, ils sont utilisés pour gérer différentes fonctionnalités sur une JTable avec des modèles. Ca permet de faire des modèles génériques réutilisables. Un modèle permet d'ajouter des colonnes vides sans données, un autre permet de rendre invisible des colonnes sélectionnées, un autre pour rendre invisible des lignes, un dernier utilise des filtres génériques pour par exemple cacher les lignes avec une valeur null dans une certaine colonne.
    Chaque modèle prend un sous-modèle pour sa construction. Du coup, mon modèle de base qui contient toutes mes données ne change jamais. Ca donne un empilement de plusieurs modèle :
    JTabel -> modèle ajouter colonne vide -> modèle rendre invisible colonne -> modèle rendre invisible ligne -> modèle rendre invisible via filtre dynamique -> modèle standard de base.
    La conception et le code est grandement facilité. On agit sur le modèle voulu sans s'occuper des autres modèles.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 136
    Par défaut
    Bonjour,

    je vous remercie bien pour vos réponses trés instructives...Mais j'avoue que j'ai encore un peu de mal avec les décorateurs...par exemple, je ne saurais pas dans quel cas utiliser un décorateur plutôt que de faire une classe avec les fonctionnalités désirées....Je suis encore toute débutante, je n'ai pas tout le recul que vous avez avec Java, désolée...

    Mais en fait, un décorateur, c'est quoi...c'est une classe, une interface ?J'ai regardé sur le net mais je n'ai pas trouvé d'exemples clairs...

    Dis moi,dinobogan, tu peux me donner un exemple de code d'un model "JTabel -> modèle ajouter colonne vide -> "...par exemple...

  5. #5
    Membre expérimenté Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    Effectivement le meilleur exemple des décorateurs dans le JDK réside dans la gestion des flux (InputStream, OutputStream ...) de java.io.
    Tu peux considérer par exemple que la classe java.io.BufferedOutputStream comme un décorateur permettant de traiter n'importe quel OutputStream de manière bufferisé.
    Au lieu d'utiliser un décorateur, on aurait pu faire créer une sous-classe de OutputStream (par exemple OutputStreamWithBuffer) qui surcharge le traitement en gérant des buffers. Seulement pour être exhaustif il faut créer une sous-classe pour chaque type d'OutputStream (imagine avoir ByteArrayOutputStreamWithBuffer (héritant de ByteArrayOutputStream), FileOutputStreamWithBuffer (héritant de FileOutputStream), FilterOutputStreamWithBuffer (héritant de FilterOutputStream), etc ...). De plus si tu veux pouvoir combiner des fonctionnalités entre elles (par exemple buffer + filtre, il faut à nouveau faire de l'héritage). Au final on aurait une hiérarchie absolument ingérable !

    Le décorateur permet :
    * non seulement de ne plus avoir besoin de créer autant de composant par héritage :
    new BufferedOutputStream(OutputStream) est plus ou moins équivalent à OutputStreamWithBuffer
    new BufferedOutputStream(ByteArrayOutputStream) est plus ou moins équivalent à ByteArrayOutputStreamWithBuffer

    * mais aussi il permet de combiner à l’exécution plusieurs fonctionnalités entre elles (sachant qu’on peut décorer un décorateur).
    new BufferedOutputStream(new FilterOutputStream(OutputStream)) est plus ou moins équivalent à OutputStream avec buffer + filtre

    Au final on peut rajouter dynamiquement (par opposition à l'héritage considéré comme statique) des fonctionnalités avec un minimum de nouveau composant à écrire.

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par specsy Voir le message
    Dis moi,dinobogan, tu peux me donner un exemple de code d'un model "JTabel -> modèle ajouter colonne vide -> "...par exemple...
    Chaque "DecoratorModel" possède en données membre une instance d'un modèle. Ensuite, le décorator reprend l'intégralité des méthodes utilisable sur le modèle.
    Pseudo code du DecoratorModel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class DecoratorModel extends AbstractTalbeModel
    {
      private AbstractTableModel internalModel;
      public DecoratorModel( AbstractTableModel model )
      {
        internalModel = model;
      }
     
      public String getColumnName( int col )
      {
        return internalModel.getColumnName( col );
      }
    ... idem pour presque toutes les méthodes ...
    }
    Par exemple, si le DecoratorModel doit gérer des colonnes à cacher/afficher, il faudra ajouter une liste de booléens en données membres et consulter cette liste pour donner le nombre de colonnes, leurs noms....
    Donc écrire un decorator est souvent long et rébarbatif. Mais dans notre cas, le code s'insère entre une JTable et le modèle de base sans changer la moindre ligne de code au modèle ou à la table. Et en plus, on peut ajouter un nombre potentiellement infini de DecoratorModel les uns à la suite des autres, chacun ayant une fonctionnalité définie.
    En espérant t'avoir un peu éclairé
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

Discussions similaires

  1. Utilité des classes abstraites en java 8
    Par Anubis dans le forum Général Java
    Réponses: 3
    Dernier message: 10/10/2014, 09h27
  2. Réponses: 1
    Dernier message: 12/10/2010, 14h22
  3. Utilité des touches F5 et F6 dans le débogeur Java
    Par new_wave dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 25/11/2008, 10h46
  4. Utilité des java beans dans MVC
    Par Bba_M dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 16/12/2006, 15h37
  5. utilité des DbControl
    Par portu dans le forum Bases de données
    Réponses: 6
    Dernier message: 02/07/2004, 05h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo