Avec l'essor de l'architecture orientée services (SOA), de plus en plus d'organisations utilisent des services tiers pour leurs systèmes d'entreprise. Ces entreprises doivent suivre un environnement commercial en évolution rapide, ce qui peut signifier l'abandon des services d'un fournisseur de services pour un autre.
Dans de tels cas, l'architecture existante d'une entreprise peut être incompatible avec celle d'un nouveau fournisseur. Au lieu de perdre des mois à réécrire le code d'entreprise pour le rendre compatible avec de nouveaux logiciels, une entreprise peut utiliser le modèle de conception d'adaptateur.
Qu'est-ce que le modèle de conception d'adaptateur ?
Le modèle d'adaptateur permet aux classes qui ont des interfaces incompatibles de fonctionner ensemble. Pour ce faire, il convertit l'interface d'une classe (ou d'un logiciel) existante en une interface attendue par un client (ou un service). Il existe deux types d'adaptateurs: les adaptateurs d'objet et les adaptateurs de classe.
L'adaptateur d'objet utilise la composition pour envelopper l'adapté avec l'adaptateur, produisant ainsi l'interface attendue par le client. Ainsi, si le client attend une chaîne, l'adaptateur prendra un entier (l'adapté) et lui donnera les caractéristiques d'une chaîne.
Le diagramme de classes ci-dessus représente l'adaptateur d'objet. Le classe d'adaptateur met en œuvre le interface cible, accédant effectivement à toutes les méthodes de l'interface. Ensuite, il adapte un adapté et enveloppe ça adapté avec le interface cible méthodes.
L'adaptateur de classe utilise l'héritage multiple, où la classe d'adaptateur est la sous-classe à la fois de l'adapté et de la classe cible. Le diagramme de classes ci-dessous représente l'adaptateur de classe, que vous êtes libre d'utiliser dans les langages de programmation prenant en charge l'héritage multiple.
Implémentation du modèle de conception d'adaptateur en Java
Cette application implémentera l'adaptateur d'objet. Cet exemple d'application simulera une organisation financière passant de l'utilisation et du traitement des cartes de paiement aux cartes de crédit. Cette organisation utilisait à l'origine l'interface de carte de paiement suivante :
publicinterfaceCarte de crédit{
publicannulersolde mensuel();
publicannulerdes frais de retard();
publicannulerCotisation annuelle();
}
Un type de carte de paiement populaire que le système de cette organisation traite est la carte plum :
publicclassePruneCartemet en oeuvreCarte de crédit{
privéentier N ° de carte;
privé Chaîne nom_client ;
privédouble équilibre;// constructeur principal
publicPruneCarte(entier cardNo, Chaîne customerName, double équilibre){
ce.cardNo = cardNo;
ce.customerName = clientName ;
ce.balance = solde;
}
// getters et setters
publicentiergetCardNo(){
retour N ° de carte;
}
publicannulersetCardNo(entier N ° de carte){
ce.cardNo = cardNo;
}
public Chaîne getCustomerName(){
retour NomClient ;
}
publicannulersetNomClient(Chaîne nom_client){
ce.customerName = clientName ;
}
publicdoubleobtenirBalance(){
retour équilibre;
}
publicannulersetBalance(double équilibre){
ce.balance = solde;
}
@Passer outre
publicannulersolde mensuel(){
System.out.println("En janvier " + ce.nomclient + " dépensé " + ce.équilibre);
}
@Passer outre
publicannulerdes frais de retard(){
System.out.println(ce.nomclient + "les frais de retard mensuels sont de 80,00 $");
}
@Passer outre
publicannulerCotisation annuelle(){
System.out.println(ce.nomclient + "les frais annuels sont de 200,00 $");
}
}
Cette institution financière est en train de passer aux cartes de crédit et de supprimer progressivement les cartes de paiement, de sorte que certains de ses clients ont désormais des cartes de crédit :
publicinterfaceCarte de crédit{
publicannulermensualMinPayment();
publicannulerintérêt();
publicannulerCotisation annuelle();
}
Le système d'entreprise de l'institution financière ne traite désormais que les cartes de crédit, car il envisage de mettre fin à l'utilisation des cartes de paiement au cours de l'année à venir. Mais la plupart de leurs clients utilisent encore des cartes de paiement. Les ingénieurs ont donc décidé qu'il valait mieux implémenter un adaptateur jusqu'à ce que tous leurs clients passent à une carte de crédit.
publicclasseChargeCardAdaptermet en oeuvreCarte de crédit{
ChargeCardChargeCard ;publicChargeCardAdapter(ChargeCard chargeCard){
ce.chargeCard = chargeCard ;
}@Passer outre
publicannulermensualMinPayment(){
ce.chargeCard.monthlyBalance();
}@Passer outre
publicannulerintérêt(){
ce.chargeCard.lateFee();
}
@Passer outre
publicannulerCotisation annuelle(){
ce.carte de crédit. Cotisation annuelle();
}
}
Cet adaptateur de carte de charge Classe Java implémente la carte de crédit InterfaceJava. Il adapte ChargeCard (l'adapté), lui donnant les caractéristiques d'une carte de crédit. Par exemple, le système traitera les frais d'intérêt d'une carte de crédit, c'est-à-dire les frais de retard d'un client de carte de paiement qui n'a pas encore converti.
Avantages de l'utilisation du modèle d'adaptateur
Le principal avantage de l'utilisation du modèle d'adaptateur est qu'il permet aux clients d'utiliser de nouveaux services, bibliothèques et fonctionnalités sans modifier leur code. Cela favorise l'évolutivité des applications.
Un autre avantage est que ce modèle est également flexible. Le modèle d'adaptateur fournit deux méthodes d'implémentation: les adaptateurs d'objet et les adaptateurs de classe.