Adapter
Publié le 17 Mars 2025Adapter (adaptateur en français) est un patron de conception structurel (design pattern) utilisé pour permettre à deux interfaces incompatibles de fonctionner ensemble. L'Adapter va servir de convertisseur entre un code client et le code de notre application.
Principe
Exemples d’utilisations
Garder une interopérabilité avec du code legacy
Utilisation d’une API tierce
Points d’attentions
Implémenter un Adapter
Exemple d'utilisation d’Adapter en Go
package emailAdapter
import (
"designpatterns/adapter/emailAPI"
)
type EmailSender interface {
Send(to string, subject string, body string) error
}
type EmailAdapter struct {
EmailService *emailAPI.ExternalEmailService
}
func (a *EmailAdapter) Send(to string, subject string, body string) error {
emailDetails := &emailAPI.EmailDetails{
Recipient: to,
Subject: subject,
Body: body,
IsHTML: false, // par défaut, on envoie un email en texte brut
}
return a.EmailService.SendComplexEmail(emailDetails)
}
package emailAPI
import "fmt"
type ExternalEmailService struct{}
type EmailDetails struct {
Recipient string
Subject string
Body string
IsHTML bool
Attachment string
}
func (e *ExternalEmailService) SendComplexEmail(details *EmailDetails) error {
// On simule l'envoi d'un email complexe via l'API externe
fmt.Printf("Envoi de l'email à %s\nSujet: %s\nContenu: %s\nHTML: %v\nPièce jointe: %s\n",
details.Recipient, details.Subject, details.Body, details.IsHTML, details.Attachment)
return nil
}
package main
import (
"fmt"
"designpatterns/adapter/emailAPI"
"designpatterns/adapter/emailAdapter"
)
func main() {
externalService := &emailAPI.ExternalEmailService{}
var emailSender emailAdapter.EmailSender = &emailAdapter.EmailAdapter{EmailService: externalService}
err := emailSender.Send("test@mail.com", "Bienvenue !", "Merci de vous être inscrit à notre service.")
if err != nil {
fmt.Println("Erreur lors de l'envoi de l'email:", err)
}
}
Le même exemple en PHP
namespace DesignPatterns\Adapter;
interface EmailSender
{
public function send(string $to, string $subject, string $body): bool;
}
namespace DesignPatterns\Adapter;
class EmailAdapter implements EmailSender
{
private ExternalEmailService $emailService;
public function __construct(ExternalEmailService $emailService)
{
$this->emailService = $emailService;
}
public function send(string $to, string $subject, string $body): bool
{
$emailDetails = [
'recipient' => $to,
'subject' => $subject,
'body' => $body,
'isHTML' => false,
'attachment' => null
];
return $this->emailService->sendComplexEmail($emailDetails);
}
}
namespace DesignPatterns\Adapter;
class ExternalEmailService
{
public function sendComplexEmail(array $emailDetails): bool
{
echo "Envoi de l'email à: " . $emailDetails['recipient'] . PHP_EOL;
echo "Sujet: " . $emailDetails['subject'] . PHP_EOL;
echo "Contenu: " . $emailDetails['body'] . PHP_EOL;
echo "HTML: " . ($emailDetails['isHTML'] ? "Oui" : "Non") . PHP_EOL;
echo "Pièce jointe: " . ($emailDetails['attachment'] ? $emailDetails['attachment'] : "Aucune") . PHP_EOL;
return true;
}
}
declare(strict_types=1);
use DesignPatterns\Adapter\EmailAdapter;
use DesignPatterns\Adapter\ExternalEmailService;
require "./vendor/autoload.php";
$externalEmailService = new ExternalEmailService();
$emailSender = new EmailAdapter($externalEmailService);
$emailSender->send('test@mail.com', 'Bienvenue !', 'Merci de vous être inscrit à notre service.');