I. Exploration▲
J'ai récemment rencontré le problème d'un manque de conformité d'un outil par rapport à sa fonction et aux standards proposés par Sun en matière d'utilisation en java. Ma problématique était d'envoyer un mail, l'outil : l'API Java de Lotus qui pour la version que j'utilisais n'était pas conforme à Javamail. Pourquoi aurais-je fait le choix d'empaqueter les outils dans un pattern pour le rendre conforme aux normes Java ? Plusieurs raisons s'offrent à nous :
- le besoin de ne pas dépendre de Lotus pour envoyer les mails puisqu'on ignore de quoi demain pourrait être fait ;
- la probabilité très forte que l'API futur de Lotus se conforme aux normes donc un souci de compatibilité ascendante ;
- et surtout, la connaissance acquise autour de l'API Sun plutôt qu'autour de celle d'IBM. En effet, Javamail est standard et connu par de nombreux développeurs, il dispose de nombreuses documentations et bénéficie d'une importante communauté d'entraide au développement.
Pour diverses raisons, il peut donc être de bonne augure de se fixer le développement d'un adaptateur entre les classes clientes et une API qui nous est fournie. Une seule bonne raison pour ne pas le faire, mais elle est de taille et mérite réflexion, sera le temps passé à la réalisation de cet adaptateur (et quand on parle de Javamail, ceci peut devenir rédhibitoire).
II. Structure▲
La structure est quasiment triviale, il suffit en fait de fournir une classe intermédiaire qui soit conforme à vos attentes. Celle-ci délègue toutes les requêtes qui lui sont faites à l'API fournie. L'API peut donc ne pas être conforme à vos attentes. Il est, comme toujours, préférable de s'appuyer sur la notion d'interface pour ne pas dépendre de l'implémentation même sous cette forme, le diagramme va dans ce sens.
III. Implémentation▲
Je vais vous fournir une API bidon (on reprend l'exemple du Logger) ou tout est en français et pour laquelle vous voulez être conforme à l'outil log4j un peu plus standard. Je ne reprend qu'une seule méthode pour la démonstration.
com.developpez.adaptateur.LoggerFrancais
/*
*
LoggerFrancais.java
*
*
Created
on
11
mars
2003,
17:18
*/
package
java.uml.adaptateur.com.developpez.adaptateur;
public
class
LoggerFrancais {
/**
Creates
a
new
instance
of
LoggerFrancais
*/
public
LoggerFrancais
(
) {
}
/**
*
Log
une
exception
quand
elle
est
levée
.
*/
public
void
erreur
(
Exception e) {
//
ici
le
code
pour
logger
throw
new
RuntimeException
(
"
Pas
implémentée
"
);
}
}
com.developpez.adaptateur.LoggerAdaptateur
/*
*
LoggerAdaptateur.java
*
*
Created
on
11
mars
2003,
17:22
*/
package
java.uml.adaptateur.com.developpez.adaptateur;
/**
*
*
@author
smeric
*/
public
interface
LoggerAdaptateur {
public
void
error
(
Exception e);
}
com.developpez.adaptateur.LoggerAdaptateurImpl
/*
*
LoggerAdaptateurImpl.java
*
*
Created
on
11
mars
2003,
17:26
*/
package
java.uml.adaptateur.com.developpez.adaptateur;
/**
*
*
@author
smeric
*/
public
class
LoggerAdaptateurImpl implements
LoggerAdaptateur {
/**
Creates
a
new
instance
of
LoggerAdaptateurImpl
*/
public
LoggerAdaptateurImpl
(
) {
}
public
void
error
(
Excpetion e) {
//
ici,
on
se
contente
d'appeler
la
méthode
du
logger
non
conforme
//
effectuant
ce
que
la
méthode
error()
devrait
effectuer.
getLoggerFrancais.erreur
(
e);
}
private
LoggerFrancais getLoggerFrancais
(
) {
if
(
null
=
=
loggerFrancais) {
loggerFrancais=
new
LoggerFrancais
(
);
}
return
loggerFrancais;
}
private
LoggerFrancais loggerFrancais; //
notre
cible
}