¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Design Patterns en PHP
  3. El patrón de diseño Iterator
Extrait - Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición)
Extractos del libro
Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición) Volver a la página de compra del libro

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.

images/12.png

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.

images/13.png

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