El patrón de diseño Decorator es un patrón estructural que permite agregar nuevas funcionalidades a un objeto de manera dinámica sin alterar su estructura original. Este patrón utiliza una composición en lugar de herencia, permitiendo añadir responsabilidades adicionales a un objeto en tiempo de ejecución al envolverlo dentro de clases decoradoras.
En esencia, el patrón Decorator delega la funcionalidad al objeto original y, al mismo tiempo, añade sus propias capacidades. Este enfoque es útil cuando necesitamos extender el comportamiento de ciertas clases sin modificar su código base.
El patrón Decorator es especialmente útil en los siguientes escenarios:
Extender funcionalidades sin modificar la clase original o afectar a otras instancias de la misma clase.
Sustituir la herencia en situaciones donde agregar nuevas funcionalidades mediante subclases podría generar una jerarquía de clases muy compleja.
Agregar comportamientos dinámicos que pueden ser aplicados de forma selectiva y en tiempo de ejecución.
Cuando se trabaja con frameworks o librerías en las que no es posible modificar el código fuente de las clases existentes.
Un ejemplo común de uso es en sistemas de interfaz de usuario (UI), donde se pueden agregar bordes, sombreados o rellenos a componentes visuales sin alterar sus clases base.
Flexibilidad: Permite combinar comportamientos de forma modular, evitando las limitaciones de una jerarquía de herencia fija.
Abierto para extensión, cerrado para modificación: Siguiendo el principio de diseño SOLID, este patrón evita modificar la clase original para agregar nuevas funcionalidades.
Reutilización: Los decoradores pueden ser reutilizados de manera independiente para agregar funcionalidades a distintos objetos.
Simplicidad: Se pueden añadir o quitar funcionalidades sin necesidad de alterar código existente.
A continuación, se presenta un ejemplo del patrón Decorator implementado en PHP:
Componente
{
public function operacion(): string;
}
// Clase concreta que implementa la interfaz base
class ComponenteConcreto implements Componente
{
public function operacion(): string
{
return "Componente base";
}
}
// Clase base para los decoradores
class DecoradorBase implements Componente
{
protected Componente $componente;
public function __construct(Componente $componente)
{
$this->componente = $componente;
}
public function operacion(): string
{
return $this->componente->operacion();
}
}
// Decorador concreto que agrega funcionalidad
class DecoradorA extends DecoradorBase
{
public function operacion(): string
{
return parent::operacion() . " + Funcionalidad A";
}
}
// Otro decorador concreto
class DecoradorB extends DecoradorBase
{
public function operacion(): string
{
return parent::operacion() . " + Funcionalidad B";
}
}
// Uso del patrón Decorator
$componente = new ComponenteConcreto();
// Envolvemos el componente con DecoradorA
$decoradoA = new DecoradorA($componente);
// Envolvemos el resultado con DecoradorB
$decoradoB = new DecoradorB($decoradoA);
// Ejecutamos la operación
echo $decoradoB->operacion(); // Resultado: "Componente base + Funcionalidad A + Funcionalidad B"
En este ejemplo, la clase ComponenteConcreto
representa el objeto base al que se le pueden agregar nuevas funcionalidades mediante los decoradores DecoradorA
y DecoradorB
. Los decoradores heredan de DecoradorBase
, que implementa la interfaz Componente
.
El resultado es un sistema modular y extensible en el que se pueden combinar los decoradores según sea necesario.
El patrón Decorator es una herramienta poderosa para diseñar sistemas de software flexibles y escalables. Su capacidad de agregar funcionalidades de manera dinámica y selectiva lo convierte en una opción ideal para proyectos en los que la extensibilidad y la modularidad son esenciales.
Si quieres ver más ejemplos del Patrón de Diseño Decorator (o de otros patrones) en PHP, puedes consultar este repositorio:
Esta web se reserva el derecho de suprimir, por cualquier razón y sin previo aviso, cualquier contenido generado en los espacios de participación en caso de que los mensajes incluyan insultos, mensajes racistas, sexistas... Tampoco se permitirán los ataques personales ni los comentarios que insistan en boicotear la labor informativa de la web, ni todos aquellos mensajes no relacionados con la noticia que se esté comentando. De no respetarse estas mínimas normas de participación este medio se verá obligado a prescindir de este foro, lamentándolo sinceramente por todos cuantos intervienen y hacen en todo momento un uso absolutamente cívico y respetuoso de la libertad de expresión.
No hay opiniones. Sé el primero en escribir.