diseño de software basado en patrones · patrones de diseño • en abril de 1994 el libro ^design...

100
Diseño de Software Basado en Patrones César Julio Bustacara M.

Upload: tranthu

Post on 29-Sep-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Diseño de Software Basado en

Patrones

César Julio Bustacara M.

Patrones de Diseño

Introducción

• Las Tecnologías Orientadas a Objetos son las más utilizadas en los últimos años para el desarrollo de aplicaciones software.

• Se ha comprobado como este paradigma de programación presenta muchas ventajas.

Introducción

• Uno de los objetivos que se buscan al utilizar esta técnica es conseguir la reutilización. Entre los beneficios que se consiguen con la reutilización están: – Reducción de tiempos.

– Disminución del esfuerzo de mantenimiento.

– Eficiencia.

– Consistencia.

– Fiabilidad.

– Protección de la inversión en desarrollos.

Introducción

• Entre los diferentes mecanismos de reutilización están:

– Componentes: elemento de software suficientemente pequeño para crearse y mantenerse pero suficientemente grande para poder utilizarse.

– Frameworks: bibliotecas de clases preparadas para la reutilización que pueden utilizar a su vez componentes.

– Objetos distribuidos: paradigma que distribuye los objetos de cooperación a través de una red heterogénea y permite que los objetos interoperen como un todo unificado.

– Patrones de diseño

Patrones de Diseño

• Los patrones como elemento de la reutilización, comenzaron a utilizarse en la arquitectura con el objetivo de reutilizar diseños que se habían aplicado en otras construcciones y que se catalogaron como completos.

Patrones de Diseño

• Christopher Alexander da la siguiente definición de patrón:

“Cada patrón describe un problema que ocurre una y otra vez en nuestro entorno, para describir después el núcleo de la solución a ese problema, de tal manera que esa solución pueda ser usada más de un millón de veces sin hacerlo ni siquiera dos veces de la misma forma”.

Patrones de Diseño • En 1987, Ward Cunningham y Kent Beck trabajaron con Smaltalk y

diseñaron interfaces de usuario. Decidieron, para ello, utilizar alguna de las ideas de Alexander para desarrollar un lenguaje pequeño de patrones para servir de guía a los programadores de Smaltalk. Así dieron lugar al libro “Using Pattern Languajes for Object-Oriented Programs”.

• Poco después, Jim Coplien comenzó a realizar un catálogo de idioms (que son un tipo de patrones) en C++ y publica su libro “Advanced C++ Programming Styles and Idioms” en 1991.

• Desde 1990 a 1994, Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides (el grupo de los cuatro) realizaron un primer catálogo de patrones de diseño. Posteriormente hubo diferentes discusiones a cerca de los patrones en las que participaron notables personalidades de los patrones.

Patrones de Diseño

• En Abril de 1994 el libro “Design Patterns: Elements of Reusable Object- Oriented Software” (Gang of Four, [GoF]) es publicado.

• En 1997 Brad Appleton publica “Patterns and Software: Essential Concepts and Terminology”.

• Mark Grand publica en 1998 “Patterns in Java (volume 1)” que es un catálogo de patrones de diseño ilustrados con UML.

• En 1999 Mark Grand publica “Patterns in Java (volume 2)” en donde se añaden algunos patrones de diseño más y otros tipos de patrones tales como patrones de organización de código, patrones de optimización de código, etc.

Clases de patrones software

• Existen diferentes ámbitos dentro de la ingeniería del software donde se pueden aplicar los patrones: 1. Patrones de arquitectura: expresa una organización o esquema

estructural fundamental para sistemas software. Proporciona un conjunto de subsistemas predefinidos, especifica sus responsabilidades, e incluye una guía para organizar las relaciones entre ellos.

2. Patrones de diseño: proporciona un esquema para refinar los subsistemas o componentes de un sistema software, o las relaciones entre ellos. Describe estructuras repetitivas de comunicar componentes que resuelven un problema de diseño en un contexto particular.

Clases de patrones software

3. Patrones de programación (Idioms patterns): un idioma es un patrón de bajo nivel de un lenguaje de programación específico. Describe como implementar aspectos de componentes o de las relaciones entre ellos utilizando las facilidades del lenguaje de programación dado.

4. Patrones de análisis: describen un conjunto de prácticas que aseguran la obtención de un buen modelo de un problema y su solución.

5. Patrones organizacionales: describen la estructura y prácticas de las organizaciones humanas, especialmente en las que producen, usan o administran software.

Ventajas de los patrones

• Entre las ventajas que se pueden citar de la utilización de patrones están:

1. Facilitan la comunicación interna.

2. Ahorran tiempo y experimentos inútiles.

3. Mejoran la calidad del diseño y la implementación.

4. Son como “normas de productividad”.

5. Facilitan el aprendizaje de los paquetes Java.

Elementos de los Patrones de Diseño

• En general, un patrón tiene cuatro elementos esenciales: 1. El nombre del patrón se utiliza para describir un

problema de diseño, su solución, y consecuencias en una o dos palabras. Nombrar un patrón incrementa inmediatamente nuestro vocabulario de diseño. Esto nos permite diseños a un alto nivel de abstracción. Tener un vocabulario de patrones nos permite hablar sobre ellos con nuestros amigos, en nuestra documentación, e incluso a nosotros mismos.

Elementos de los Patrones de Diseño

2. El problema describe cuando aplicar el patrón. Se explica el problema y su contexto. Esto podría describir problemas de diseño específicos tales como algoritmos como objetos. Podría describir estructuras de clases o objetos que son sintomáticas de un diseño inflexible. Algunas veces el problema incluirá una lista de condiciones que deben cumplirse para poder aplicar el patrón.

Elementos de los Patrones de Diseño

• 3. La solución describe los elementos que forma el diseño, sus relaciones, responsabilidades y colaboraciones. La solución no describe un diseño particular o implementación, porque un patrón es como una plantilla que puede ser aplicada en diferentes situaciones. En cambio, los patrones proveen una descripción abstracta de un problema de diseño y como una disposición general de los elementos (clases y objetos en nuestro caso) lo soluciona.

Elementos de los Patrones de Diseño

• 4. Las consecuencias son los resultados de aplicar el patrón. Estas son muy importantes para la evaluación de diseños alternativos y para comprender los costes y beneficios de la aplicación del patrón.

Descripción de un patrón

• Para describir los patrones de diseño se utiliza un formato consistente.

• Cada patrón es dividido en secciones de acuerdo con una plantilla.

• La plantilla muestra una estructura uniforme para la información, de tal forma que los patrones de diseño sean fáciles de aprender, comparar y utilizar.

Descripción de un patrón

• 1. Nombre del patrón

• 2. Objetivo

• 3. Contexto

• 4. Aplicabilidad

• 5. Solución

• 6. Consecuencias

• 7. Implementación

• 10. Patrones relacionados

Descripción de un patrón

1. Nombre del patrón

Esta sección consiste de un nombre del patrón y una referencia bibliografía que indica de donde procede el patrón. El nombre es significativo y corto, fácil de recordar y asociar a la información que sigue.

Descripción de un patrón

2. Objetivo

Esta sección contiene unas pocas frases describiendo el patrón. El objetivo aporta la esencia de la solución que es proporcionada por el patrón. El objetivo esta dirigido a programadores con experiencia que pueden reconocer el patrón como uno que ellos ya conocen, pero para el cual ellos no le han dado un nombre. Después de reconocer el patrón por su nombre y objetivo, esto podría ser suficiente para comprender el resto de la descripción del patrón.

Descripción de un patrón

3. Contexto

La sección de Contexto describe el problema que el patrón soluciona. Este problema suele ser introducido en términos de un ejemplo concreto. Después de presentar el problema en el ejemplo, la sección de Contexto sugiere una solución de diseño a ese problema.

Descripción de un patrón

4. Aplicabilidad

La sección Aplicabilidad resume las consideraciones que guían a la solución general presentada en la sección Solución. En que situaciones es aplicable el patrón.

Descripción de un patrón

5. Solución

La sección Solución es el núcleo del patrón. Se describe una solución general al problema que el patrón soluciona. Esta descripción puede incluir, diagramas y texto que identifique la estructura del patrón, sus participantes y sus colaboraciones para mostrar como se soluciona el problema. Debe describir tanto la estructura dinámica como el comportamiento estático.

Descripción de un patrón

6. Consecuencias

La sección Consecuencias explica las implicaciones, buenas y malas, del uso de la solución.

Descripción de un patrón

7. Implementación

La sección de Implementación describe las consideraciones importantes que se han de tener en cuenta cuando se codifica la solución. También puede contener algunas variaciones o simplificaciones de la solución.

Descripción de un patrón

8. Patrones relacionados

Esta sección contiene una lista de los patrones que están relacionados con el patrón que se describe.

Cualidades de un patrón de diseño

• Encapsulación y abstracción: cada patrón encapsula un problema bien definido y su solución en un dominio particular. Los patrones deberían de proporcionar límites claros que ayuden a cristalizar el entorno del problema y el entorno de la solución empaquetados en un entramado distinto, con fragmentos interconectados. Los patrones también sirven como abstracciones las cuales contienen dominios conocidos y experiencia, y podrían ocurrir en distintos niveles jerárquicos de granularidad conceptual.

Cualidades de un patrón de diseño

• Extensión y variabilidad: cada patrón debería ser abierto por extensión o parametrización por otros patrones, de tal forma que pueden aplicarse juntos para solucionar un gran problema. Un patrón solución debería ser también capaz de realizar un variedad infinita de implementaciones (de forma individual, y también en conjunción con otros patrones).

Cualidades de un patrón de diseño

• Generalidad y composición: cada patrón, una vez aplicado, genera un contexto resultante, el cual concuerda con el contexto inicial de uno o más de uno de los patrones del catálogo. Está subsecuencia de patrones podría luego ser aplicada progresivamente para conseguir el objetivo final de generación de un “todo” o solución completa.

Cualidades de un patrón de diseño

• Equilibrio: cada patrón debe realizar algún tipo de balance entre sus efectos y restricciones. Esto podría ser debido a uno o más de un heurístico que son utilizados para minimizar el conflicto sin el contexto de la solución. Las invariaciones representadas en un problema subyacente solucionan el principio o filosofía para el dominio particular, y proveen una razón fundamental para cada paso o regla en el patrón.

Clasificación de los patrones de diseño

Purpose

Creational Structural Behavioral

Scope Class Factory Method Adapter (class) Interpreter Template Method

Object Abstract Factory Builder Prototype Singleton

Adapter (object) Bridge Composite Decorator Facade Flyweight Proxy

Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor

Catálogo de Gamma et al. (1995)

Relaciones entre patrones de diseño

Builder

Proxy

saving state

of iteration

Memento

Adapter

Bridge

Command

Iterator

Composite

Decorator

Enumerating

children

adding

respnsibilities

to objects

composed

using

sharing

composites

Flyweight defining

grammar

Interpreter

Visitor

Chain of

Responsibility

changing skin

versus guts

Strategy

State

sharing

strategies

Mediator Observer

Template Method

defining

algorithm´s

steps Prototype

Abstract Factory

Singleton Facade

Factory Method

single

instance

single

instance

Causas comunes de rediseño

i) Crear un objeto indicando la clase.

ii) Dependencia de operaciones específicas

iii) Dependencia de plataformas hardware o software

iv) Dependencia sobre representación de objetos.

v) Dependencias de algoritmos

vi) Acoplamiento fuerte entre clases

vii) Extender funcionalidad mediante subclases

viii) Incapacidad de cambiar clases convenientemente

Patrones frente a esos peligros

i) Abstract factory, Method factory, Prototype

ii) Chain of Responsability, Command

iii) Abstract factory, Bridge

iv) Abstract factory, Bridge, Memento, Proxy,

v) Builder, Iterator, Strategy, Template Method, Visitor

vi) Abstract factory, Bridge, Chain of Responsability, Command, Facade, Mediator, Observer

vii) Bridge, Chain of Responsability, Composite, Decorator, Observer, Strategy

viii) Adapter, Decorator, Visitor

¿Cómo seleccionar un patrón?

• Considere de que forma los patrones resuelven problemas de diseño

• Lea la sección que describe el propósito de cada patrón

• Estudie las interrelaciones entre patrones

• Analice patrones con el mismo propósito

• Examine las causas de rediseñar

• Considere que debería ser variable en el diseño

¿Cómo usar un patrón?

• Lea el patrón, todos sus apartados, para tener una visión global.

• Estudie la Estructura, Participantes y Colaboraciones

• Mire ejemplos de código

• Asocie a cada participante del patrón un elemento software de su aplicación.

• Implemente las clases y métodos relacionados con el patrón.

Patrones de Creación

• Abstraen el proceso de creación de objetos.

• Ayudan a crear sistemas independientes de cómo los objetos son creados, compuestos y representados.

• El sistema conoce las clases abstractas

• Flexibilidad en qué se crea, quién lo crea, cómo se crea y cuándo se crea.

Patrones de Creación

Class Factory Method

Object Abstract Factory Builder Prototype Singleton

Abstract Factory

Descripción Contexto Ventajas Desventajas Provee una interfaz para crear familias de objetos relacionados o dependientes sin especificar la clase concreta

Se quiere independizar un sistema de crear componentes y representar una familia de productos.

1) Encapsula la creación de objetos, y aísla las clases concretas del cliente, 2) permite intercambiar familias de productos de manera sencilla

1) Soportar nuevos tipos de productos es complejo

Abstract Factory

Abstract Factory

AbstractFactory

CreateProductA() CreateProductB()

ConcreteFactory1

createProductA()

createProductB()

ConcreteFactory2

createProductA()

createProductB()

ProdA2

AbstrProdB

ProdB2 ProdB1

AbstrProdA

ProdA1

Cliente

Builder

Descripción Contexto Ventajas Separa la construcción de objetos complejos de su representación, para que el mismo proceso de construcción pueda crear diferentes representaciones.

Se desea crear objetos complejos, y que ese proceso se pueda utilizar para crear diferentes representaciones.

1) permite variar la representación interna de cada producto creado, 2) aísla el código de construcción y de representación de un objeto, 3) Se tiene un control más fino del proceso de construcción del objeto

Builder

Builder

Prototype Descripción Contexto Ventajas Especifica la clase de objetos a crear usando una instancia de un prototipo, creando un nuevo objeto de un prototipo.

Se tienen instancias de unas clases que tienen pocas combinaciones de diferentes estados.

1) permite agregar o eliminar productos en tiempo de ejecución, 2) permite especificar nuevos objetos mediante la variación de algunos valores, 3) permite especificar nuevos objetos mediante la variación de su estructura, 4) Reduce la posibilidad de utilizar subclases o de crear jerarquías de clases, 5) permite configurar una aplicación con clases dinámicas

Prototype

Factory Method

Descripción Contexto Ventajas Define una interfaz para la creación de objetos, pero decide cual de las clases debe instanciar.

Se desean separar la responsabilidad de crear objetos especifos del sistema.

1) brinda mas flexibilidad en la creación de objetos, al extender las subclases, 2) Puede conectar clases jerárquicas paralelas

Factory Method

Factory Method

50

Patrones Estructurales

• Cómo clases y objetos se combinan para formar estructuras más complejas.

• Patrones basados en herencia – Sólo una forma de Adapter

• Patrones basados en composición – Describen formas de combinar objetos para

obtener nueva funcionalidad

– Posibilidad de cambiar la composición en tiempo de ejecución.

Patrones Estructurales

Class Adapter (class)

Object Adapter (object) Bridge Composite Decorator Facade Flyweight Proxy

Adapter

Descripción Contexto Ventajas Desventajas Convierte la interfaz de una clase en la inetrfaz que un cliente desea. Permite que dos clases con interfaces incompatibles puedan comunicarce.

Se requiere usar una clase, pero su interfaz no conincide con lo que se necesita.

1) permite la reutilizacion

1) el adaptador no puede adaptar todas las subclases de una clase

Adapter

Adapter (Composición)

Cliente Objetivo

metodo1()

Adaptador

metodo1()

Adaptado

especificoMet1()

+adaptado

adaptado. especificoMet1()

Adapter (Herencia)

Adaptado

especificoMet1()

Adaptador

metodo1()

<<implementation>>

especificoMet1

Cliente Objetivo

metodo1()

( )

Bridge

Descripción Contexto Ventajas Desacopla la abstracción de la implementación, de manera que cada uno puede variar independientemente.

Se tiene una abstracción que puede tener diferentes implementaciones.

1) desacopla la interfaz de la implementación 2) se puede extender la jerarquía de las abstracciones y de las implementaciones por separado, 3) se ocultan los detalles de implementación.

Bridge

Bridge

AbstraccionRefinada ImplemA

operacionImp()

ImplemB

operacionImp()

Implementacion

operacionImp()

Abstraccion

operacion()

+imp

imp.operacionImp

Composite

Descripción Contexto Ventajas Desventajas Compone objetos en estructuras de árbol para representar jerarquías parte-todo.

Se desea representar objetos mediantes jerarquías parte-todo

1) permite representar objetos complejos, 2) hace el cliente simple, debido a que ve el objeto compuesto como un objeto uniforme, 3) es sencillo agregar nuevos tipos de componentes

1) es complicado restringir la composición de objetos

Composite

Composite

Decorator

Descripción Contexto Ventajas Desventajas Agrega responsabilidades adicionales a un objeto de manera dinámica.

Se quiere agregar responsabilidades a un objeto especifico, pero no a su clase.

1) brinda mas flexibilidad que la herencia estática, 2) Evita las clases llenas de funciones en los niveles altos de la jerarquía

1) un sistema que tenga lotes de decoradores puede ser complicado de entender y de hacerle debug.

Decorator

Decorator

Decorator Componente

+ operación ( ) :

ComponenteConcreto

+ operación ( ) :

Decorador

+ operación ( ) :

componente

DecoradorConcreto1

+ operación ( ) :

DecoradorConcreto2

+ operación ( ) :

DecoradorConcretoN

+ operación ( ) :

+ comportamientoAdicional ( ) :

operación() {

componente.operación();

}

operación(){

super.operación();

comportamientoAdicional();

}

Facade

Descripción Contexto Ventajas Desventajas Provee una interfaz unificada para un conjunto de interfaces en un subsistema. Define una interfaz de alto nivel que hace al subsistema fácil de usar.

Se tiene un sistema al cual se le quiere minimizar las dependencias con otros susbsistemas.

1) reduce el número de objetos con los que el que el cliente tiene que interactuar para poder usar un subsistema (bajo acoplamiento), 2) promueve el bajo acoplamiento

1) el subsistema queda fuertemente acoplado

Facade

Facade Fachada

Flyweight

Descripción Contexto Ventajas Desventajas Hacer uso compartido de un gran numero de objetos granularmente finos de manera eficiente.

En una aplicación se usa un gran número de objetos, pero el costo de almacenarlos y cárgalos en memoria es alto.

1) permite administrar las instancias de una clase, mejorando el uso de memoria del sistema.

1) introduce el costo de transferir, encontrar y procesar los diferentes estados de un objeto

Flyweight

Flyweight

Proxy

Descripción Contexto Ventajas Provee un sustituto para que controle el acceso a un objeto.

Se quiere volver mas versátil o sofisticado el acceso a la referencia de un objeto.

1) puede realizar indirecciones, 2) puede optimizar operaciones de objetos como la creación o la copia del objeto, 3) puede proteger el acceso a un objeto

Proxy

Proxy

sujeto.operacion()

Cliente

SujetoReal

operacion()

Proxy

operacion()+sujeto

Sujeto<<abstract>>

operacion()

75

Patrones de Comportamiento

• Relacionados con la asignación de responsabilidades entre clases.

• Enfatizan la colaboración entre objetos. • Caracterizan un flujo de control más o menos

complejo que será transparente al que utilice el patrón.

• Basados en herencia: Template Method e Interpreter

• Basados en composición: Mediator, Observer,...

Patrones de Comportamiento

Class Interpreter Template Method

Object Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor

Interpreter

Descripción Contexto Ventajas Desventajas Dado un lenguaje, define una representación de la gramática mediante un interprete que interpreta frases de ese lenguaje.

Se requiere poder interpretar un lenguaje especifico.

1) es fácil cambiar y extender la gramática, 2) implementar la gramática es fácil, 3) se pueden agregar nuevas formas de interpretar la gramática de manera sencilla

1) gramáticas complejas son difíciles de mantener

Interpreter

Interpreter

Chain of Responsibility

Descripción Contexto Ventajas Desventajas Evita el acoplamiento entre el cliente que envía una petición y el receptor de la petición, mediante varios objetos que pueden manejar esa petición. La cadena pasa la petición a través de objetos, hasta que un objeto la maneja.

Se puede manejar una petición por varios objetos, pero el manejador de la petición no se conoce de antemano.

1) reduce el acoplamiento entre el cliente y el manejador del evento, 2) agrega flexibilidad en la asignación de responsabilidades a un objeto

1) el receptor de la petición no se garantiza

Chain of Responsibility

Chain of Responsibility

Command

Descripción Contexto Ventajas Encapsula una petición como un objeto, con el fin de parametrizar las peticiones.

Se requiere modelar los posibles comandos que puede ejecutar un cliente en una aplicación.

1) desacopla el objeto que invoca la operación del objeto que desarrolla la operación, 2) puede ser manipulado y extendido por cualquier otro objeto, 3) se puede ensambla varios comandos como un macrocomando, 4) es sencillo agregar un nuevo comando.

Command

Command

Mediator

Descripción Contexto Ventajas Desventajas Define un objeto que encapsula la interacción entre un conjunto de objetos

Se tiene un conjunto de objetos que interactúan de una manera bien definida pero compleja.

1) limita el uso de subclases, 2) desacopla los colegas, 3) simplifica el protocolo de comunicación de los objetos, 4) vuelve abstracta la cooperación entre objetos

1) centraliza el control de la interacción lo que lo vuelve mas difícil de mantener el mediador.

Mediator

Mediator

Mediator<<abstract>>

Colega+mediator

ColegaConcr1MediatorConcreto ColegaConcr2

Observer

Descripción Contexto Ventajas Desventajas

Define una dependencia uno a muchos entre objetos, de manera que cuando cambian su estado le notifican a todos los objetos dependientes a ellos el cambio de su estado.

Se tiene un objeto que depende del cambio de estado de otro objeto.

1) el acoplamiento entre los observadores y los temas es abstracto y mínimo, 2) soporta comunicación de tipo broadcast

1) se pueden generar actualizaciones inesperadas, difíciles de deducir por los observadores

Observer

Observer

State

Descripción Contexto Ventajas

Permite que un objeto cambie de comportamiento cuando su estado interno cambia.

Se quiere representar que cambia su comportamiento en tiempo de ejecucion, una vez cambia su estado.

1) permite representar diferentes comportamientos, para los diferentes estados, 2) la transición entre estados es explicita, 3) los estados pueden ser compartidos

State

State

State Estado

+ get ( ) : void

+ put ( ) : void

contexto

1 estado

1

Vacío

+ get ( ) : void

+ put ( ) : void

Lleno

+ get ( ) : void

+ put ( ) : void

void put(...) {

estado.put(…);

}

Buffer1

+ get ( ) : void

+ put ( ) : void

Buffer2

Vacío2 Lleno2 Uno

Strategy

Descripción Contexto Ventajas Desventajas

Define una familia de algoritmos, encapsula cada uno y los vuelve intercambiables. Permite que el algoritmo varíe independientemente de los clientes que lo usen.

Se quiere representar un conjuno se pueda realizar en tiepo de ejecucion.to de clases que solo cambian en su comportamiento, en una sola clase.

1) puede expresar familias de algoritmos que pueden ser reutilizados, 2) Una forma de crear subclases y que promueve la extensibilidad, 3) elimina las condicionales en el cambio de estrategia, 4) se pueden representar diferentes implementaciones del mismo comportamiento

1) los clientes deben ser conscientes de las estrategias que pueden usar, 2) hay sobrecarga de comunicación entre el contexto y la estrategia, 3) se incrementa el numero de objetos en el sistema.

Strategy

Strategy

Visitor

Descripción Contexto Ventajas Desventajas

Representa una operación a ser realizada en un atributo de un objeto. Permite definir nuevas operaciones sin cambiar las clases de los atributos en los cuales se va a operar.

Se desea realizar operaciones sobre un objeto, sin la necesidad de agregar esos métodos en la definición de la clase.

1) permite agregar nuevas operaciones sobre un objeto de manera sencilla, 2) reúne las operaciones relacionadas y separa las operaciones no relacionadas a una clase, 3) permite visitar clases con las cuales no tiene clases padre en común, 4) los visitantes pueden guardar el estado de un objeto, evitando el uso de mas parámetros en la definición del método y el uso de variables globales

1) Agregar un elemento concreto es difícil, 2) Rompe el encapsulamiento de los objetos que visita.

Visitor