Está en la página 1de 12

VISITOR

• Se debe utilizar este patrón si se quiere


realizar un cierto número de operaciones,
que no están relacionadas entre sí, sobre
instancias de un conjunto de clases, y no
se quiere “contaminar” a dichas clases.
• Busca separar un algoritmo de la
estructura de un objeto. La operación se
implementa de forma que no se modifique
el código de las clases sobre las que
opera.

DISEÑO DE SISTEMAS
VISITOR: ESTRUCTURA

DISEÑO DE SISTEMAS
VISITOR
En Argentina todos los productos pagan IVA.
Algunos productos poseen tasa reducida.

class Patron Visitor

Visitor Visitable

+ visit(ProductoNormal) + Accept(Visitor)
+ visit(ProductoDescuento)

IVA

+ visit(ProductoNormal) : double
+ visit(ProductoDescuento) : double ProductoDescuento ProductoNormal

+ setprecio() : void + setprecio() : void


+ getprecio() : void + getprecio() : void
+ accept(visitor) : double + accept(visitor) : double

DISEÑO DE SISTEMAS
VISITOR
El método accept del
producto será el
responsable de
ejecutar al visit

La clase que
implementa el
visitor lo hace para
todas las clases
visitables
5
VISITOR
Revisemos esta porción de código para
terminar de entender el uso del patrón

El objetivo es calcular el precio de


determinado producto incluyendo su IVA 6
VISITOR
1. Se crean los productos
obj ect Patron Visitor 2

Producto1: ProductoDescuento Producto2: ProductoNormal


- precio: int = 100 - precio: int = 100

2. Se crea un objeto IVA


obj ect Patron Visitor 2

iv a: IVA

3. Ejecución de método producto1.accept(iva) 7


VISITOR
Si revisamos el método accept del producto1
(o sea de la clase ProductoDescuento) su
código era:

O sea ejecutamos el método visit de la clase


visitor pasándole como parámetro a sí mismo
(o sea, el producto1 –objeto de clase
ProductoDescuento-)

La clase que implementa a la clase visitor es


IVA 8
VISITOR

Si ejecutamos el método visit correspondiente


entonces estamos haciendo:

Ya sabemos que impuestoReducido es


constante con valor 1,105
9
VISITOR

Nos falta obtener reducido.getPrecio o sea el


método getPrecio del objeto que habíamos
pasado como parámetro

Si el parámetro era un producto de tipo


ProductoDescuento, debemos buscar el
getPrecio en la clase ProductoDescuento

Con el valor que nos devuelve allí (en nuestro


caso 100) lo multiplicamos por 1,105 y listo.

10
VISITOR

Conclusión:

Cuando se modifiquen las reglas del IVA sólo


cambio 1 clase y no tengo que modificar cada
clase que requiere el cálculo de IVA

11
VISITOR

• Facilita la inclusión de nuevas


operaciones.
• Agrupa las operaciones relacionadas entre
sí.
• La inclusión de nuevos ElementsConcrets
(tipos de producto en nuestro caso) es una
operación costosa.

DISEÑO DE SISTEMAS

También podría gustarte