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