Decorator – Patrones de Diseño
Antonio Leiva

El patrón de diseño Decorator es uno de los patrones estructurales más utilizados en la programación orientada a objetos.

Este patrón permite agregar funcionalidades adicionales a un objeto de forma dinámica, sin necesidad de crear subclases para cada combinación de funcionalidades.

En Kotlin, el patrón Decorator se implementa mediante la creación de una interfaz que define la funcionalidad base del objeto a decorar, y una clase base que implementa esta interfaz y que servirá como punto de partida para crear las decoraciones.

Las decoraciones son clases que implementan la misma interfaz que el objeto base, y que contienen una referencia a un objeto de la clase base.

Por ejemplo, imagina que queremos crear una aplicación que permita a los usuarios comprar pizzas con diferentes ingredientes.

Para ello, podemos crear una interfaz Pizza que define la funcionalidad básica de una pizza, como su tamaño y su precio, y una clase base PizzaBase que implementa esta interfaz y que representa una pizza básica sin ingredientes adicionales.

interface Pizza {
    val size: Int
    val price: Double
}

class PizzaBase(override val size: Int) : Pizza {
    override val price: Double
        get() = 10.0 * size
}

Luego, podemos crear las diferentes decoraciones para agregar ingredientes a la pizza. Por ejemplo, una clase PepperoniPizzaDecorator que agrega pepperoni a la pizza y aumenta su precio en 2 dólares.

class PepperoniPizzaDecorator(private val pizza: Pizza) : Pizza {
    override val size: Int
        get() = pizza.size
    override val price: Double
        get() = pizza.price + 2
}

De esta forma, podemos crear una pizza de tamaño mediano con pepperoni de la siguiente manera:

val pizza = PepperoniPizzaDecorator(PizzaBase(size = 2))
println(pizza.price) // imprime 14.0

Además, podemos crear combinaciones de ingredientes creando decoraciones que a su vez contengan otras decoraciones.

Por ejemplo, una clase ExtraCheesePizzaDecorator que agrega queso extra a la pizza y aumenta su precio en 1 dólar.

class ExtraCheesePizzaDecorator(private val pizza: Pizza) : Pizza {
    override val size: Int
        get() = pizza.size
    override val price: Double
        get() = pizza.price + 1
}

De esta forma, podemos crear una pizza de tamaño grande con pepperoni y extra queso de la siguiente manera:

val pizza = ExtraCheesePizzaDecorator(PepperoniPizzaDecorator(PizzaBase(size = 3)))
println(pizza.price) // imprime 17.0

Como se puede ver, el patrón Decorator nos permite agregar funcionalidades adicionales a un objeto de forma dinámica y sin necesidad de crear subclases para cada combinación posible.

Esto nos permite mantener un código limpio y fácil de extender en el futuro.

En resumen, el patrón Decorator es una herramienta muy útil en la programación orientada a objetos, y en Kotlin podemos implementarlo de forma sencilla utilizando interfaces y clases.

Quizá también te interese…

Las reglas FIRST de los tests

Las reglas FIRST de los tests

Las reglas FIRST son un conjunto de principios que se utilizan para diseñar y escribir tests de software de manera efectiva. Las siglas FIRST significan: F - Fast: Un test debe ser rápido de ejecutar. I - Independent: Un test debe ser independiente de otros tests y...

¿Qué son los dobles de test?

¿Qué son los dobles de test?

Los dobles de prueba (también conocidos como "doubles" o "fakes") son herramientas comunes en la programación y en particular en el testing de software. Se utilizan para simular el comportamiento de una dependencia de una aplicación en un entorno de pruebas, sin tener...

Kata del TicTacToe en Kotlin

Kata del TicTacToe en Kotlin

Escribe el código para representar una entidad que almacene el tablero de juego del 3 en raya, y que además tenga: Un método move() con 2 parámetros, fila y columna, que permita añadir un movimiento al tablero Un método findWinner(), que devuelva el ganador (X, Y o...

0 comentarios

Enviar un comentario

Los datos personales que proporciones a través de este formulario quedarán registrados en un fichero de DevExpert, S.L.U., con el fin de gestionar los comentarios que realizas en este blog. La legitimación se realiza a través del consentimiento de la parte interesada. Si no se acepta, no podrás comentar en este blog. Los datos que proporciona solo se utilizan para evitar el correo no deseado y no se usarán para nada más. Puede ejercer los derechos de acceso, rectificación, cancelación y oposición en contacto@devexperto.com.

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acepto la política de privacidad *