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

Description

Le design pattern Iterator fournit un accès séquentiel à une collection d’objets. Les détails de l’implémentation de cet itérateur sont inconnus du client.

Exemple

Nous voulons donner un accès séquentiel aux véhicules composant le catalogue. Pour cela, nous pouvons implémenter dans la classe du catalogue les méthodes suivantes :

  • début : initialise le parcours du catalogue.

  • item : renvoie le véhicule courant.

  • suivant : passe au véhicule suivant.

Cette technique présente deux inconvénients :

  • Elle fait grossir inutilement la classe du catalogue.

  • Elle ne permet qu’un seul parcours à la fois, ce qui peut être insuffisant (notamment dans le cas d’applications multitâches).

Le design pattern Iterator propose une solution à ce problème. L’idée est de créer une classe Iterateur dont chaque instance peut gérer un parcours dans une collection. Les instances de cette classe Iterateur sont créées par la classe de collection qui se charge de les initialiser.

La classe Iterateur comporte les méthodes debut, item et suivant.

La classe Catalogue possède la méthode recherche qui crée, initialise et retourne une instance de Iterateur.

La figure 21.1 montre l’utilisation du design pattern Iterator pour parcourir les véhicules du catalogue qui répondent à une requête.

Le design pattern Iterator pour accéder séquentiellement à des catalogues de véhicules

Figure 21.1 - Le design pattern Iterator pour accéder séquentiellement à des catalogues de véhicules

Structure

1. Diagramme de classes

La figure 21.2 détaille la structure générique du design pattern Iterator, qui est très proche du diagramme des classes de la figure 21.1.

Structure du design pattern Iterator

Figure 21.2 - Structure du design pattern Iterator

2. Participants

Les participants au design pattern Iterator sont les suivants :

  • Itérateurest la classe qui implémente l’association de l’itérateur avec les éléments de la collection ainsi que les méthodes.

  • Collection (Catalogue) est la classe qui implémente l’association de la collection avec les éléments et la méthode creeIterateur (recherche).

  • Element (AbstractElement) est la classe abstraite des éléments de la collection.

  • ElementConcret (Vehicule) est une sous-classe concrète de Element utilisée par Iterateur et Collection.

3. Collaborations

L’itérateur garde en mémoire l’objet courant dans la collection. Il est capable de calculer l’objet suivant du parcours.

Domaines d’application

Le design pattern Iterator est utilisé dans les cas suivants :

  • Un parcours d’accès au contenu d’une collection doit être réalisé sans accéder à la représentation interne de cette collection.

  • Il doit être possible de gérer plusieurs parcours simultanément.

Exemple en PHP

Nous présentons l’exemple en PHP du parcours du catalogue de véhicules à l’aide d’un itérateur.

Le code source de la classe abstraite AbstractElement se trouve à la suite. Les éléments possèdent une description. La méthode motCleValide vérifie l’appartenance d’un mot-clé à la description.

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Iterator; 
 
abstract class AbstractElement 
{ 
   protected string $description; 
 
   public function __construct(string $description) 
   { 
       $this->description = $description; 
   } 
 
   public function motCleValide(string $motCle): bool 
   { 
       return false !== strstr($this->description, $motCle); 
   } 
} 

La sous-classe concrète Vehicule abrite uniquement la méthode affiche.

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Iterator; 
 
class Vehicule extends AbstractElement 
{ 
   public function affiche(): void 
   { 
       echo "Description du véhicule : $this->description" . PHP_EOL; ...