Visitor – Patrones de diseño
Antonio Leiva

El patrón de diseño Visitor es un patrón de diseño de software que permite agregar comportamientos nuevos a una estructura de objetos sin modificar las clases de los objetos individuales.

Esto se logra mediante la creación de una clase Visitor que contiene los nuevos comportamientos y la implementación de una interfaz en cada clase de la estructura de objetos que permita la visita del visitor.

En Kotlin, podemos implementar el patrón de diseño Visitor utilizando una clase sealed y las interfaces de visita.

Por ejemplo, supongamos que tenemos una estructura de objetos que representa una factura con diferentes elementos, como productos, impuestos y descuentos.

Podemos crear una clase sealed llamada Element que represente cada uno de estos elementos y una interfaz llamada Visitor que contenga los métodos de visita para cada uno de ellos:

sealed class Element {
    abstract fun accept(visitor: Visitor)
}

interface Visitor {
    fun visit(product: Product)
    fun visit(tax: Tax)
    fun visit(discount: Discount)
}

Luego, podemos crear las clases concretas que implementen la clase sealed Element y la interfaz Visitor para cada uno de los elementos de la factura:

class Product(val name: String, val price: Double) : Element() {
    override fun accept(visitor: Visitor) {
        visitor.visit(this)
    }
}

class Tax(val rate: Double) : Element() {
    override fun accept(visitor: Visitor) {
        visitor.visit(this)
    }
}

class Discount(val amount: Double) : Element() {
    override fun accept(visitor: Visitor) {
        visitor.visit(this)
    }
}

Por último, podemos crear una clase visitor concreta que implemente la interfaz «Visitor» y contenga los comportamientos deseados para cada uno de los elementos de la factura:

class InvoiceVisitor : Visitor {
    var total = 0.0

    override fun visit(product: Product) {
        total += product.price
    }

    override fun visit(tax: Tax) {
        total *= (1 + tax.rate)
    }

    override fun visit(discount: Discount) {
        total -= discount.amount
    }
}

De esta manera, podemos utilizar la clase InvoiceVisitor para calcular el total de la factura sin tener que modificar las clases de los elementos individuales. Por ejemplo:

val elements = listOf(
    Product("Laptop", 1000.0),
    Tax(0.15),
    Discount(100.0)
)

val visitor = InvoiceVisitor()

for (element in elements) {
    element.accept(visitor)
}

println("Total: ${visitor.total}") // Total: 915.0

En este ejemplo, la clase InvoiceVisitor recorre la lista de elementos y visita cada uno de ellos, aplicando los comportamientos deseados para calcular el total de la factura.

De esta manera, podemos agregar nuevos comportamientos a la estructura de objetos de la factura sin tener que modificar las clases de los elementos individuales.

Conclusión

En resumen, el patrón de diseño Visitor es una forma de agregar nuevos comportamientos a una estructura de objetos sin modificar las clases de los objetos individuales.

Esto se logra mediante la creación de una clase visitor que contiene los nuevos comportamientos y la implementación de una interfaz en cada clase de la estructura de objetos que permita la visita del visitor.

En Kotlin, podemos utilizar una clase sealed y las interfaces de visita para implementar el patrón de diseño Visitor de manera sencilla y eficiente.

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 *