Logo Studenta

Qué es el patrón de diseño Decorator y cuándo se utiliza en

¡Estudia con miles de materiales!

Vista previa del material en texto

¿Qué es el patrón de diseño Decorator y cuándo se utiliza en PHP? 
 
El patrón de diseño Decorator (decorador) es un patrón de diseño estructural que permite 
agregar funcionalidades adicionales a un objeto de manera dinámica, sin modificar su 
estructura básica. El decorador proporciona una forma flexible de extender la funcionalidad 
de un objeto en tiempo de ejecución mediante la composición de objetos. 
 
**¿Cómo funciona el patrón de diseño Decorator?** 
En lugar de modificar directamente la clase del objeto original, el decorador crea una serie 
de clases envoltorio (wrapper) que implementan la misma interfaz que el objeto original. 
Cada envoltorio (decorador) agrega una funcionalidad específica y luego pasa la llamada a 
los métodos del objeto original para que realice su comportamiento base. De esta manera, 
se pueden encadenar múltiples decoradores para añadir funcionalidades adicionales en 
cualquier orden. 
 
**¿Cuándo se utiliza el patrón de diseño Decorator en PHP?** 
El patrón de diseño Decorator es útil en situaciones en las que necesitas extender la 
funcionalidad de un objeto de forma dinámica, sin afectar a su estructura o a otras partes 
del código. Se utiliza especialmente en los siguientes casos: 
 
1. **Extensiones de funcionalidad selectiva:** Cuando tienes una clase con múltiples 
variantes de funcionalidad, pero no quieres crear una subclase para cada combinación 
posible, puedes usar decoradores para agregar funcionalidades selectivamente según las 
necesidades. 
 
2. **Múltiples combinaciones de funcionalidad:** Cuando necesitas combinar diferentes 
características de una manera flexible, los decoradores permiten agregarlas de forma 
modular y combinarlas a voluntad. 
 
3. **Responsabilidades específicas:** Si deseas separar diferentes responsabilidades en 
clases distintas, puedes usar decoradores para asignar cada responsabilidad a un envoltorio 
específico. 
 
**Ejemplo de implementación en PHP:** 
Supongamos que tenemos una interfaz `Repositorio` que define los métodos básicos para 
acceder a una base de datos, y queremos agregar funcionalidad de almacenamiento en 
caché y registro de logs de consultas sin modificar la clase original. 
 
```php 
interface Repositorio { 
 public function obtenerDatos($id); 
} 
 
class RepositorioBase implements Repositorio { 
 public function obtenerDatos($id) { 
 // Lógica para obtener datos de la base de datos 
 return "Datos para el ID: $id"; 
 } 
} 
 
class CachearConsultaDecorator implements Repositorio { 
 private $repositorio; 
 
 public function __construct(Repositorio $repositorio) { 
 $this->repositorio = $repositorio; 
 } 
 
 public function obtenerDatos($id) { 
 // Lógica para almacenar en caché las consultas antes de llamar al repositorio base 
 $cacheKey = "datos_$id"; 
 if (!Cache::has($cacheKey)) { 
 $data = $this->repositorio->obtenerDatos($id); 
 Cache::put($cacheKey, $data, 3600); 
 } 
 return Cache::get($cacheKey); 
 } 
} 
 
class RegistrarLogDecorator implements Repositorio { 
 private $repositorio; 
 
 public function __construct(Repositorio $repositorio) { 
 $this->repositorio = $repositorio; 
 } 
 
 public function obtenerDatos($id) { 
 // Lógica para registrar el log antes de llamar al repositorio base 
 Log::info("Consulta para obtener datos con ID: $id"); 
 return $this->repositorio->obtenerDatos($id); 
 } 
} 
 
// Uso de los decoradores 
$repositorioBase = new RepositorioBase(); 
$repositorioConCache = new CachearConsultaDecorator($repositorioBase); 
$repositorioConCacheYLog = new RegistrarLogDecorator($repositorioConCache); 
 
$datos = $repositorioConCacheYLog->obtenerDatos(123); 
``` 
 
En este ejemplo, tenemos una clase base `RepositorioBase` que implementa la interfaz 
`Repositorio` y proporciona una funcionalidad básica para obtener datos de la base de 
datos. Luego, creamos dos decoradores, `CachearConsultaDecorator` y 
`RegistrarLogDecorator`, que agregan las funcionalidades de almacenamiento en caché y 
registro de logs, respectivamente. 
 
Al final, podemos encadenar los decoradores para obtener un objeto `Repositorio` que tiene 
todas las funcionalidades combinadas. El resultado es que obtendremos los datos de la base 
de datos, se almacenarán en caché y se registrará un log de la consulta realizada. 
 
El patrón de diseño Decorator nos permite extender la funcionalidad de objetos de manera 
flexible y modular, lo que es especialmente útil cuando necesitamos añadir características 
de forma dinámica y selectiva a nuestros objetos.

Continuar navegando