Le design pattern Adapter
Description
Le but du design pattern Adapter est de convertir l’interface d’une classe existante en l’interface attendue par des clients afin qu’ils puissent collaborer.
Exemple
Le serveur web du système de vente de véhicules crée et gère des documents destinés aux clients. L’interface Document a été définie pour cette gestion. Sa représentation UML est montrée à la figure 10.1 ainsi que ses trois méthodes setContenu, dessine et imprime. Une première classe d’implémentation de cette interface a été réalisée : la classe DocumentHtml, qui concrétise ces trois méthodes.
Par la suite, l’ajout des documents PDF a posé un problème car ceux-ci sont plus complexes à construire et à gérer que des documents HTML. Un composant tierce partie a alors été choisi, mais son interface ne correspond pas à l’interface Document, il va donc falloir adapter l’une à l’autre. La figure 10.1 montre le composant ComposantPdf dont l’interface comporte plus de méthodes et dont la convention de nommage est de surcroît différente (le préfixe pdf est utilisé).
Le design pattern Adapter propose une solution qui consiste à créer la classe DocumentPdf implémentant l’interface Document...
Structure
1. Diagramme de classes
La figure 10.2 détaille la structure générique du design pattern Adapter.
Figure 10.2 - Structure du design pattern Adapter
2. Participants
Les participants au design pattern Adapter sont les suivants :
-
Interface (DocumentInterface) expose la signature des méthodes indispensables à tout document.
-
Client interagit avec les objets se conformant à Interface.
-
Adaptateur (DocumentPdf) implémente les méthodes d’Interface en invoquant par délégation les méthodes de l’objet adapté.
-
Adapte (ComposantPdf) est la classe dont l’interface doit être adaptée pour correspondre à ce qu’exige Interface.
3. Collaborations
Le client invoque la méthode demande de l’adaptateur qui, en conséquence, interagit avec l’objet adapté en appelant la méthode accomplit. Ces collaborations sont illustrées à la figure 10.3.
Figure 10.3 - Diagramme de séquence du design pattern Adapter
Domaines d’application
Le design pattern Adapter est utilisé dans les cas suivants :
-
Pour intégrer dans un système un objet dont l’interface ne correspond pas à l’interface requise au sein de ce système.
-
Pour fournir des interfaces multiples à un objet lors de sa conception.
Exemple en PHP
Nous présentons le code source de l’exemple en PHP. Commençons par l’interface DocumentInterface :
<?php
declare(strict_types=1);
namespace ENI\DesignPatterns\Adapter;
interface DocumentInterface
{
public function setContenu(string $contenu): void;
public function dessiner(): void;
public function imprimer(): void;
}
La classe DocumentHtml est l’exemple de classe implémentant l’interface DocumentInterface.
<?php
declare(strict_types=1);
namespace ENI\DesignPatterns\Adapter;
class DocumentHtml implements DocumentInterface
{
protected string $contenu;
public function setContenu(string $contenu): void
{
$this->contenu = $contenu;
}
public function dessine(): void
{
echo "Dessine document HTML: $this->contenu" . PHP_EOL;
}
public function imprime(): void
{
echo "Imprime document HTML : $this->contenu" . PHP_EOL;
}
}
La classe ComposantPdf représente...