Descarga la aplicación para disfrutar aún más
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.
Compartir