El patrón de diseño Iterator
Descripción
El patrón de diseño Iterator proporciona un acceso secuencial a una colección de objetos a los clientes, sin que estos tengan que preocuparse de la implementación de esta colección.
Ejemplo
Queremos proporcionar un acceso secuencial a los vehículos que componen el catálogo. Para ello, podemos implementar en la clase del catálogo los siguientes métodos:
-
inicio: inicializa el recorrido por el catálogo.
-
item: devuelve el vehículo en curso.
-
siguiente: pasa al vehículo siguiente.
Esta técnica presenta dos inconvenientes:
-
Hace aumentar de manera inútil la clase catálogo.
-
Solo permite recorrer el catálogo una vez, lo cual puede ser insuficiente (en especial en el caso de aplicaciones multitarea).
El patrón de diseño Iterator proporciona una solución a este problema. La idea consiste en crear una clase Iterador donde cada instancia pueda gestionar un recorrido en una colección. Las instancias de esta clase Iterador las crea la clase colección, que se encarga de inicializarlas.
-
La clase Iterador incluye los métodos inicio, item y siguiente.
-
La clase Catalogo incluye el método Busqueda que crea, inicializa y devuelve una instancia de Iterador.
La figura 21.1 muestra el uso del patrón de diseño Iterator para recorrer los vehículos del catálogo que responden a una consulta.
Figura 21.1 - El patrón de diseño Iterator para acceder secuencialmente a catálogos de vehículos
Estructura
1. Diagrama de clases
La figura 21.2 detalla la estructura genérica del patrón de diseño Iterator, que es muy parecida al diagrama de clases de la figura 21.1.
Figura 21.2 - Estructura del patrón de diseño Iterator
2. Participantes
Los participantes del patrón de diseño Iterator son los siguientes:
-
Iterador es la clase que implementa la asociación del iterador con los elementos de la colección así como los métodos.
-
Coleccion (Catalogo) es la clase que implementa la asociación de la colección con los elementos y el método creaIterador (busca).
-
Elemento (AbstractElement) es la clase abstracta de los elementos de la colección.
-
ElementoConcreto (Vehiculo) es una subclase concreta de Elemento utilizada por Iterador y Coleccion.
3. Colaboraciones
El iterador guarda en memoria el objeto en curso en la colección. Es capaz de calcular el objeto siguiente del recorrido.
Dominios de aplicación
El patrón de diseño Iterator se utiliza en los casos siguientes:
-
Es necesario realizar un recorrido de acceso al contenido de una colección sin acceder a la representación interna de esta colección.
-
Debe ser posible gestionar varios recorridos de forma simultánea.
Ejemplo en PHP
Presentamos a continuación un ejemplo escrito en PHP del recorrido del catálogo de vehículos con ayuda de un iterador.
El código fuente de la clase abstracta AbstractElemento se muestra a continuación. Los elementos poseen una descripción. El método palabraClaveValida verifica si aparece cierta palabra clave en la descripción.
<?php
declare(strict_types=1);
namespace ENI\DesignPatterns\Iterator;
abstract class AbstractElemento
{
protected string $descripcion;
public function __construct(string $descripcion)
{
$this->descripcion = $descripcion;
}
public function palabraClaveValida(string $palabraClave): bool
{
return false !== strstr($this->descripcion, $palabraClave);
}
}
La subclase concreta Vehiculo incluye únicamente el método visualiza.
<?php
declare(strict_types=1);
namespace ENI\DesignPatterns\Iterator;
class Vehiculo extends AbstractElemento
{
public function visualiza(): void
{
echo...