lunes, 8 de julio de 2013

Observador (Observer )




Observador (Observer )

Este patrón crea una relación entre objetos en la que uno de ellos es observado por el resto, de manera que cuando el objeto observado cambia el resto puede automáticamente realiza alguna acción.

El patrón Observador lo utiliza Java para implementar el código que se ejecuta cuando un objeto de tipo componente cambia de estado. Java crea un objeto de clase Listener (escuchador en vez de observador) para cada operación que se

realiza con un botón (elemento observado en este caso). Ese objeto Listener contiene el código que se ejecuta al realizar la operación sobre el botón. Así, cuando un usuario pulsa un botón y el estado del componente botón cambia el Listenerque lo observa es capaz de ejecutar cierto código.

Comando (Command)





Comando (Command)

Este patrón encapsula las operaciones que realiza un objeto de forma que éstas sean a su vez objetos que cumplen una misma interfaz. Esto permite realizar, de manera sencilla, tareas como: agrupar o encolar operaciones, deshacer operaciones y parametrizar otros objetos con dichas operaciones de forma sencilla. Además, fomenta que añadir nuevos comandos sea una tarea simple y aislada.

El patrón Comando se podría utilizar, por ejemplo, para ordenar los comandos que se pueden ejecutar desde un intérprete de consola. Si el intérprete utiliza los comandos solo a través de la interfaz común, sin conocer en cada momento el comando concreto que se está ejecutando, una de las ventajas que se obtienen consiste en que el número de comandos puede crecer sin modificar dicho interprete.

Estrategia (Strategy )




Estrategia (Strategy )

En cualquier programa es habitual disponer de un conjunto de algoritmos que comparten alguna propiedad, como que pueden ejecutarse indistintamente sobre unos datos de entrada o que sean de determinado tipo. Ejemplos de tales familias serían las funciones matemáticas (seno, coseno, raíz...) o los filtros gráficos de un programa de dibujo. El patrón Estrategia permite organizar dichas familias de algoritmos, de manera que compartan una interfaz para que luego los clientes de dichas clases puedan utilizarlos indistintamente.

Un ejemplo de uso del patrón Estrategia puede ser la implementación de los diferentes algoritmos de ordenación de una lista de números.

Gracias al patrón Estrategia el usuario del contexto puede modificar su criterio de ordenación de forma dinámica.

Iterador (Iterator )


Iterador (Iterator )

Habitualmente, cuando se dispone de una colección de objetos se desea recorrerlos. El patrón Iterador permite definir objetos para realizar esta tarea. Un objeto iterador es una especie de apuntador que se puede iniciar apuntando al primer elemento de una colección y que puede desplazarse hasta el último elemento de la misma.

Java dispone de la interfaz Iterator, la cual está implementado por las diferentes clases de Collection. En realidad, estas clases son fábricas de iteradores que permiten recorrerlas.

Composición (Composite )




Composición (Composite )

Es muy común la necesidad de crear grafos dirigidos en los que cada nodo puede representar ciertos elementos de un modelo informático. Estos grafos suelen crearse utilizando el patrón Composición. Este patrón se puede definir como jerarquías de objetos que comparten una interfaz y tales que algunos de los objetos pueden formar parte de otros. Los objetos de la clase Elemento como los de Compuesto cumplen la interfaz Componente, pero los de clase Compuesto además puede contener dentro otros objetos de la clase Componente.
Por ejemplo, en una jerarquía de componentes de dibujo puede ser importante que todos los elementos que se puedan dibujar compartan cierta interfaz, pero además también es importante que unos elementos puedan formar parte de otros(los objetos línea forman parte del objeto cuadrado).




Decorador (Decorator )

Decorador (Decorator )

El patrón Decorador permite añadir nueva funcionalidad a una familia de componentes manteniendo la interfaz del componente.I mplementa un comportamiento determinado. La clase Decorador contiene un Componente en su interior. Cuando se solicita una operación al objeto de la clase Decorador esta la deriva al Componente que contiene. Las clases derivadas de Decorador son los verdaderos Decoradores que implementan una nueva funcionalidad añadida al Componente quecontienen.
-Por ejemplo, el patrón Decorador se puede utilizar, para añadir cifrado o compresión a las clases de escritura en Streams.

Así, la clase de la que derivan todas sería Writer. Un Writer concreto, por ejemplo, es el FileWriter. La misión de WriterDecorator es la de redirigir las llamadas a los diferentes métodos de la interfaz Writer hacia el Writer concreto que contiene (FileWriter, PrinterWriter...). Finalmente, las clases EncriptWriter y ZipWriter implementan cierta operación sobre el flujo de salida que se dirige hacia el Writer concreto contenido en el Decorador.

(Adapter o Wrapper )


Adaptador o Envoltorio (Adapter o Wrapper )

El patrón Envoltorio se utiliza cuando se desea que una clase utilice otra aunque ésta no cumple cierta interfaz obligatoria.
Este patrón se utiliza cuando deseamos almacenar un tipo primitivo de Java en un derivado de Collection. Por ejemplo, supongamos que deseamos almacenar un int en un Vector. Como los enteros no son elementos de la clase Object es necesario envolverlos en otra clase que contenga el entero y que, al derivar de Object, sí pueda ser insertada en el vector.

Por eso, y por otras razones, en Java existen clases como Integer, Float, Boolean o Character que son envoltorios delos tipos primitivos.




Abstract Factory

Fábrica Abstracta (Abstract Factor y )

Una de las operaciones más comunes al programar con objetos es, lógicamente, la creación de los objetos. Sin embargo, esta operación es en sí misma un foco de acoplamiento. Cuando desde un fragmento de código C invocamos la creación de unobjeto de la clase A estamos acoplando ese código con el de la clase A. Si posteriormente deseamos cambiar el objeto declase A por otro de otra clase que cumpla su misma interfaz no podremos hacerlo sin cambiar el código C.
Para evitar este problema se suele delegar la creación de los objetos a otro objeto que se denomina fábrica (factory). De esta manera desde el código C no creamos el objeto A directamente, sino que se lo pedimos a la clase fábrica. Evidentemente,para evitar el acoplamiento de la fábrica con el código C, la propia fábrica deberá obtenerse por parámetros.
Además, el patrón Fábrica permite ocultar los constructores de las clases que crea, de manera que solo se puedan crear los objetos a través de la fábrica, impidiendo de esta forma su creación de una forma no prevista.
Existen otros Patrones de Diseño para la creación de objetos. En particular se puede destacar al patrón Constructor (Builder ) y al patrón Método de Construcción (Factor y Method ). El patrón Constructor es similar al patrón
Fábrica Abstracta salvo en que una Fábrica suele crear colecciones de objetos, mientras que un constructor solo crea un tipo de objetos. Por otro lado, el patrón Método de Construcción se diferencia del patrón Fábrica en que son los propios objetos derivados los que crean, mediante un método de construcción, los objetos concretos que se necesitan en cada momento.

Otra alternativa al uso del patrón Fabrica Abstracta consiste en el uso de inyectores de dependencias. Son objetos que se programan o se configuran para que devuelvan familias concretas de productos cuando cualquier clase de la aplicación le solicita cierto tipo de producto. Estas técnicas se apoyan en las características de introspección de Java y pueden ser complementarias al uso de Fábricas Abstractas.

VALUE LIST HANDLER

VALUE LIST HANDLER

CONTEXTO

El cliente requiere una lista de elementos del servicio de presentación. El número de elementos de la lista no se conoce y puede ser muy importante en muchos casos.

PROBLEMA

La mayoría Plataforma Java 2, Enterprise Edition (J2EE) tiene una búsqueda y exigencia de consulta para buscar y listar ciertos datos. En algunos casos, como una operación de búsqueda y consulta podría producir resultados que pueden ser muy grandes. No es práctico para devolver el conjunto de resultados completo cuando las necesidades del cliente son para recorrer los resultados, en lugar de los procesos del sistema completo. Normalmente, un cliente utiliza los resultados de una consulta de sólo lectura fines, como mostrar la lista de resultados. A menudo, el cliente ve sólo los primeros registros coincidentes, y luego puede descartar los registros restantes e intentar una nueva consulta. La actividad de búsqueda a menudo no se trata de una operación inmediata en los objetos correspondientes. La práctica de obtener una lista de los valores representados en los beans de entidad llamando a un ejbFind () método, que devuelve una colección de objetos a distancia, y luego llamar a cada bean de entidad para obtener el valor de la red es muy caro y se considera una mala práctica.

Hay consecuencias asociadas con el uso de Enterprise JavaBeans (EJB) métodos de búsqueda que se traducen en grandes conjuntos de resultados. Cada implementación de contenedor tiene una cierta cantidad de sobrecarga método de búsqueda para la creación de una colección de referencias EJBObject. Rendimiento de conducta método Finder es variable, dependiendo de la implementación de contenedores de un proveedor. De acuerdo con la especificación EJB, un contenedor puede invocar ejbActivate () métodos de entidades encontradas por un método de búsqueda. Como mínimo, un método de búsqueda devuelve las claves primarias de las entidades a juego, que el contenedor devuelve al cliente como una colección de referencias EJBObject. Este comportamiento se aplica para todas las implementaciones de contenedores.Algunas implementaciones de contenedores pueden introducir método adicional overhead buscador al asociar las instancias de beans de entidad de estos casos EJBObject para dar al cliente el acceso a los beans de entidad. Sin embargo, este es un mal uso de los recursos si el cliente no está interesado en el acceso al bean o invocar sus métodos. Esta sobrecarga puede obstaculizar de forma significativa el rendimiento de aplicaciones si la aplicación incluye consultas que producen muchos resultados coincidentes.
BENEFICIOS

·         La aplicación cliente necesita un servicio de consulta eficaz para evitar tener que llamar al bean de entidad ejbFind () método y la invocación de cada objeto remoto devolvió.
·         Se necesita un mecanismo de almacenamiento en caché de servidor de nivel para atender a clientes que no pueden recibir y procesar todo el conjunto de resultados.
·         Una consulta que se ejecuta en varias ocasiones en los datos razonablemente estáticos puede ser optimizado para proporcionar resultados más rápidos. Esto depende de la aplicación y en la implementación de este patrón.
·         Métodos de búsqueda EJB no son adecuados para la navegación tablas enteras en la base de datos o para la búsqueda de grandes conjuntos de resultados de una mesa.
·         Los métodos de búsqueda pueden tener una sobrecarga considerable cuando se utiliza para encontrar un gran número de objetos de resultado. El recipiente puede crear un gran número de objetos de infraestructura para facilitar los buscadores.
·         Métodos de búsqueda EJB no son adecuados para el almacenamiento en caché los resultados. El cliente puede no ser capaz de manejar todo el conjunto de resultados en una sola llamada. Si es así, el cliente puede necesitar el almacenamiento en caché del lado del servidor y las funciones de navegación para atravesar el conjunto de resultados.
·         Métodos de búsqueda EJB han determinado construcciones de consulta y ofrecer una flexibilidad mínima. La especificación EJB 2.0 permite un lenguaje de consulta, EJB QL, para gestionadas por contenedor beans de entidad. EJB QL hace que sea más fácil escribir buscadores portátil y ofrece una mayor flexibilidad para realizar consultas.
·         Cliente quiere desplazarse hacia adelante y hacia atrás dentro de un conjunto de resultados.

SOLUCIÓN

Utilice un Value List Handler para controlar la búsqueda, almacenar en caché los resultados y presentar los resultados al cliente en una lista de productos cuyo tamaño y recorrido cumple con los requisitos del cliente.

Este patrón crea una ValueListHandler para controlar la funcionalidad de ejecución de la consulta y los resultados de almacenamiento en caché. El ValueListHandler accede directamente a DAO que puede ejecutar la consulta requerida. El ValueListHandler almacena los resultados obtenidos a partir de la DAO como una colección de objetos de transferencia. El cliente solicita la ValueListHandler para proporcionar los resultados de la consulta, según sea necesario. El ValueListHandler implementa un patrón Iterator [GoF] para proporcionar la solución.






ESTRUCTURA

Ilustra el patrón Value List Handler.




Lista de valores de controlador Diagrama de Clases.

Participantes y Colaboraciones

Muestra las interacciones de los Value List Handler.
 



Lista de valores de controlador de secuencia Diagrama

ValueListIterator

Esta interfaz puede proporcionar instalación de iteración con los siguientes métodos de ejemplo:

·         getSize () obtiene el tamaño del conjunto de resultados.
·         getCurrentElement () obtiene la corriente Transfer Object de la lista.
·         getPreviousElements (int howMany) obtiene una colección de Transfer Objects que se encuentran en la lista antes de que el elemento actual.
·         getNextElements (int howMany) obtiene una colección de objetos de transferencia que están en la lista después de que el elemento actual.
·         ResetIndex () restablece el índice para el inicio de la lista.
Dependiendo de la necesidad, otros métodos de conveniencia se pueden incluir para ser parte de la interfaz de ValueListIterator.

ValueListHandler

Este es un objeto manejador de listas que implementa la interfaz ValueListIterator. El ValueListHandler ejecuta la consulta requerida cuando lo solicite el cliente. El ValueListHandler obtiene los resultados de la consulta, que se gestiona en una colección privada representada por el objeto ValueList. El ValueListHandler crea y manipula la colección ValueList. Cuando el cliente solicita los resultados, el ValueListHandler obtiene los objetos de transferencia de la ValueList caché, crea una nueva colección de Transfer Objects, serializa la colección, y lo envía de vuelta al cliente. El ValueListHandler también rastrea el índice actual y el tamaño de la lista.

DataAccessObject

El ValueListHandler puede hacer uso de un DataAccessObject mantener separadas la ejecución de la conexión a la base de datos. El DataAccessObject proporciona una API simple para acceder a la base de datos (o cualquier otro almacén persistente), ejecutar la consulta, y recuperar los resultados.

ValueList

El ValueList es una colección (una lista) que contiene los resultados de la consulta. Los resultados se almacenan como objetos de transferencia. Si la consulta no devuelve ninguna coincidencia, entonces esta lista está vacía. El bean de sesión ValueListHandler almacena ValueList para evitar repetirse, ejecución innecesaria de la consulta.

TransferObject

El TransferObject representa una vista de objetos del registro individual de los resultados de la consulta. Es un objeto serializable inmutable que proporciona un marcador de posición para los atributos de datos de cada registro.




TRANSFER OBJECT

TRANSFER OBJECT

CONTEXTO

Los clientes de aplicaciones tienen que intercambiar datos con beans Enterprise.

PROBLEMA

Java 2 Platform, Enterprise Edition (J2EE) implementan componentes de negocio del lado del servidor como beans de sesión y beans de entidad. Algunos métodos expuestos por los componentes de negocio devuelven datos al cliente. A menudo, el cliente invoca métodos get de un objeto de negocio varias veces hasta obtener todos los valores de los atributos.
Los beans de sesión representan los servicios a las empresas y no se comparten entre los usuarios. Un bean de sesión proporciona métodos de servicios de granularidad gruesa cuando se implementa por el patrón Session Facade.
Los beans de entidad, por otro lado, son multiusuario, objetos transaccionales que representan datos persistentes. Un bean de entidad expone los valores de los atributos, proporcionando un método de acceso (también referido como un captador o método get ) para cada atributo que desea exponer.

Cada llamada al método realizado al objeto de servicio de negocio, ya sea un bean de entidad o un bean de sesión, es potencialmente remoto. Por lo tanto, en una aplicación de Enterprise JavaBeans (EJB) tales invocaciones remotas utilizan la capa de red, independientemente de la proximidad del cliente para el grano, la creación de una sobrecarga de la red. Enterprise bean llamadas a métodos pueden impregnan las capas de la red del sistema, incluso si el cliente y el contenedor EJB que sostiene el bean de entidad son a la vez corriendo en la misma JVM, OS, o una máquina física. Algunos vendedores pueden implementar mecanismos para reducir esta sobrecarga, utilizando un enfoque de acceso más directo y sin pasar por la red.

A medida que el uso de estos métodos aumenta remotas, rendimiento de la aplicación puede degradar significativamente. Por lo tanto, el uso de múltiples llamadas para conseguir métodos que devuelven valores únicos atributos es ineficiente para la obtención de valores de datos de un bean enterprise.

BENEFICIOS
·         Todo el acceso a un bean enterprise se realiza a través de interfaces remotos al bean. Cada llamada a un bean enterprise es potencialmente una llamada a un método remoto con sobrecarga de la red.

·         Normalmente, las aplicaciones tienen una mayor frecuencia de las operaciones de lectura que las transacciones de actualización. El cliente requiere los datos de la capa de negocio para la presentación, exhibición, y otros de sólo lectura tipos de procesamiento. El cliente actualiza los datos en la capa de negocio con mucha menos frecuencia de lo que lee los datos.

·         El cliente por lo general requiere valores para más de un atributo o un objeto dependiente de un bean enterprise. Por lo tanto, el cliente puede invocar múltiples llamadas remotas para obtener los datos requeridos.

·         El número de llamadas realizadas por el cliente al bean enterprise afecta al rendimiento de la red. Aplicaciones de los chattier con un aumento del tráfico entre el cliente y el servidor niveles, a menudo reducen el rendimiento de la red.


SOLUCIÓN

Utilizar un Transfer Object para encapsular los datos de empresa. Una sola llamada al método se utiliza para enviar y recuperar el Transfer Object. Cuando el cliente solicita el bean enterprise para los datos empresariales, el bean de empresa puede construir el Transfer Object, rellenarlo con sus valores de atributos, y pasarlo por valor al cliente.

Los clientes por lo general requieren más de un valor de un bean enterprise. Para reducir el número de llamadas remotas y evitar la sobrecarga asociada, lo mejor es utilizar objetos de transferencia para transportar los datos de la empresa de frijol a su cliente.

Cuando un bean enterprise utiliza un objeto de transferencia, el cliente realiza una llamada a un método remoto al bean enterprise para solicitar el Transfer Object en lugar de numerosas llamadas a métodos remotos para obtener los valores de atributos individuales. 

El grano de la empresa construye entonces una nueva instancia del objeto de transferencia, copia los valores en el objeto y lo devuelve al cliente. 

El cliente recibe el Transfer Object y luego puede invocar métodos de acceso (o comprador) en el Transfer Object para obtener los valores de los atributos individuales del objeto de transferencia. O bien, la aplicación del objeto de transferencia puede ser tal que hace que todos los atributos pública. Debido a que el Transfer Object se pasa por valor al cliente, todas las llamadas a la instancia de Transfer Object son llamadas locales en vez de invocaciones de métodos remotos.

ESTRUCTURA
Muestra el diagrama de clases que representa el patrón Transfer Object en su forma más simple.


 

 

 ARTICIPANTES Y RESPONSABILIDADES

contiene el diagrama de secuencia que muestra las interacciones del patrón Transfer Object.


 
Transferencia diagrama de secuencia de objetos

Cliente

Esto representa el cliente del bean enterprise. El cliente puede ser una aplicación de usuario final, como en el caso de una aplicación de cliente enriquecido que ha sido diseñado para acceder directamente a los granos de la empresa. El cliente puede ser delegados de negocios.

BusinessObject

El BusinessObject representa un papel importante en este modelo que puede ser cumplido por un bean de sesión, un bean de entidad, o un objeto de acceso a datos (DAO). El BusinessObject es responsable de crear el Transfer Object y devolverlo al cliente bajo petición. El BusinessObject también puede recibir datos desde el cliente en la forma de un objeto de transferencia y el uso de esos datos para realizar una actualización.

TransferObject

El TransferObject es un objeto Java serializable se refiere como un Transfer Object. Una clase Transfer Object podría proporcionar un constructor que acepta todos los atributos necesarios para crear el Transfer Object. El constructor puede aceptar todos los valores de los atributos del bean de entidad que el objeto Transfer está diseñado para celebrar. Por lo general, los miembros del Transfer Object se definen como públicos, eliminando así la necesidad de obtener y establecer métodos. Si algún tipo de protección es necesario, a continuación, los miembros podrían definirse como protegida o privada, y se proporcionan métodos para obtener los valores. Al ofrecer ningún método para establecer los valores, un objeto de transferencia está protegido contra modificaciones después de su creación. Si se permite que sólo unos pocos miembros que modificarse para facilitar las actualizaciones, a continuación, se pueden proporcionar métodos para ajustar los valores. Por lo tanto, la creación de objetos de transferencia varía dependiendo de los requerimientos de una aplicación. Se trata de una opción de diseño en cuanto a si los atributos de la transferencia de objetos son privados y acceder a través de captadores y definidores, o todos los atributos se hacen públicas.

FilterChain

El FilterChain es una colección ordenada de filtros independientes.

FilterOne, FilterTwo, FilterThree

Estos son los filtros individuales que se asignan a un objetivo. El FilterChain coordina su procesamiento.


MODELO VISTA CONTROLADOR Modelo Vista Controlador (MVC) es un patrón de arquitectura de software que separa los datos de una aplicación, la interfaz de usuario, y la lógica de control en tres componentes distintos. El patrón MVC se ve frecuentemente enaplicaciones web, donde la vista es la página HTML y el código que provee de datos dinámicos a la página, el modelo es el Sistema de Gestión de Base de Datos y la Lógica de negocio y el controlador es el responsable de recibir loseventos de entrada desde la vista FINALIDAD DEL MVC La finalidad del modelo es mejorar la reusabilidad por medio del desacople entre la vista y el modelo. El modelo es el responsable de: 1. Acceder a la capa de almacenamiento de datos. Lo ideal es que el modelo sea independiente del sistema de almacenamiento. 2. Define las reglas de negocio (la funcionalidad del sistema). Un ejemplo de regla puede ser: “Si la mercancía pedida no está en el almacén, consultar el tiempo de entrega estándar del proveedor”. 3. Lleva un registro de las vistas y controladores del sistema. 4. Si estamos ante un modelo activo, notificará a las vistas los cambios que en los datos pueda producir un agente externo (por ejemplo, un fichero bath que actualiza los datos, un temporizador que desencadena una inserción, etc). El controlador es el responsable de: 1. Recibe los eventos de entrada (un clic, un cambio en un campo de texto, etc.). 2. Contiene reglas de gestión de eventos, del tipo “SI Evento Z, entonces Acción W”. Estas acciones pueden suponer peticiones al modelo o a las vistas. Una de estas peticiones a las vistas puede ser una llamada al método “Actualizar()”. Una petición al modelo puede ser “Obtener_tiempo_de_entrega( nueva_orden_de_venta )”. Las vistas son responsables de: 1. Recibir datos del modelo y los muestra al usuario. 2. Tienen un registro de su controlador asociado (normalmente porque además lo instancia). 3. Pueden dar el servicio de “Actualización()”, para que sea invocado por el controlador o por el modelo (cuando es un modelo activo que informa de los cambios en los datos producidos por otros agentes). • Ventajas que trae utilizar el MVC 1. Es posible tener diferentes vistas para un mismo modelo (eg. representación de un conjunto de datos como una tabla o como un diagrama de barras). 2. Es posible construir nuevas vistas sin necesidad de modificar el modelo subyacente. 3. Proporciona un mecanismo de configuración a componentes complejos muchos más tratable que el puramente basado en eventos (el modelo puede verse como una representación estructurada del estado de la interacción). Orígenes del mvc Basado en información histórica, puede decirse que este fue descrito por primera vez en 1979 por Trygve Reenskaug, trabajador de Smalltalk, en unos laboratorios de gran investigación de Xerox. • Flujo que sigue el control en una implementación general de un MVC Aunque se pueden encontrar diferentes implementaciones de MVC, el flujo que sigue el control generalmente es el siguiente: • El usuario interactúa con la interfaz de usuario de alguna forma (por ejemplo, el usuario pulsa un botón, enlace) • El controlador recibe (por parte de los objetos de la interfaz-vista) la notificación de la acción solicitada por el usuario. El controlador gestiona el evento que llega, frecuentemente a través de un gestor de eventos (handler) o callback. • El controlador accede al modelo, actualizándolo, posiblemente modificándolo de forma adecuada a la acción solicitada por el usuario (por ejemplo, el controlador actualiza el carro de la compra del usuario). Los controladores complejos están a menudo estructurados usando un patrón de comando que encapsula las acciones y simplifica su extensión. • El controlador delega a los objetos de la vista la tarea de desplegar la interfaz de usuario. La vista obtiene sus datos del modelo para generar la interfaz apropiada para el usuario donde se refleja los cambios en el modelo (por ejemplo, produce un listado del contenido del carro de la compra • La interfaz de usuario espera nuevas interacciones del usuario, comenzando el ciclo nuevamente. • MVC tiene por objeto separar la lógica del negocio de las consideraciones de la interfaz de usuario para que los desarrolladores puedan modificar cada parte más fácilmente sin afectar a la otra. En MVC el modelo representa la información (los datos) y las reglas del negocio; la vista contiene elementos de la interfaz de usuario como textos, formularios de entrada; y el controlador administra la comunicación entre la vista y el modelo. • Más alla del MVC, Yii tambien introduce un front-controller llamado aplicación el cual representa el contexto de ejecución del procesamiento del pedido. La aplicación resuelve el pedido del usuario y la dispara al controlador apropiado para tratamiento futuro. El patrón de arquitectura "modelo vista controlador", es una filosofía de diseño de aplicaciones, compuesta por: 1. • Modelo Contiene el núcleo de la funcionalidad (dominio) de la aplicación. Encapsula el estado de la aplicación. No sabe nada / independiente del Controlador y la Vista. 2. • Vista Es la presentación del Modelo. Puede acceder al Modelo pero nunca cambiar su estado. Puede ser notificada cuando hay un cambio de estado en el Modelo. 3. • Controlador 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 4. 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 5. 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. 6. 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, si 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 cual 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 si misma como dependiente del modelo y liberando al controlador. 7. Implementación del Modelo Vista Controlador: Structs Para mejorar la reutilización, extensibilidad, flexibilidad y el resto de elementos de las aplicaciones, proponemos el uso se puede usar el siguiente patrón de diseño, entendiendo que este es un descriptor de objetos y clases adaptadas para resolver un problema. Una aplicación basada en Struts, tiene un componente básico llamado ActionServlet. Este es un servlet, que tramita las peticiones de los clientes delegando a un componente definido por el usuario por cada petición. Este Servlet es el punto central del framework, aunque no es necesario que todas la actividad fluya a través de él. En una aplicación basada en Struts se pueden hacer peticiones a una JSP que contengan o no "tag libraries" de Struts, sin pasar por el Servlet ActionServlet. El ActionServlet (controlador) de Struts captura y encamina las peticiones HTTP que llegan a la aplicación (toma la decisión de a dónde enviar la petición HTTP), a otros componentes de aplicación. Estos componentes pueden ser páginas JSP o instancias de una subclase de la clase org.apache.struts.action.Actionque el propio framework suministra. Cuando se inicia el Servlet ActionServlet, carga y analiza la información de un fichero que contiene la configuración de la aplicación para aplicar las características de Struts. Entre otras cosas, el fichero de configuración define las correspondencias que existen entre las peticiones HTTP que captura el Servlet controlador y las acciones que van a tratar esa petición. Estas correspondencias son manipuladas como instancias de la clase org.apache.struts.action.ActionMapping El navegador lanza una petición HTTP a la aplicación, evento que es capturado por el servidor de aplicaciones y encaminado al componente correspondiente del modelo vista controlador para su tratamiento.

MODELO VISTA CONTROLADOR

Modelo Vista Controlador (MVC) es un patrón de arquitectura de software que separa los datos de una aplicación, la interfaz de usuario, y la lógica de control en tres componentes distintos. El patrón MVC se ve frecuentemente enaplicaciones web, donde la vista es la página HTML y el código que provee de datos dinámicos a la página, el modelo es el Sistema de Gestión de Base de Datos y la Lógica de negocio y el controlador es el responsable de recibir loseventos de entrada desde la vista

FINALIDAD DEL MVC
La finalidad del modelo es mejorar la reusabilidad por medio del desacople entre la vista y el modelo. 
El modelo es el responsable de:
1.    Acceder a la capa de almacenamiento de datos. Lo ideal es que el modelo sea independiente del sistema de almacenamiento.
2.    Define las reglas de negocio (la funcionalidad del sistema). Un ejemplo de regla puede ser: “Si la mercancía pedida no está en el almacén, consultar el tiempo de entrega estándar del proveedor”.
3.    Lleva un registro de las vistas y controladores del sistema.
4.    Si estamos ante un modelo activo, notificará a las vistas los cambios que en los datos pueda producir un agente externo (por ejemplo, un fichero bath que actualiza los datos, un temporizador que desencadena una inserción, etc).

El controlador es el responsable de:
1.    Recibe los eventos de entrada (un clic, un cambio en un campo de texto, etc.).
2.    Contiene reglas de gestión de eventos, del tipo “SI Evento Z, entonces Acción W”. Estas acciones pueden suponer peticiones al modelo o a las vistas. Una de estas peticiones a las vistas puede ser una llamada al método “Actualizar()”. Una petición al modelo puede ser “Obtener_tiempo_de_entrega( nueva_orden_de_venta )”.
Las vistas son responsables de:
1.    Recibir datos del modelo y los muestra al usuario.
2.    Tienen un registro de su controlador asociado (normalmente porque además lo instancia).
3.    Pueden dar el servicio de “Actualización()”, para que sea invocado por el controlador o por el modelo (cuando es un modelo activo que informa de los cambios en los datos producidos por otros agentes).
·         Ventajas que trae utilizar el MVC
1.    Es posible tener diferentes vistas para un mismo modelo (eg. representación de un conjunto de datos como una tabla o como un diagrama de barras).
2.    Es posible construir nuevas vistas sin necesidad de modificar el modelo subyacente.
3.    Proporciona un mecanismo de configuración a componentes complejos muchos más tratable que el puramente basado en eventos (el modelo puede verse como una representación estructurada del estado de la interacción).

Orígenes del mvc
Basado en información histórica, puede decirse que este fue descrito por primera vez en 1979 por Trygve Reenskaug, trabajador de Smalltalk, en unos laboratorios de gran investigación de Xerox.
·         Flujo que sigue el control en una implementación general de un MVC
Aunque se pueden encontrar diferentes implementaciones de MVC, el flujo que sigue el control generalmente es el siguiente:
·         El usuario interactúa con la interfaz de usuario de alguna forma (por ejemplo, el usuario pulsa un botón, enlace)
·         El controlador recibe (por parte de los objetos de la interfaz-vista) la notificación de la acción solicitada por el usuario. El controlador gestiona el evento que llega, frecuentemente a través de un gestor de eventos (handler) o callback.
·         El controlador accede al modelo, actualizándolo, posiblemente modificándolo de forma adecuada a la acción solicitada por el usuario (por ejemplo, el controlador actualiza el carro de la compra del usuario). Los controladores complejos están a menudo estructurados usando un patrón de comando que encapsula las acciones y simplifica su extensión.
·         El controlador delega a los objetos de la vista la tarea de desplegar la interfaz de usuario. La vista obtiene sus datos del modelo para generar la interfaz apropiada para el usuario donde se refleja los cambios en el modelo (por ejemplo, produce un listado del contenido del carro de la compra
·         La interfaz de usuario espera nuevas interacciones del usuario, comenzando el ciclo nuevamente.
·         MVC tiene por objeto separar la lógica del negocio de las consideraciones de la interfaz de usuario para que los desarrolladores puedan modificar cada parte más fácilmente sin afectar a la otra. En MVC el modelo representa la información (los datos) y las reglas del negocio; la vista contiene elementos de la interfaz de usuario como textos, formularios de entrada; y el controlador administra la comunicación entre la vista y el modelo.
·         Más alla del MVC, Yii tambien introduce un front-controller llamado aplicación el cual representa el contexto de ejecución del procesamiento del pedido. La aplicación resuelve el pedido del usuario y la dispara al controlador apropiado para tratamiento futuro.
El patrón de arquitectura "modelo vista controlador", es una filosofía de diseño de aplicaciones, compuesta por:
1.      Modelo
Contiene el núcleo de la funcionalidad (dominio) de la aplicación.
Encapsula el estado de la aplicación.
No sabe nada / independiente del Controlador y la Vista.
2.      Vista
Es la presentación del Modelo.
Puede acceder al Modelo pero nunca cambiar su estado.
Puede ser notificada cuando hay un cambio de estado en el Modelo.
3.      Controlador
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
4.    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
5.    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.
6.    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, si 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 cual 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 si misma como dependiente del modelo y liberando al controlador.
7.    Implementación del Modelo Vista Controlador: Structs
Para mejorar la reutilización, extensibilidad, flexibilidad y el resto de elementos de las aplicaciones, proponemos el uso se puede usar el siguiente patrón de diseño, entendiendo que este es un descriptor de objetos y clases adaptadas para resolver un problema.
Una aplicación basada en Struts, tiene un componente básico llamado ActionServlet. Este es un servlet, que tramita las peticiones de los clientes delegando a un componente definido por el usuario por cada petición. Este Servlet es el punto central del framework, aunque no es necesario que todas la actividad fluya a través de él. En una aplicación basada en Struts se pueden hacer peticiones a una JSP que contengan o no "tag libraries" de Struts, sin pasar por el Servlet ActionServlet.
El ActionServlet (controlador) de Struts captura y encamina las peticiones HTTP que llegan a la aplicación (toma la decisión de a dónde enviar la petición HTTP), a otros componentes de aplicación. Estos componentes pueden ser páginas JSP o instancias de una subclase de la clase org.apache.struts.action.Actionque el propio framework suministra.
Cuando se inicia el Servlet ActionServlet, carga y analiza la información de un fichero que contiene la configuración de la aplicación para aplicar las características de Struts. Entre otras cosas, el fichero de configuración define las correspondencias que existen entre las peticiones HTTP que captura el Servlet controlador y las acciones que van a tratar esa petición. Estas correspondencias son manipuladas como instancias de la clase org.apache.struts.action.ActionMapping


El navegador lanza una petición HTTP a la aplicación, evento que es capturado por el servidor de aplicaciones y encaminado al componente correspondiente del modelo vista controlador para su tratamiento.