Visitor Design Pattern

Embed Size (px)

Citation preview

  • 8/18/2019 Visitor Design Pattern

    1/22

     

    Ingeniería en TICs

    Materia

    Programación de Aplicaciones

    Profesor(a)

    Anastacio Rodriguez Garcia

    Unidad 3

    Patrón de Diseño Visitor

    Alumno

    Jesús Deanda Ortiz

    No. Control

    1213100085 

  • 8/18/2019 Visitor Design Pattern

    2/22

    Introducción 

    En programación orientada a objetos, el patrón visitor es una forma de separar el

    algoritmo de la estructura de un objeto.

    La idea básica es que se tiene un conjunto de clases elemento que conforman la

    estructura de un objeto. Cada una de estas clases elemento tiene un método aceptar

    (accept()) que recibe al objeto visitante (visitor) como argumento. El visitante es una

    interfaz que tiene un método visit diferente para cada clase elemento; por tanto habrá

    implementaciones de la interfaz visitor de la forma: visitorClase1, visitorClase2...

    visitorClaseN. El método accept de una clase elemento llama al método visit de su clase.

    Clases concretas de un visitante pueden entonces ser escritas para hacer una operación

    en particular.

    Cada método visit de un visitante concreto puede ser pensado como un método que no es

    de una sola clase, sino de un par de clases: el visitante concreto y clase elemento

    particular. Así el patrón visitor simula el envío doble (en inglés éste término se conoce

    como Double-Dispatch) en un lenguaje convencional orientado a objetos de envío único

    (Single-Dispatch), como son Java o C++.

    El patrón visitor también especifica cómo sucede la interacción en la estructura del objeto.

    En su versión más sencilla, donde cada algoritmo necesita iterar de la misma forma, el

    método accept de un elemento contenedor, además de una llamada al método visit delobjeto visitor, también pasa el objeto visitor como argumento al llamar al método accept

    de todos sus elementos hijos.

    Este patrón es ampliamente utilizado en intérpretes, compiladores y procesadores de

    lenguajes, en general.

  • 8/18/2019 Visitor Design Pattern

    3/22

    ContenidoVisitor Design Pattern ......................................................................................................................... 1

    Ejercicio ........................................................................................................................................... 2

    Creación del Proyecto ..................................................................................................................... 3

    Interfaz de Usuario .......................................................................................................................... 4

    Strings.xml ................................................................................................................................... 4

    activity_main.xml ........................................................................................................................ 5

    activity_result.xml ....................................................................................................................... 7

    fila.xml ......................................................................................................................................... 9

    Drawable ..................................................................................................................................... 9

    Patrón de Diseño ........................................................................................................................... 10

    Interfaz Visitable ....................................................................................................................... 10Clases Visitables ........................................................................................................................ 10

    Interfaz Visitor ........................................................................................................................... 12

    Clases Visitor ............................................................................................................................. 13

    Actividades Android ...................................................................................................................... 14

    MainActivity .............................................................................................................................. 14

    ResultActivity ............................................................................................................................. 16

    Pruebas .......................................................................................................................................... 19

  • 8/18/2019 Visitor Design Pattern

    4/22

    1

    Visitor Design PatternEjemplos del patrón.

      Método simple sin usar este patrón: supongamos un veterinario a domicilio, que con baseen al animal que tiene que curar sabe qué cura tiene que aplicar. Es responsabilidad del

    veterinario el saber de qué clase es el animal y sobre la base de ello aplicar la cura.

      Método usando el patrón: El veterinario no tiene que reconocer al animal ni saber qué cura

    aplicarle. Es el propio animal el que le dice al veterinario qué cura es más apropiada para

    él. El veterinario sólo "visita" al animal, y aplica la cura apropiada.

    Es un patrón de comportamiento, que permite definir una operación sobre objetos de una

     jerarquía de clases sin modificar las clases sobre las que opera. Representa una operación

    que se realiza sobre los elementos que conforman la estructura de un objeto.

      Visitante (Visitor): Declara una operación de visita para cada elemento concreto en la

    estructura de objetos, que incluye el propio objeto visitado

      Visitante Concreto (ConcreteVisitor1/2): Implementa las operaciones del visitante y

    acumula resultados como estado local

      Elemento (Element): Define una operación “Accept” que toma un visitante como

    argumento

      Elemento Concreto (ConcreteElementA/B): Implementa la operación “Accept” 

  • 8/18/2019 Visitor Design Pattern

    5/22

    2

    Ejercicio El propósito de esta aplicación es cotizar un viaje de 1 de 3 destinos diferentes:

      Dolores Hidalgo

      Paris

      Madrid

    Dentro de cada ciudad tú puedes visitar un máximo de 4 lugares:

      Parque

      Museo

      Zoológico

      Catedral

    Cada lugar se cotiza de manera diferente en base a la cantidad de personas dentro del

    paquete.

    El cálculo del costo del Zoológico de Madrid no es el mismo que el del Zoológico de Paris.

    Ejemplo.

    Zoológico de Madrid

    Incluir dentro del paquete, entradas al Zoologico de Madrid cuesta $1000.00 por cada boleto.

    Si se adquieren de 10 a 20 boletos, se ofrece un 25% de descuento al costo de cada boleto. Si

    se adquieren más de 20, se aplica un descuento del 40% al costo de cada boleto.

    5 boletos = 1000 * 5

    10 boletos = 1000*10*0.75

    25 boletos = 1000*25*0.75

    Zoológico de Paris

    Incluir dentro del paquete, entradas al Zoologico de Madrid cuesta $800.00 por cada boleto. Si

    se adquieren entre 6 y 15 boletos, se aplica un 10% de descuento al costo de cada boleto. Si

    se adquieren más de 15, se aplica un descuento del 30% al costo de cada boleto.

    5 boletos = 800* 5

    10 boletos = 800*10*0.90

    25 boletos = 800*25*0.70

    Con esto se pretende demostrar, que cada lugar se cotiza de manera de distinta en cada

    ciudad. 

  • 8/18/2019 Visitor Design Pattern

    6/22

    3

    Creación del Proyecto Crea un proyecto en Android Studio o Eclipse ADK, con el nombre Visitor.

     Android Studio

    Crea un proyecto en Android

    File -> New -> New Project

     Asigna el nombre de la aplicación como “Visitor” 

    Dominio asígnalo de esta manera

    (Tu Nombre y tu Apellido).utng.edu.mx

    Selecciona la ubicación donde deseas alojar tu proyecto.

    Presiona Next.

    Mantén la configuración por defecto, para ello presiona Next hasta que Finish este habilitado.

  • 8/18/2019 Visitor Design Pattern

    7/22

    4

    Interfaz de Usuario

    Strings.xml

    String es el archivo XML, donde se pueden almacenar cadenas y arreglos de cadenas (colecciones),

    los cuales se pueden asignar como valores a los componentes de un Layout.

    El siguiente código XML describe las cadenas y arreglos de cadenas (string-array) empleados en al

    app.

    Dentro de tu proyecto, modifica el archivo strings.xml que se encuentra en res -> values ->

    strings.xml, reemplazando su contenido por el siguiente:

    Importancia de los string-array dentro de la aplicación.

    El código anterior agrega dos colecciones o listados de datos, el string array “ciudades” almacena

    el nombre de las ciudades que se pueden escoger en un paquete de viaje mientras que el strang-

    array “lugares” contiene un listado de los lugares dentro de las ciudades que se pueden visitar. 

    Su función dentro de la aplicación es fundamental, ya que al ser colecciones de datos permiten

    poblar o llenar componentes como los spinners y las ListViews.

    Su orden afecta al código de la app, existen puntos de decisión dentro del algoritmo en los que se

    trabaja con directamente con el índice de los arreglos. No será el mismo resultado escoger como

    destino a Dolores Hidalgo que a Madrid. Por lo que es importante que el orden de los arreglos sea

    igual al mostrado arriba.

  • 8/18/2019 Visitor Design Pattern

    8/22

    5

    activity_main.xml 

    Esta es la interfaz de la actividad principal cuenta con elementos como scrollView. Spinner, EditText, ListView, TextView yButton.Se pretende que el usuario elija una ciudad del spinner, introduzca el número de personas en el EditText, seleccione loslugares a visitar en el ListView y que al presionar el botón se ejecuten las operaciones.No te preocupes, te facilitaré el código XML de esta pantalla. Te pido de favor que la analices por un momento y puedasdigerir su estructura,

  • 8/18/2019 Visitor Design Pattern

    9/22

    6

    Código activity_main.xml

  • 8/18/2019 Visitor Design Pattern

    10/22

    7

    activity_result.xml

    El propósito de esta pantalla es el de mostrar el nombre de la ciudad elegida, una imagen de

    la ciudad, la lista de los lugares seleccionados, la cantidad de personas que van a viajar y el

    total a pagar por el viaje. Para ello se emplean elementos como TextViews, ListView y

    ImageView y el archivo fila.xml para representar el nombre de cada lugar y el costo del mismo.

  • 8/18/2019 Visitor Design Pattern

    11/22

    8

    Código activity_result.xml

     

  • 8/18/2019 Visitor Design Pattern

    12/22

    9

    fila.xml

    Este XML es de apoyo para pantalla Activity_result.xml, ya que se espera que los elementos

    TextView de esta pantalla, aparezcan en el ListView tantas veces como lugares se hayan

    seleccionado.

    Drawable

    Copiar las siguientes imágenes, una por una, que se encuentran en Tutorial_Visitor ->

    Imágenes:

      dh.jpeg

      madrid.jpeg

      paris.jpeg

    En la carpeta res -> Drawable

  • 8/18/2019 Visitor Design Pattern

    13/22

    10

    Patrón de Diseño

    Interfaz Visitable

    Crea la interfaz Visitable, la cual proveerá de una representación del método aceptar, el cual

    recibirá como parámetro un objeto de tipo Visitor. Aun no contamos con ninguna clase ni interfaz

    del tipo Visitor. Por lo que no es de preocuparse que salte un error indicando que no se reconocela palabra Visitor.

    Clases Visitables

    Las clases visitables son todas aquellas que implementan la interfaz Visitable. Cada clase cuenta

    con atributo cantidad, un accesor para dicho atributo, un método sobreescrito Aceptar

    implementado de la interfaz y un constructor que recibe como parámetro la cantidad de personas.

    Crea las siguientes Clases

      Parque

      Museo

      Catedral

      Zoológico

    Ejemplo:

    Prácticamente la estructura es la misma, la única diferencia entre las clases es su constructor. Te resultará fácilcrearlas.

  • 8/18/2019 Visitor Design Pattern

    14/22

    11

    Clase Ciudad

    Esta clase es un punto clave dentro de nuestra aplicación. Como tal, una ciudad también es

    un lugar y por lo tanto también es visitable. La diferencia con las demás clases Visitables, es

    que una ciudad está compuesta por otros lugares Visitables. Por lo que se adiciona una Lista

    de Arreglos de tipo Visitable y accesor a la misma. El constructor también recibe como

    parámetro la cantidad de personas que lo van a visitar, pero además recibe la lista de lugares

    a visitar dentro de la ciudad.

    Por lo que al hacer una nueva instancia de un objeto ciudad, puedes asignar un número n de

    personas y un conjunto n de lugares a visitar.

    Implementa los métodos de la interfaz

  • 8/18/2019 Visitor Design Pattern

    15/22

    12

    Interfaz Visitor

    Esta interfaz emplea como recurso primordial la sobrecarga de métodos, el cual consiste en un

    conjunto de métodos con el mismo nombre pero con diferente cantidad y tipo de parámetros. En

    la interfaz visitor se puede visualizar el método visualizar, el cual retorna un valor del tipo double.

    Cada uno de estos métodos tiene un parámetro distinto, un objeto Visitable diferente.

    Crea la interfaz Visitor la cual proveerá los métodos Visitar para cada una de las clases Visitables.

  • 8/18/2019 Visitor Design Pattern

    16/22

    13

    Clases Visitor

    Estas clases implementan la interfaz Visitor. Cada

    una ellas, hará una operación única de acuerdo al

    tipo de objeto recibido como parámetro. Las

    operaciones de un visitor de Madrid serán

    diferentes al de un visitor de Paris.

    Los métodos visitar con parámetro del tipo

    Parque, Catedral, Zoológico y Museo retornan un

    valor de acuerdo a la cantidad de visitantes.

    Importante!,  el método con parámetro del tipo

    Ciudad, hará una iteración por cada uno de los

    lugares que componen la ciudad y sumará el

    resultado del método visitar de cada uno de los

    lugares. Retornando el total de esta suma.

      VisitorDolores

      VisitorMadrid

      VisitorParis

    Ejemplo:

    Te invito a que generes tus propias

    promociones para Madrid y Paris!, lo único que

    tienes que hacer es modificar los métodosvisitar de las clases VisitorMadrid y VisitorParis.

    Puedes usar VisitorDolores como referencia

    para hacer este paso.

  • 8/18/2019 Visitor Design Pattern

    17/22

    14

     Actividades Android

    MainActivity

    Realiza los siguientes imports y declaración de los distintos componentes que conforman el

    documento activity_main.xml. Esta clase implementará OnClickListener para aplicarlo como

    escuchador de clics en el botón btnCotizar.

  • 8/18/2019 Visitor Design Pattern

    18/22

    15

    Modifica el método OnCreate de la siguiente manera.

    Modifica el método onClick (btnCotizar) de la siguiente manera.

  • 8/18/2019 Visitor Design Pattern

    19/22

    16

    ResultActivity

    Actividad que procesa los parametros recibidos por la actividad MainActivity. Cada uno de los

    lugares que componen la ciudad, son representados dentro de un listview, donde desplegan

    individualmente el costo de la visita. Entonces cada lugar ejecuta el método aceptar para

    desplegar el monto a pagar por la visita a ese lugar de acuerdo a la cantidad de personas. El

    resultado total es representado por la ejecución del método aceptar del objeto Ciudad, por lo que

    traerá el total de cada uno de los lugares que lo componen.

    Realiza los siguientes imports y declaraciones de componentes androids y variables.

  • 8/18/2019 Visitor Design Pattern

    20/22

    17

    Modifica el método.

    Agrega el método getVisitor

  • 8/18/2019 Visitor Design Pattern

    21/22

    18

    Agrega el método getLugar

    Agrega el método hacerAdaptador

  • 8/18/2019 Visitor Design Pattern

    22/22

    19

    Pruebas

    1.  Ejecuta la aplicación.

    2.  Selecciona una ciudad

    3.  Asigna el número de personas

    4.  Selecciona los lugares a visitar

    5.  Da click en cotizar.