Biblioteca Online : ¡La Suscripción ENI por 9,90 € el primer mes!, con el código PRIMER9. 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 Visitor
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 Visitor

Descripción

El patrón de diseño Visitor define una operación que debe realizarse sobre los elementos de un conjunto de objetos. Esto permite agregar nuevas operaciones sin modificar las clases de estos objetos.

Ejemplo

Consideremos la figura 28.1 que describe los clientes de nuestro sistema organizados bajo la forma de objetos compuestos según el patrón de diseño Composite. A excepción del método agregaFilial, específico a la gestión de la composición, las dos subclases poseen dos métodos con el mismo nombre: calculaCosteEmpresa y enviaEmailComercial. Cada uno de estos métodos se corresponde con una funcionalidad cuya implementación está bien adaptada en función de la clase. Podrían implementarse muchas otras funcionalidades como, por ejemplo, el cálculo de la cifra de negocios de un cliente (incluyendo o no sus filiales), etc.

En el diagrama, el cálculo del coste del mantenimiento no está detallado. El detalle se encuentra en el capítulo dedicado al patrón de diseño Composite

Este enfoque puede utilizarse siempre y cuando el número de funcionalidades sea pequeño. En cambio, si se vuelve más importante, obtendremos clases con muchos métodos, difíciles de mantener. Además, estas funcionalidades darán lugar a métodos (calculaCosteEmpresa y enviaEmailComercial) sin relación entre ellos y sin relación entre el núcleo de los objetos con la diferencia, por ejemplo, del método agregaFilial que contribuye a componer los objetos.

images/p286.png

Figura 28.1 - Múltiples...

Estructura

1. Diagrama de clases

La figura 28.3 detalla la estructura genérica del patrón de diseño Visitor.

images/17.png

Figura 28.3 - Estructura del patrón de diseño Visitor

2. Participantes

Los participantes del patrón de diseño Visitor son los siguientes:

  • Visitante (VisitanteInterfaz) es la interfaz que contiene la firma de los métodos que realizan una funcionalidad en un conjunto de clases. Existe un método para cada clase que recibe como argumento una instancia de esta clase.

  • VisitanteConcreto1 y VisitanteConcreto2 (VisitanteCalculoCosteEmpresa y VisitanteMailingComercial) implementan los métodos que realizan la funcionalidad correspondiente a la clase.

  • Elemento (AbstractEmpresa) es una clase abstracta superclase de las clases de elementos. Incluye el método abstracto aceptaVisitante que recibe un visitante como argumento.

  • ElementoConcreto1 y ElementoConcreto2 (EmpresaSinFilial y EmpresaMatriz) implementan el método aceptaVisitante que consiste en volver a llamar al visitante a través del método correspondiente de la clase.

3. Colaboraciones

Un cliente que utiliza un visitante debe en primer lugar crearlo como instancia de la clase de su elección y, a continuación, pasarlo como argumento al método aceptaVisitante de un conjunto de elementos.

El elemento vuelve a llamar al método del visitante que se corresponde con su clase. Le pasa una referencia hacia...

Dominios de aplicación

El patrón de diseño Visitor se utiliza en los casos siguientes:

  • Es necesario agregar numerosas funcionalidades a un conjunto de clases sin volverlas pesadas.

  • Un conjunto de clases posee una estructura fija y es necesario agregarles funcionalidades sin modificar su interfaz.

Si la estructura del conjunto de clases a las que es necesario agregar funcionalidades cambia a menudo, el patrón de diseño Visitor no se adapta bien. En efecto, cualquier modificación de la estructura implica una modificación de cada visitante, lo cual puede resultar costoso.

Ejemplo en PHP

Retomamos el ejemplo de la figura 28.2. A continuación se muestra el código de la clase AbstractEmpresa escrita en PHP. El método aceptaVisitante es abstracto pues su código dependerá de la subclase que implemente.

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Visitor; 
 
abstract class AbstractEmpresa 
{ 
   protected string $nombre; 
 
   protected string $email; 
 
   protected string $direccion; 
 
   public function __construct(string $nombre, string $email, string 
$direccion) 
   { 
       $this->nombre = $nombre; 
       $this->email = $email; 
       $this->direccion = $direccion; 
   } 
 
   public function getNombre(): string 
   { 
       return $this->nombre; 
   } 
 
   protected function setNombre(string $nombre): void 
   { 
       $this->nombre = $nombre; 
   } 
 
   public function getEmail(): string 
   { 
       return $this->email; 
   } 
 
   protected function setEmail(string $email): void 
   { 
       $this->email = $email; 
   } 
 
   public function getDireccion(): string 
   { 
       return $this->direccion; ...