Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Design Patterns en PHP
  3. Le design pattern Adapter
Extrait - Design Patterns en PHP Les 23 modèles de conception : descriptions et solutions illustrées en UML2 et PHP (2e édition)
Extraits du livre
Design Patterns en PHP Les 23 modèles de conception : descriptions et solutions illustrées en UML2 et PHP (2e édition)
1 avis
Revenir à la page d'achat du livre

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.

Structure 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.

Diagramme de séquence du design pattern Adapter

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...