lunes, 8 de julio de 2013

1.1 CONCEPTOS DE LOS PATRONES DE SOFTWARE.

¿Qué es un patrón?

 Según  Christopher Alexander “cada patrón  describe  un  describe un problema   que  ocurre  una y otra vez  en nuestro entorno, así  como la solución a ese problema de tal modo que se pueda aplicar  esta solución un millón de veces , sin hacer lo mismo dos veces “ a la vez que propone una solución idónea aplicable a dicho problema.

4 elementos esenciales:
  1.           Un nombre de patrón  permite  describir, en una o dos palabras, un problema de diseño  junto con sus soluciones y consecuencias.
  2.            Problema describe cuando aplicar el patrón. Explica el problema y su contexto.
  3.            La solución describe los elementos que construyen  en el diseño, sus relaciones, responsabilidades y colaboraciones.
  4.          Las consecuencias explican los resultados de aplicar el patrón, sus costes y beneficios.
 Los patrones de diseño de  los cuales se clasifican como se muestra a continuación:
·         Patrones Creacionales: Inicialización y configuración de objetos.


Fábrica Abstracta ( Abstract Factory )
Método de Fabricación ( Factory Method )
Prototipado ( Prototype )
Singleton
MVC ( Model View Controler )







·         Patrones Estructurales: Separan la interfaz de la implementación. Se ocupan de cómo las clases y objetos se agrupan, para formar estructuras más grandes.


Adaptador (Adapter)
Puente (Bridge)
Objeto Compuesto (Composite)
Envoltorio (Decorator
Fachada (Facade)
Peso Ligero (Flyweight)
Apoderado (Proxy)




·        



Patrones de Comportamiento: Más que describir objetos o clases, describen la comunicación entre ellos.



Objetivos  de los patrones.
Los patrones de diseño pretenden:
  •       Proporcionar catálogos de elementos reusables en el diseño de sistemas software.
  •       Evitar la reiteración en la búsqueda de soluciones a problemas ya conocidos y solucionados anteriormente.
  •       Formalizar un vocabulario común entre diseñadores.
  •      Estandarizar el modo en que se realiza el diseño.
  •      Facilitar el aprendizaje de las nuevas generaciones de diseñadores condensando conocimiento ya existente.
Asimismo, no pretenden:
  •       Imponer ciertas alternativas de diseño frente a otras.
  •      Eliminar la creatividad inherente al proceso de diseño.



1.2 Tipos 1.2.1 Business Delegate

El Business Delegate actúa como una abstracción de negocio del lado del cliente; proporciona una abstracción para, y por lo tanto oculta, la implementación de los servicios del negocio. Utilizando Business Delegate se reduce el acoplamiento entre los clientes de la capa de presentación y los servicios de negocio del sistema.

Estructura
La siguiente figura muestra el diagrama de clases que representa al patrón Business Delegate. El cliente solicita al BusinessDelegate que le proporcione acceso al servicio de negocio subyacente. El BusinessDelegate utiliza un LookupService para localizar el componenteBusinessService requerido.



Participantes y Responsabilidades

La siguiente figura muestra el diagrama de secuencia que ilustra las interacciones típicas para este patrón:



El BusinessDelegate utiliza un LookupService para localizar el servicio de negocio. El servicio de negocio se utiliza para invocar a los métodos de negocio por cuenta del cliente. 


El métodoGet_ID muestra que el BusinessDelegate puede obtener una versión String del handle(como un objeto EJBHandle) para el servicio de negocio y devolverlo al cliente como unString. 

El cliente puede utilizar la versión String del handle más tarde para reconectar con el servicio de negocio que estaba utilizando cuando obtuvo el handle. 

Esta técnica evitará nuevas búsquedas, ya que el handle es capáz de reconectar con su ejemplar del servicio de negocio. Se debería observar que los objetos handle los implementa el contenedor y podrían no ser portables entre contenedores de diferentes vendedores.


El diagrama de secuencia de la obtención de un BusinessService (como un bean de sesión o de entidad) utilizando este handle.





El rol de BusinessDelegate es proporcionar control y protección para el servicio de negocio.BusinessDelegate puede exponer dos tipos de constructores al cliente. 

Un tipo de petición ejemplariza el BusinessDelegate sin una ID, mientras que el otro lo inicializa con un ID, donde ID es una versión String de la referencia al objeto remoto como un EJBHome o unEJBObject.

Ø ElBusinessDelegate pide que el Service Factory localice, cree o elimine un BusinessService, como un bean enterprise.

Ø Cuando se inicializa con un ID, el BusinessDelegate usa el ID para reconectar con elBusinessService. Así, el BusinessDelegate aisla al cliente de los detalles de la implementación del BusinessService de nombrado y búsqueda.


Ø Además, el cliente de la capa de presentación nunca hace llamadas remotas directas sobre un BusinessSession; en su lugar, el cliente utiliza el BusinessDelegate.

El Business Delegate expone un interface que proporciona a los clientes acceso a los métodos subyacentes del API de servicios de negocio. En esta estrategia, un Business Delegate proporciona la función de proxy para pasar los métodos del cliente al bean de sesión que encapsula. 


Adicionalmente el Business Delegate podría hacer un caché con los datos necesarios, incluyendo las referencias remotas de los objetos home o remote del bean de sesión para mejorar el rendimiento reduciendo el número de búsquedas.

Se utiliza para separar capa de presentación y la capa de negocio. Se utilizan básicamente para reducir la comunicación o la funcionalidad de búsqueda de código remoto capa de negocios en la presentación de código de nivel. 


Ø Client - Presentación código puede ser JSP, servlet o UI código java.

Ø Delegado de negocios - Una única clase de punto de entrada para las entidades cliente para proporcionar acceso a los métodos de servicios empresariales.

Ø Servicio de Búsqueda - objeto de servicio de búsqueda se encarga de obtener la ejecución de negocios relativa y proporcionar acceso a objetos de negocio a negocio objeto delegado.

Ø Servicios de Negocio - Interfaz de Servicios de Negocio. Las clases concretas implementa este servicio para proporcionar lógica de negocio real aplicación de negocios.

1.2.2 Composite Entity

¿QUE ES?

Patrón Composite Entity es utilizado en EJB mecanismo de persistencia. Una entidad compuesta es una entidad bean EJB que representa un gráfico de objetos. Cuando una entidad compuesta se actualiza, frijoles objetos dependientes internamente se actualizan automáticamente, ya que está gestionado por EJB Entity Bean.

· Los beans de entidad son mejores para implementar objetos genéricos debido a la alta sobrecarga asociada con todo bean de entidad. Todo bean de entidad se implementa utilizando muchos objetos, como el objeto home, el objetoremote, la implementación del bean, y la clave primaria, y todos son controlados por los servicios del contenedor.


El diagrama de secuencia muestra las interacciones para este patrón:


Participantes y Responsabilidades

CompositeEntity es un bean de entidad genérico. Podría ser un objeto genérico, o podría contener una referencia a un objeto genérico.

Coarse-Grained Object

Un objeto genérico es un objeto que tiene su propio ciclo de vida y que maneja sus propias relaciones con otros objetos. Un objeto genérico puede ser un objeto Java contenido en elCompositeEntity. O, el propio Composite Entity puede ser un objeto genérico que contiene objetos dependientes.
DependentObject1, DependentObject2, y DependentObject3
Un objeto dependiente es un objeto que depende de un objeto genérico el cual gobierna el ciclo de vida del objeto dependiente. Un objeto dependiente puede contener otros objetos dependientes; así podría existir un árbol de objetos dentro del Composite Entity.
Estrategias


Esta sección explica las diferentes estrategias para implementar el patrón Composite Entity. Las estrategias consideran posibles alternativas y opciones para objetos persistentes (genéricos y dependientes), y la utilización deTransfer Objects.
El Composite Entity Contiene Objetos Genéricos


En esta estrategia, el Composite Entity almacena o contiene el objeto genérico. Este objeto genérico continúa teniendo relaciones con sus objetos dependientes. La sección Estructura describe esta estrategia principal.
El Composite Entity Implementa el Objeto Genérico


En esta estrategia, el propio Composite Entity es el objeto genérico y tiene atributos y métodos de objeto genérico. Los objetos dependientes son atributos del Composite Entity. Como el Composite Entity es el objeto genérico, el bean de entidad expresa y maneja todas las relaciones entre el objeto genérico y los objetos dependientes. La siguiente figura muestra el diagrama de clases de esta estrategia:

1.2.3 Composite View

El patrón Composite sirve para construir objetos complejos a partir de otros más simples y similares entre sí, gracias a la composición recursiva y a una estructura en forma de árbol.

Ayuda al proceso de integración de varias subvistas en una página.

Propone componer una vista de numerosas piezas atómicas

Combina vistas simples en una visión más compleja y sin manipular el contenido o el diseño.

Esto simplifica el tratamiento de los objetos creados, ya que al poseer todos ellos una interfaz común, se tratan todos de la misma manera.

Estructura

Se muestra el diagrama de clases que representa el patrón Composite View.


Participantes y Responsabilidades

Se muestra el diagrama de secuencia para el patrón Composite View.













Ø CompositeView: Una vista compuesta es una vista a la que se le han agregado varias subvistas.

Ø ViewManager: El manejador de vista se ocupa de la inclusión de porciones de fragmentos de plantilla en la vista compuesta.


Ø HeaderView: Es una subvista incluida dentro de la principal.


Ø FooterView: Es una subvista incluida dentro de la principal.

Implementación

Un Composite View se puede implementar siguiendo la estrategia JSP page View o bien la estrategia Servlet View. [Alur]


El control de la vista se puede implementar de diferentes formas: utilizando etiquetas jsp estándar, como <jsp:include>, utilizando componentes JavaBeans, y también mediante etiquetas personalizadas (JSP 1.1+).


Consecuencias


 Mejora la Modularidad y la Reutilización.

El modelo promueve el diseño modular. Es posible volver a usar porciones atómicas de una plantilla, como una tabla de cotizaciones de bolsa, en numerosos puntos de vista y para decorar estas porciones reutilizadas con información diferente. Este patrón permite la mesa para ser trasladado a su propio módulo y simplemente incluida en caso necesario. Este tipo de diseño y composición dinámica reduce la duplicación, fomenta la reutilización y mejora el mantenimiento.

· Mejora la Flexibilidad

Una implementación sofisticada puede incluir condicionalmente ver fragmentos de plantilla en base a las decisiones de ejecución, tales como la función de usuario o la política de seguridad.

· Mejora la mantenibilidad y Manejabilidad

Es mucho más eficiente para administrar los cambios en porciones de una plantilla cuando la plantilla no está codificada directamente en la vista de marcado. Cuando se mantiene separada de la vista, es posible modificar porciones modulares de contenido de la plantilla independiente de la disposición de la plantilla. Además, estos cambios están disponibles para el cliente inmediatamente, dependiendo de la estrategia de implementación. Las modificaciones del diseño de una página se controlan más fácilmente, así, ya que los cambios están centralizados.

· Reduce Manejabilidad

Agregación de piezas atómicas de la pantalla en conjunto para crear una única vista introduce la posibilidad de errores en la pantalla, ya que subvistas son fragmentos de página. Esta es una limitación que puede convertirse en un problema de manejabilidad. Por ejemplo, si una página de la página JSP está generando una página HTML usando una página principal que incluye tres subvistas, y las subvistas cada incluyen la etiqueta HTML de apertura y cierre (es decir, <HTML> y </ HTML> ), entonces el compuestas la página no será válida. Por lo tanto, es importante cuando se utiliza este patrón a ser consciente de que subvistas no deben ser vistas completas. Uso de Tag debe tenerse en cuenta muy estricta con el fin de crear vistas compuestas válidos, y esto puede convertirse en un problema de gestión.
· Impacto en el rendimiento

Generando una pantalla que incluye numerosas subvistas puede disminuir el rendimiento.Duración de la inclusión subvistas resultará en un retraso cada vez que la página se sirve al cliente. En un entorno con estrictos acuerdos de nivel de servicio que los tiempos de respuesta de mandatos específicos, tales ralentizaciones de rendimiento, pero en general muy mínimas, no pueden ser aceptables. Una alternativa es mover la inclusión subvista al tiempo de traducción, aunque esto limita la vista secundaria a los cambios cuando la página se retraducido.


1.2.4 Data Access Object (DAO)

Es un componente de software que suministra una interfaz común entre la aplicación y uno o más dispositivos de almacenamiento de datos, tales como una Base de datos o un archivo. El término se aplica frecuentemente al Patrón de diseño Object.

Ø Generalmente esta API consiste en métodos CRUD (Create, Read, Update, y Delete). Entonces por ejemplo cuando la capa de lógica de negocio necesite guardar un dato en la base de datos va a llamar a un método créate().

Ventajas

Los Objetos de Acceso a Datos son un Patrón de los subordinados de Diseño Core J2EE y considerados una buena práctica. La ventaja de usar objetos de acceso a datos es que cualquier objeto de negocio (aquel que contiene detalles específicos de operación o aplicación) no requiere conocimiento directo del destino final de la información que manipula.

Los Objetos de Acceso a Datos pueden usarse en Java para aislar a una aplicación de la tecnología de persistencia Java subyacente (API de Persistencia Java), la cual podría ser JDBC, JDO, Enterprise JavaBeans, TopLink, Hibernate, iBATIS, o cualquier otra tecnología de persistencia. Usando Objetos de Acceso de Datos significa que la tecnología subyacente puede ser actualizada o cambiada sin cambiar otras partes de la aplicación.

Desventajas

La flexibilidad tiene un precio. Cuando se añaden DAOs a una aplicación, la complejidad adicional de usar otra capa de persistencia incrementa la cantidad de código ejecutado durante tiempo de ejecución. La configuración de las capas de persistencia requiere en la mayoría de los casos mucho trabajo.


Estructura DAO
 



Ø BusinessObject: Es el objeto que quiere acceder a la fuente de datos para poder almacenar o consultar datos.

Ø DataAccessObject: Abstrae al BusinessObject de los detalles del acceso a la fuente de datos.

Ø DataSource: Representa la implementacion de la fuente de datos en sí.

Ø TransferObject: Es un objeto intermedio entre el BussinessObject y el DataAccessObject.

1.2.5 Fast Lane Reader

Este patrón propone un mecanismo para obtener grandes cantidades de información utilizando un acceso directo sobre la base de datos.

• Implementación

Ø casos de uso que corresponden a búsquedas que devuelven una colección de objetos

Ø cuando se tienen casos de uso que corresponden a búsquedas múltiples y la eficiencia es un factor importante.

Estructura

Participantes

Ø Business Delegate

Delega las operaciones de búsqueda múltiple en un Session Facade( 
que usa un DAO) o directamente en un DAO

Ø SessionFacade


Un Session Bean que implementa las operaciones de búsqueda múltiple delegando en un DAO

Ø DAO

Proporciona las operaciones de búsqueda accediendo directamente a la BD

Colaboraciones

Un Business Delegate implementa las operaciones de búsqueda múltiple delegando en un Session Facade(que usa un DAO) o Directamente en un DAO

1.2.6 Front Controller


Es un patrón de diseño que se basa en usar un controlador como punto inicial para la gestión de las peticiones. El controlador gestiona estas peticiones, y realiza algunas funciones como: comprobación de restricciones de seguridad, manejo de errores, mapear y delegación de las peticiones a otros           componentes de la aplicación que se encargarán de generar la vista adecuada para el usuario.

El patrón Front Controller podría dividir la funcionalidad en 2 diferentes objetos: el Front Controller y el Dispatcher. En ese caso, El Front Controller acepta todos los requerimientos de un cliente y realiza la autenticación, y el Dispatcher direcciona los requerimientos a manejadores apropiada.

Ventajas

Ø Tenemos centralizado en un único punto la gestión de las peticiones.

Ø Aumentamos la reusabilidad de código.

Ø Mejoramos la gestión de la seguridad.

Desventajas

La velocidad de respuesta disminuye al tener que ser procesadas las peticiones primero por el controlador

Diagrama de la secuencia del patrón Front Controller.


Ø  Controller: Es el punto de contacto inicial para manejar todas las peticiones en el sistema. El controlador podría delegar a un helper para completar la autentificación y la autorización de un usuario o para iniciar la recuperación de un contacto.

Ø  Dispatcher: Es el responsable del manejo de la vista y de la navegación, controlando la elección de la siguiente vista que se le presentará al usuario, y proporcionando el mecanismo para dirigir el control a ese recurso.

Ø  Helper: es el responsable de ayudar a la vista o al controlador a completar su procesamiento. Así, los helpers tienen muchas responsabilidades, incluyendo la recopilación de los datos requeridos por la vista y el almacenamiento en el modelo intermedio, en cuyo caso algunas veces nos podemos referir al helper como un bean de valor. Además, los helpers pueden adaptar este modelo de datos para usarlo en la vista.

Ø  View: la representa y muestra información al cliente. La vista recupera información desde el modelo. Los helpers soportan las diferentes vistas encapsulando y adaptanto el modelo de datos subyacente para usarlo en el display.



1.2.7 Intercepting Filter

El mecanismo de manejo de petición de niveles de presentación recibe muchos tipos diferentes de peticiones, que requieren diversos tipos de procesamiento. Algunas peticiones son simplemente enviados a la componente de controlador adecuado, mientras que las demás solicitudes deben ser modificados, auditado o no comprimido antes de ser procesados ​​posteriormente.

Ø  Procesamiento común, tales como comprobar el esquema de codificación de datos o de registro de la información acerca de cada petición, completa por solicitud.
Ø  Se desea centralización de la lógica común.
Ø  Los servicios deben ser fáciles de añadir o eliminar discretamente sin afectar a los componentes existentes, de modo que puedan ser utilizados en una variedad de combinaciones, tales como

    • Registro y autenticación.
    • Depuración y transformación de la producción para un cliente específico.
    • Uncompressing y la conversión de esquema de codificación de entrada.

Estructura


Diagrama de secuencia


Ø  FilterManager: El FilterManager maneja el procesamiento de filtros. Crea el FilterChain con los filtros apropiados, en el orden correcto e inicia el procesamiento.
Ø   FilterChain: El FilterChain es una coleccion ordenada de filtros indenpendientes.
Ø   FilterOne, FilterTwo, FilterThree: Estos son los filtros individuales que son mapeados a un objetivo. El FilterChain coordina su procesamiento.
Ø   Target: El Target es el recurso que el cliente ha solicitado.


1.2.8 Model –View-Controller

El patrón de arquitectura MVC (Modelo Vista Controlador) es un patrón que define la organización independiente del Modelo (Objetos de Negocio), la Vista (interfaz con el usuario u otro sistema) y el Controlador (controlador del workflow de la aplicación).

El patrón de arquitectura "modelo vista controlador", es una filosofía de diseño de aplicaciones, compuesta por:
Ø  Modelo
o   Contiene el núcleo de la funcionalidad (dominio) de la aplicación.
o   Encapsula el estado de la aplicación.
o   No sabe nada / independiente del Controlador y la Vista.
Ø  Vista
o   Es la presentación del Modelo.
o   Puede acceder al Modelo pero nunca cambiar su estado.
o   Puede ser notificada cuando hay un cambio de estado en el Modelo.
Ø  Controlador
o   Reacciona a la petición del Cliente, ejecutando la acción adecuada y creando el modelo pertinente
Para entender cómo funciona nuestro patrón Modelo vista controlador, se debe entender la división a través del conjunto de estos tres elementos y como estos componentes se comunican unos con los otros y con otras vistas y controladores externos a el modelo principal. Para ello, es importante saber que el controlador interpreta las entradas del usuario (tanto teclado como el ratón), enviado el mensaje de acción al modelo y a la vista para que se proceda con los cambios que se consideren adecuados

Comunicación

El modelo, la vista y el controlador deben comunicarse de una manera estable los unos con los otros, de manera que sea coherente con las iteraciones que el usuario realizara. Como es lógico la comunicación entre la vista y el controlador es bastante básica pues están diseñados para operar juntos, pero los modelos se comunican de una manera diferente, un poco más sutil

Utilizado en múltiples frameworks

Ø  Java Swing

Ø  Java Enterprise Edition (J2EE)

Ø  XForms (Formato XML estándar del W3C para la especificación de un modelo de proceso de datos XML e interfaces de usuario

Ø  Como formularios web)

Ø  GTK+ (escrito en C, toolkit creado por Gnome para construir

Ø  aplicaciones gráficas, inicialmente para el sistema X Window)

Ø  ASP.NET MVC Framework (Microsoft)

Ø  Google Web Toolkit (GWT, para crear aplicaciones Ajax con Java)

Ø  Apache Struts (framework para aplicaciones web J2EE)

Ø  Ruby on Rails (framework para aplicaciones web con Ruby)

Ø  Etc., etc., etc.

 Modelo pasivo

No es necesario para el modelo hacer ninguna tener alguna disposición a él, simplemente basta con tener en cuenta su existencia. El modelo no tiene ninguna responsabilidad para comunicar los cambios a la vista porque ocurren solo por orden del usuario, por lo que esta función la llevara a cabo el controlador porque será el que interprete las ordenes de este usuario debido a que solo debe comunicar que algo ha cambiado. Por esto, el modelo es se encuentra en modo inconsciente y su participación en este caso es irrisoria.

Unión del modelo con la vista y el controlador

Como no todos los modelos pueden ser pasivos, necesitamos algo que comunique al controlador y a la vista, por lo que en este caso, sí que necesitamos el modelo, ya que solo este puede llevar a cabo los cambios necesarios al estado actual en el que estos se encuentran.
Al contrario que el modelo, que puede ser asociado a múltiples asociaciones con otras vistas y controladores, cada vista solo puede ser asociada a un único controlador, por lo que han de tener una variable de tipo controler que notificara a la vista cuál es su controlador o modelo asignado. De igual manera, el controlador tiene una variable llamada View que apunta a la vista. De esta manera, pueden enviarse mensajes directos el uno al otro y al mismo tiempo, a su modelo.
Al final, la vista es quien lleva la responsabilidad de establecer la comunicación entre los elementos de nuestro patrón MVC. Cuando la vista recibe un mensaje que concierne al modelo o al controlador, lo deja registrado como el modelo con el cual se comunicara y apunta con la variable controller al controlador asignado, enviándole al mismo su identificación para que el controlador establezca en su variable view el identificador de la vista y así puedan operar conjuntamente. El responsable de deshacer estas conexiones, seguirá siendo la vista, quitándose a sí misma como dependiente del modelo y liberando al controlador.

Diagrama de secuencia del patrón MVC


Ø  El usuario activa el evento.
Ø  El Controlador recibe el evento y lo traduce en una petición al Modelo (aunque también puede llamar directamente a la vista).
Ø  El modelo (si es necesario) llama a la vista para su actualización.
Ø  Para cumplir con la actualización la Vista puede solicitar datos al Modelo.
Ø  El Controlador recibe el control.
Objetivo
      Aislar los cambios de la interfaz gráfica de usuario y evitar que estos cambios impliquen cambiar la lógica de dominio de la aplicación.
      Reducir la distancia humano-máquina y facilitar los cambios de la interfaz de usuario.
Ventajas
Ø  La implementación se realiza de forma modular.
Ø  Clara separación entre interfaz, lógica de negocio y de presentación.
Ø  Sus vistas muestran información actualizada siempre.
Ø  Cualquier modificación que afecte al dominio, como aumentar métodos o datos contenidos, implica una modificación sólo en el modelo y las interfaces del mismo con las vistas
Ø  Las modificaciones a las vistas no afectan al modelo de dominio
Ø  Sencillez para crear distintas representaciones de los mismos datos
Ø  Facilidad para la realización de pruebas unitarias de los componentes.
Ø  Reutilización de los componentes.
Ø  Simplicidad en el mantenimiento de los sistemas.
Ø  Facilidad para desarrollar prototipos rápidos.
Ø  Los desarrollos suelen ser más escalables.
Desventajas
Ø  Está sujeto a una estructura predefinida, lo que a veces puede incrementar la complejidad del sistema. Hay problemas que son más difíciles de resolver respetando el patrón MVC
Ø  Para desarrollar una aplicación bajo el patrón de diseño MVC es necesario una mayor dedicación en los tiempos iniciales del desarrollo (desarrollar un mayor número de clases).
Ø  MVC requiere la existencia de una arquitectura inicial sobre la que se deben construir clases e interfaces para modificar y comunicar los módulos de una aplicación.
Ø  MVC es un patrón de diseño orientado a objetos por lo que su implementación es sumamente costosa y difícil en lenguajes que no siguen este paradigma.
Ejemplo de MVC en aplicaciones web
Vista:
  • la página HTML
Controlador:
  • código que obtiene datos dinámicamente y genera el contenido HTML
Modelo:
  • la información almacenada en una base de datos o en XML junto con las reglas de negocio que transforman esa información (teniendo en cuenta las acciones de los usuarios)

MVC en java swing
Modelo:
      El modelo lo realiza el desarrollador
Vista:
      Conjunto de objetos de clases que heredan de java.awt.Component
Controlador:
      El controlador es el thread de tratamiento de eventos, que captura y propaga los eventos a la vista y al modelo Clases de tratamiento de los eventos (a veces como clases anónimas) que implementan interfaces de tipo EventListener (ActionListener, MouseListener, WindowListener, etc.