1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 

Design Pattern - Améliorez l'architecture de vos programmes

3.4.Décorateur

3.4.1.Théorie

Ce design pattern peut être assimilé à un « emballage ». Il permet l’ajout dynamique de responsabilités à un objet. En effet nous pouvons très bien utiliser l’héritage pour ce genre de chose, cependant ce concept est limité car il ne définit que des responsabilités statiques et manque donc énormément de souplesse. De plus l’héritage n’est pas toujours possible (dans le cas d’une classe finale par exemple) puis l’héritage peut donner lieu à la prolifération de classes ce qui n’est pas toujours facile à gérer.
Lorsque l’on parle de proliférations de classes et manque de souplesse de l’héritage, le mieux est de prendre un exemple. Imaginons que vous ayez une classe qui s’occupe des « logs » (journaux) et que vous voulez lui ajouter l’heure et la date d’émission d’un message. Vous voulez également faire un affichage dans la console, un log dans un fichier, un log par mail et un affichage Swing pour l’administrateur. Dans chaque cas vous voulez afficher ou non l’heure et la date.
Nous voilà donc obligés de surcharger la classe de log (pour un fichier) 3 fois pour les divers types de logger et 2 fois pour que chacun affiche l'heure et la date, ou non (au total 6 classes).

3.4.2.Structure

La structure de ce pattern se compose d’au moins 4 éléments :
  • L’interface « Composant » : qui définit les méthodes de bases qui correspondent au type de composant.
  • L’implémentation par défaut du composant : « DefaultComposant ».
  • Classe abstraite héritant de Composant définissant le décorateur. Le plus simple est d’utiliser une classe abstraite (cela peut être fait via une interface) et d’avoir une instance vers un objet de type « Composant » afin d’avoir accès à toutes les méthodes de bases implémentées.


  • Vous pouvez ensuite créer un ensemble de Logger dérivant du Decorateur (qui est lui-même un logger). De ce fait vous allez pouvoir « empiler » les loggers afin que par exemple le message de base soit traité plusieurs fois (ajout de la date/heure, mise en forme …)

3.4.3.Pratique

Afin de mieux appréhender ce concept, nous allons étudier notre exemple de « logger ». Nous aurons un logger par défaut qui permettra simplement d’afficher des messages dans la console ou dans un stream quelconque. Nous lui rajouterons ensuite les fonctionnalités suivantes :
  • Ajouter la date pour chaque message
  • Afficher les messages dans un JTextArea (provenant d’une fenêtre ouverte)

Voici le code complet de l’application :
  • L’interface Logger :
package decorator;

public interface Logger {
public String log(String msg);
}
  • L’implémentation par défault DefaultLogger
package decorator;
import java.io.PrintStream;

public class DefaultLogger implements Logger {

private PrintStream stream;

public DefaultLogger() {
}

public DefaultLogger(PrintStream stream) {
this.stream = stream;
}

public void setStream(PrintStream stream) {
this.stream = stream;
}

public PrintStream getStream() {
return (this.stream != null)   this.stream : System.out;
}

public String log(String msg) {
this.getStream().println(msg);
return msg;
}
}
  • La classe abstraite implémentant Logger : DecoratorLogger
package decorator;

public abstract class DecoratorLogger implements Logger {
protected Logger logger;

public DecoratorLogger(Logger logger) {
this.logger = logger;
}

public String log(String msg) {
return logger.log(msg);
}

public Logger getLogger() {
return this.logger;
}

public void setLogger(Logger logger) {
this.logger = logger;
}
}
  • L’implémentation de nos différents traitements applicables (différents Logger).
    • LoggerWithDate : ajoute la date au message
package decorator;
import java.text.SimpleDateFormat;
import java.util.Date;

public class LoggerWithDate extends DecoratorLogger {

public LoggerWithDate(Logger logger) {
super(logger);
}

public String log(String msg) {
return "Date : " + LoggerWithDate.getDate(new Date()) + " - " + super.log(msg);
}
public static String getDate(java.util.Date date) {
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
return formatter.format(date);
}
}

    • LoggerSwing : affiche le message dans un JTextArea
package decorator;
import javax.swing.JTextArea;

public class LoggerSwing extends DecoratorLogger {

protected JTextArea txtFieldLog;

public LoggerSwing(Logger logger, JTextArea txtFieldLog) {
super(logger);
this.txtFieldLog = txtFieldLog;
}

public String log(String msg) {
txtFieldLog.setText(txtFieldLog.getText() + "\n" + super.log(msg));
return msg;
}
}
  • La classe de « démarrage », Client (qui contient aussi la classe pour la fenêtre Swing)
package decorator;

import javax.swing.JFrame;
import javax.swing.JTextArea;

public class Client {
public static void main(String[] args) {
// Frame pour le log
FrameLog frameLog = new FrameLog("TestLogger");
frameLog.show();

// Crée un logger
Logger logger = new DefaultLogger();
// Ajoute une fonctionnalité (date)
LoggerWithDate loggerWithDate = new LoggerWithDate(logger);
// Ajoute la fonctionnalité : Swing
LoggerSwing loggerSwing = new LoggerSwing(loggerWithDate, frameLog.getFieldLog());

// Affiche un log
logger.log("Test1");

// Affiche le log dans le Swing
loggerSwing.log("Test2");

// Affiche le log dans le swing (sans date)
loggerSwing.setLogger(logger);
loggerSwing.log("Fin");
}
}

class FrameLog extends JFrame {
protected JTextArea txtConsoleLog;

public FrameLog(String title){
this.setTitle("Logger : " + title);
this.setSize(300, 300);
txtConsoleLog = new JTextArea();
this.getContentPane().add(txtConsoleLog);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

public JTextArea getFieldLog() {
return this.txtConsoleLog;
}
}



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 

Retrouvez ci-dessous les autres sections du Laboratoire Sun
Exemples de code
JavaManipuler les looks and feel (lister et affecter)10/15/07
JavaFaire sa propre injection de dépendance avec les annotations5/9/06
JavaSplash screen avec progress Bar5/5/06
JavaFaire un splash screen en swing5/5/06

Essentiels de cours Java
JavaEJB 3 - Les Entreprise Java Bean version 3 (JavaBeans)
Cet essentiel est la suite de « Entreprise JavaBean 2.1 ». Cependant, nous allons étudier les nouvelles spécifications 3.0 qui simplifient énormément le développement par rapport aux EJB 2.6/20/06
JavaSWT - Créer des interfaces graphiques performantes
SWT (Standard Widget Toolkit) est une librairie graphique qui vous permet de réaliser des applications graphiques Java beaucoup plus avancées et surtout plus rapide à l’exécution.1/29/06
JavaStruts - Un framework MVC pour vos applications J2EE
Struts est un framework open-source qui vous permet de gagner du temps, mais qui permet aussi de voir des applications complexes comme une suite de composants de base : Vues, Actions, Modèles. Vous gagnez ainsi en évolutivité et en lisibilité du code.1/13/06
JavaHibernate - Persistance objet - relationnel
Cet essentiel explique comment utiliser Hibernate afin de gérer la persistance objet relationnel au sein de vos applications Java.12/14/05
JavaIntroduction J2EE - Applications d'entreprise
Cours d'introduction aux diverses technologies et outils que l'on peut rencontrer dans le monde du Java orienté entreprise J2EE12/14/05
JavaEJB 2 - Les Entreprise Java Bean (JavaBeans)
L'objectif avec EJB2 (Entreprise JavaBeans) est d'introduire les concepts de l’Ingénierie Logicielle Basée sur les Composants.12/14/05
JavaDesign Pattern - Améliorez l'architecture de vos programmes
Afin de répondre a des situation récurrentes en programmation, les "design pattern" apportent une solution type à beaucoup de contraintes liées à la programmation objet.12/14/05
JavaArchitecture J2EE - Comment organiser son application J2EE
Ce cours explique comment créer un code modulable, lisible et évolutif afin d'assurer la pérénité de son application.12/14/05
JavaLes web-services - Publication de services
Le développement tend vers les technologies du Web. Il est difficile de faire la distinction entre les différents logiciels qui sont de plus en plus intégrés au Web. Les Web Services rentrent dans l’optique de différencier bien précisément les couches.12/14/05
JavaAnt - L'automatisation des tâches du programmeur
Ecrire des scripts afin d'exécuter les tâches récurrentes10/31/05
JavaIntroduction au langage Java - Présentation & historique
Présentation des origines du langage, ainsi que se buts premiers8/11/05
JavaLa Syntaxe Java - Bases & nomenclatures
Bases de la syntaxe du langage Java8/11/05
JavaLes Classes - Concepts & héritage
Base du développement objet en Java grâce aux classes8/11/05
JavaLes Exceptions - Gestion d'erreurs
Gérer les erreurs liés à la programmation8/11/05

Articles
Eclipse Europa : le successeur de Callisto
Après Eclipse Callisto (Eclipse 3.2), la fondation Eclipse sort la nouvelle mouture d'Eclipse appelée Europa (Eclipse 3.3) faisant ainsi passer le nombre de projets embarqués de 10 à 21. Que ceux qui sont réticents aux « distributions » d'Eclipse se rassu12/21/07
JavaCruiseControl : l’outil d’intégration continue à avoir dans sa boite à outils
CruiseControl est un projet open-source offrant de multiples fonctionnalités pour l’intégration, que ce soit pour des développements Java ou .Net. Il est courant sur un projet d’être plusieurs développeurs avec des tâches de développement réparties. Dans7/2/07
JavaEJB3 - Des concepts à l'écriture du code - Editions DUNOD
Consulter le résumé du premier ouvrage du laboratoire Sun de SUPINFO : EJB3 - Des concepts à l'écriture du code. Guide du développeur, éditions DUNOD.5/27/07
JavaPassage de certification Java Web (SCWCD)
Passer une certification est toujours un moment important car cela permet de mieux faire reconnaître ses compétences face à un recruteur ou un employeur.5/12/07
JavaGoogle Web Toolkit
Google Web Toolkit est un framework java pour générer du javascript et des requêtes Ajax à partir d’un code java. Voilà comment il fonctionne.5/10/07
JavaJ2ME Vs SDE
Demain, les terminaux « légers » seront plus nombreux que les ordinateurs personnels, ce qui entraîne une bataille sur le choix d’une plateforme identique à tous ces terminaux… Aujourd’hui nous retrouvons le J2ME ainsi que le SDE qui s’offrent une rude b4/22/07

Tips du laboratoire
EclipseVisual Editor avec Eclipse Europa, c'est possible3/28/08
EclipseGérer les projets dans un workspace.10/16/07
JavaManager votre server d'application avec Eclipse4/21/07
JavaVue des sub-packages avec Eclipse4/21/07
JavaGlisser-déposer avec Eclipse4/21/07

Laboratoire SUPINFO des technologies Sun
labo-sun@supinfo.com


Conditions d'utilisation et © Copyright SUPINFO International University
23, rue de Château Landon - 75010 PARIS - Tél : +33 (0) 153359700 Fax : +33 (0) 153359701
Respect de la vie privée