jueves, 7 de mayo de 2015

Front Controller

Front Controller

Contexto

El mecanismo de manejo de peticiones de la capa de presentación debe controlar y coordinar el procesamiento de todos los usuarios a través de varias peticiones. Dichos mecanismos de control se pueden manejar de una forma centralizada o descentralizada.

Problema

El sistema requiere un punto de acceso centralizado para que el manejo de peticiones de la capa de presentación soporte la integración de los servicios del sistema, recuperación de contenidos, control de vistas, y navegación. Cuando el usuario accede a la vista directamente sin pasar un mecanismo centralizado, podrían ocurrir dos problemas:

          Se requiere que cada vista proporcione sus propios servicios del sistema, lo que normalmente                           resulta en duplicación de código.

          La vista de navegación se deja a los visores. Esto podría resultar en una mezcla de contenidos y                         navegación.

Además, el control distribuido es más difícil de mantener, ya que los cambios se tienen que realizar en numerosos lugares.

Causas

El procesamiento de servicios del sistema comunes se completa por cada petición. Por ejemplo, el servicio de seguridad completa los chequeos de autentificación y autorización.

La lógica se maneja mejor en una localización central en lugar de estar replicada dentro de varias vistas.
Existen puntos de decisión con respecto a la recuperación y manipulación de los datos.

Se utilizan varias vistas para responder a peticiones de negocio similares.

Puede ser muy útil un punto de contacto centralizado para manejar una petición, por ejemplo, para controlar y grabar el camino de un usuario por la site.

Los servicios del sistema y la lógica de control de vistas son relativamente sofisticados.

Solución

Usar un controlador como el punto inicial de contacto para manejar las peticiones. El controlador maneja el control de peticiones, incluyendo la invocación de los servicios de seguridad como la autentificación y autorización, delegar el procesamiento de negocio, controlar la elección de una vista apropiada, el manejo de errores, y el control de la selección de estrategias de creación de contenido.

El controlador proporciona un punto de entrada centralizado que controla y maneja las peticiones Web. Centralizando los puntos de decisión y control, el controlador también ayuda a reducir la cantidad de código Java, llamadas a scriptles, embebidos en la página JavaServer Pages (JSP).

Centralizar el control en el controlador y reduciendo la lógica de negocios en la vista permite reutilizar el código entre peticiones. Es una aproximación preferible a la alternativa de embeber código en varias vistas porque esta aproximación trata con entornos más propensos a errores, y de reutilización del tipo copiar-y-pegar.

Típicamente, un controlador se coordina con un componente dispatcher. Los dispatchersson responsable del control de la vista y de la navegación. Así, un dispatcher elige la siguiente vista por el usuario y dirige el control al recurso. Los dispatchers podrían encapsularse directametne dentro del controlador o se puede extraer en un componente separado.

Aunque el patrón Front Controller sugiere la centralización del manejo de peticiones, no limita el número de manejadores en el sistema, como lo hace Singleton. Una aplicación podría utilizar varios controladores en un sistema, cada uno mapeado a un conjunto de servicios distintos.

Estructura

La siguiente figura representa el diagrama de clases del patrón Front Controller.


Participantes y Responsabilidades

La siguiente figura representa el diagrama de la secuencia del patrón Front Controller. Muestra como el controlador maneja una petición:



Controller
  • El controlador 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
  • Un 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.
  • Un dispatcher se puede encapsular dentro de un controlador o se puede separar en otro componente que trabaja de forma coordinada. El dispatcher puede proporcionar un re-envío estático de la vista o un mecanismo de re-envío más sofisticado.
  • El dispatcher utiliza un objeto RequestDispatcher (soportado en la especificación Servlet) y encapsula algún procesamiento adicional.
Helper
  • Un 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.
  • Una vista podría trabajar con cualquier número de helpers, que normalmente son componentes JavaBeans (JSP 1.0+) y etiquetas personalizadas (JSP 1.1+). Además, un helper podría representar un objeto Command o un Transformador XSL, que se utiliza en combinación con una hoja de estilos para adaptar y convertir el modelo a la forma apropiada.
View
  • Una Vista 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.
Estrategias
  • Hay varias estrategias para implementar un controlador.
Servlet Front
  • La estrategia de Servlet Frontal sugiere la implementación del controlador como un servlet. Aunque semánticamente equivalente, es mejor que la Estrategia de JSP Frontal. El controlador maneja los aspectos del manejo de peticiones que están relacionados con el procesamiento de negocio y el control de flujo. Estas responsabilidades están relacionadas con, pero son lógicamente independientes, del formateo de display, y es más apropiado encapsularlas en un servlet en lugar de en una página JSP.
Esta estrategia tiene algunos potenciales inconvenientes. En particular, no permite utilizar algunas de las utilidadess del entorno de ejecución JSP, como es el relleno automático de parámetros de la peticion. Afortunadamente, este inconveniente es mínimo porque es relativamente fácil crear u obtener utilidades similares para su uso general. Abajo podemos ver un ejemplo de la Estrategia Servlet Front:

public class EmployeeController extends HttpServlet {
  // Initializes the servlet.
  public void init(ServletConfig config) throws
    ServletException {
    super.init(config);
  }

  // Destroys the servlet.
  public void destroy() {
  }

  /** Processes requests for both HTTP 
   * <code>GET</code> and <code>POST</code> methods.
   * @param request servlet request
   * @param response servlet response
   */
  protected void processRequest(HttpServletRequest
    request, HttpServletResponse response)
    throws ServletException, java.io.IOException {
    String page;

    /**ApplicationResources provides a simple API
     * for retrieving constants and other
     * preconfigured values**/
    ApplicationResources resource =
      ApplicationResources.getInstance();
    try {

      // Use a helper object to gather parameter
      // specific information.
      RequestHelper helper = new
         RequestHelper(request);

      Command cmdHelper= helper.getCommand();

      // Command helper perform custom operation
      page = cmdHelper.execute(request, response);

    }
    catch (Exception e) {
      LogManager.logMessage(
        "EmployeeController:exception : " +
        e.getMessage());
      request.setAttribute(resource.getMessageAttr(),  
        "Exception occurred : " + e.getMessage());
      page = resource.getErrorPage(e);
    }
    // dispatch control to view
    dispatch(request, response, page);
  }

  /** Handles the HTTP <code>GET</code> method.
   * @param request servlet request
   * @param response servlet response
   */
  protected void doGet(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, java.io.IOException {
      processRequest(request, response);
  }

  /** Handles the HTTP <code>POST</code> method.
   * @param request servlet request
   * @param response servlet response
   */
  protected void doPost(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
  }

  /** Returns a short description of the servlet */
  public String getServletInfo() {
    return "Front Controller Pattern" +
      " Servlet Front Strategy Example";
  }

  protected void dispatch(HttpServletRequest request,
    HttpServletResponse response,
    String page)
  throws  javax.servlet.ServletException,
    java.io.IOException {
    RequestDispatcher dispatcher =
      getServletContext().getRequestDispatcher(page);
    dispatcher.forward(request, response);
  }
}

JSP Front
  • La estrategia de JSP Frontal sugiere la implementación del controlador como una página JSP. Aunque semánticamente equivalente, es mejor utilizar la Estrategia de Servlet Frontal. Como el controlador maneja el procesamiento que no está especificamente relacionado con el formateo de la salida, no tiene sentido implementar este componente como una página JSP.
La implementación del controlador como una página JSP tiene otra razón para no ser la preferida: Requiere que un desarrollador de software trabaje con una página de etiquetas para poder modificar la lógica del control de peticiones. El siguiente listado es un ejemplo de esta estrategia:

<%@page contentType="text/html"%>
<%@ page import="corepatterns.util.*" %>
<html>
<head><title>JSP Front Controller</title></head>
<body>

<h3><center> Employee Profile </h3>

<%
/**Control logic goes here...
  At some point in this code block we retrieve
  employee information, encapsulate it within a value
  object and place this bean in request scope with the
  key "employee". This code has been omitted.

  We either dispatch to another JSP at this point or
  simply allow the remaining portions of scriptlet
  code to execute**/
%>
  <jsp:useBean id="employee" scope="request"
    class="corepatterns.util.EmployeeTO"/>
<FORM method=POST >
<table width="60%">
<tr>
    <td>  First Name : </td>
<td>  <input type="text"
        name="<%=Constants.FLD_FIRSTNAME%>"
        value="<jsp:getProperty name="employee"
        property="firstName"/>"> </td>
</tr>
<tr>
    <td>  Last Name : </td>
    <td>    <input type="text"
        name="<%=Constants.FLD_LASTNAME%>" 
        value="<jsp:getProperty name="employee"
        property="lastName"/>"></td>
</tr>
<tr>
    <td>  Employee ID : </td>
    <td>    <input type="text"
        name="<%=Constants.FLD_EMPID%>"
        value="<jsp:getProperty name="employee"
        property="id"/>"> </td>
</tr>
<tr>
    <td>    <input type="submit"
        name="employee_profile"> </td>
    <td> </td>
</tr>
</table>
</FORM>

</body>
</html>

Command and Controller
  • Basada en el patrón Commando de [GoF], la estrategia de Commando y Controlador sugiere proporcionar un interface genérico para los componentes helper en los que el controlador podría delegar responsabilidades, minimizando el acoplamiento entre estos componentes. Añadir o modificar el trabajo que necesitan realizar estos helpers no requiere ningún cambio en el interface entre el controlador y ellos, sino en el tipo y/o contenido de los comandos. Esto proporciona un mecanismo flexible y fácilmente extensible para que los desarrolladores puedan añadir comportamientos al manejo de peticiones.
Finalmente, como el procesamiento de comandos no está acoplado a la invocación de comandos, el mecanismo de procesamiento de comandos se podría reutilizar para varios tipos de clientes, no sólo con los navegadores Web. Esta estrategia también facilita la creación de comandos compuestos. Aquí tenemos un ejemplo de esta estrategia:

/** This processRequest method is invoked from both
  * the servlet doGet and doPost methods **/
protected void processRequest(HttpServletRequest
  request, HttpServletResponse response)
  throws ServletException, java.io.IOException {

  String resultPage;
  try {
    RequestHelper helper = new RequestHelper(request);

    /** the getCommand() method internally uses a
     factory to retrieve command objects as follows:
     Command command = CommandFactory.create(
        request.getParameter("op"));
    **/
     Command command =  helper.getCommand();

    // delegate request to a command object helper
    resultPage = command.execute(request, response);
  }
  catch (Exception e) {
    LogManager.logMessage("EmployeeController",
      e.getMessage() );
    resultPage = ApplicationResources.getInstance().
                      getErrorPage(e);
  }

  dispatch(request, response, resultPage);
}

Consecuencias

Centraliza el Control 
  • Un controlador proporciona un lugar central para manejar los servicios del sistema y la lógica de negocios entre varias peticiones. Un controlador maneja el procesamiento de la lógica de negocio y el manejo de peticiones. El acceso centralizado a una aplicación significa que las peticiones se pueden seguir y guardar muy fácilmente. Debemos tener en mente, que como controles centralizados, es posible presentar un sólo punto de fallo. En la práctica, esto ráramente es un problema, ya que típicamente existe múltiples controladores, bien dentro de un sólo servidor o en un cluster.
Mejora la Manejabilidad de la Seguridad 
  • Un controlador centraliza el control, propocionando un punto de choque para intentos de accesos ilícitos en la aplicación Web. Además, auditar una sola entrada en la aplicación requiere menos recursos que distribuir los chequeos de seguridad entre todas las páginas.
Mejora la Reutilizabilidad 
  • Un controlador promueve el particionamiento limpio de la aplicación y aconseja la reutilización, ya que el código que es común entre los componentes se mueve dentro de un controlador o es manejado por un controlador.
Patrones Relacionados

View Helper 
  • El patrón Front Controller, en conjunción con el patrón View Helper, describe la creación de lógica de negocio de la vista y proporciona un punto central de control y reenvio. El flujo lógico se construye dentro del controlador y el código de manejo de datos se mueve hacia los helpers.
Intercepting Filter 
  • Tanto Intercepting Filter como Front Controller describen formas de centralizar el control de ciertos tipos de procesamiento de peticiones, sugiriendo diferentes aproximaciones a este problema.
Dispatcher View y Service to Worker 
  • Los patrones Dispatcher View y Service to Worker son otras forma de nombrar la combinación entre el patrón View Helper con un dispatcher, y un patrón Front Controller. Dispatcher View y Service to Worker, aunque estructuralmente son iguales, describen diferentes divisiones de labores entre los componentes.
Referencias

http://programacion.net/articulo/catalogo_de_patrones_de_diseno_j2ee_i_-_capa_de_presentacion_240/4

Intercepting Filter

Intercepting Filter

Contexto

El mecanismo de manejo de peticiones de la capa de presentación recibe muchos tipos diferentes de peticiones, cada uno de los cuales requiere varios tipos de procesamiento. Algunas peticiones simplemente requieren su reenvió al componente manejador apropiado, mientras que otras peticiones deben ser modificadas, auditadas, o descomprimidas antes de su procesamiento posterior.

Problema

Se requiere un pre-procesamiento y un post-procesamiento de unas peticiones o respuestas de un cliente Web.

Cuando una petición entra a una aplicación Web, normalmente debe pasar varios test de entrada antes del estado de procesamiento principal. Por ejemplo,

¿Se ha autentificado el cliente?
¿Tiene el cliente una sesión válida?
¿La dirección IP del cliente es de una red conocida?
¿Viola alguna restricción el path de la petición?
¿Qué codificación usa el cliente para enviar los datos?
¿Soportamos el tipo de navegador del cliente?

Algunos de estos chequeos son tests, que resultan en una respuesta de si o no que determina si continuará el procesamiento. Otros chequeos manipulan el stream de datos entrantes a una forma aceptable para el procesamiento.

La solución básica consiste en un serie de chequeos condicionales, si cualquiera de ellos falla la petición se aborta. Las sentencias if/else anidadas son una estrategia estándar, pero esta solución tiene fragilidad de código y un estilo de programación de copiar-y-pegar, porque el flujo del filtrado y la acción de los filtros se compila dentro de la aplicación.

La clave para solventar este problema de una forma flexible y no obstrusiva es tener un mecanismo simple para añadir y eliminar componentes de procesamiento, en el que cada componente completa una acción de filtrado específica.

Causas

Procesamiento común, como un chequeo del esquema de codificación de datos o la información de login de cada petición, completo por cada petición.

Se desea la centralización de la lógica común.
Se debería facilitar la adición o eliminación de sevicios sin afectar a los componentes existentes, para que se puedan utilizar en gran variedad de combinaciones, como
                Logging y autentificación.
                Depuración y transformación de la salida para un cliente específico
                Descomprensión y conversión del esquema de codificación de la entrada.

Solución

Crear filtros conectables para procesar servicios comunes de una forma estándar sin requerir cambios en el código principal del procesamiento de la petición. Los filtros interceptan las peticiones entrantes y las respuestas salientes, permitiendo un pre y post-procesamiento. Podemos añadir y eliminar estos filtros a discrección, sin necesitar cambios en nuestro código existente.

Podemos, en efecto, decorar nuestro procesamiento principal con una veriedad de servicios comunes, como la seguridad, el logging, el depurado, etc. Estos filtros son componentes independientes del código de la aplicación principal, y pueden añadirse o eliminarse de forma declarativa. Por ejemplo, se podría modificar un fichero de configuración de despliegue para configurar una cadena de filtros. Cuando un cliente pide un recurso que corresponde con este mapeo de URL configurado, se procesa cada filtro de la cadena antes de poder invocar el recurso objetivo.

Estructura

La siguiente figura representa el diagrama de clases del patrón Intercepting Filter.

Participantes y Responsabilidades

La siguiente figura representa el diagrama de la secuencia del patrón Intercepting Filter.



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 collection 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.
Estrategias

Custom Filter

El filtro se implementa mediante una estrategia personalizada definida por el desarrollador. Esto es menos flexible y menos poderoso que la preferida Estrategia de Filtro Estándar que veremos en la siguiente sección y que sólo está disponible en contenedores que soporten la especificación servlet 2.3. La estrategia de filtro personalizado es menos poderosa porque no puede proporcionar una envoltura para los objetos request y response de una forma estándar y portable. Además, el objeto request no se puede modificar, y se debe introducir alguna suerte de mecanismo de buffer si los filtros son para controlar los streams de salida. Para implementar esta estrategia, el desarrollador podría utilizar el patrón Decorator [GoF] para envolver los filtros alrededor de la lógica principal del procesamiento de la petición. Por ejemplo, podría haber un filtro de depuración que envuelva un filtro de autentificación. Los siguientes fragmentos de código muestran como se podrían crear estos mecanismos de forma programátia:

DebuggingFilter:

public class DebuggingFilter implements Processor {
  private Processor target;

  public DebuggingFilter(Processor myTarget) {
    target = myTarget;
  }

  public void execute(ServletRequest req,
  ServletResponse res) throws IOException,
    ServletException    {
    //Do some filter processing here, such as
    // displaying request parameters
    target.execute(req, res);
  }
}
CoreProcessor:

public class CoreProcessor implements Processor {
  private Processor target;
  public CoreProcessor()   {
    this(null);
  }

  public CoreProcessor(Processor myTarget)   {
    target = myTarget;
  }

  public void execute(ServletRequest req,
      ServletResponse res) throws IOException,
      ServletException   {
    //Do core processing here
  }
}
En el controlador servlet, hemos delegado en un método llamado processRequest para manejar las peticiones entrantes:

public void processRequest(ServletRequest req,
  ServletResponse res)
  throws IOException, ServletException {
  Processor processors = new DebuggingFilter(
    new AuthenticationFilter(new CoreProcessor()));
  processors.execute(req, res);

  //Then dispatch to next resource, which is probably
  // the View to display
  dispatcher.dispatch(req, res);
}

Consecuencias

Centraliza el Control con Controladores de Acoplamiento Ligero 
  • Los filtros proporcionan un lugar centralaizado para controlar el procesamiento a través de múltiples peticiones, como lo hace el controlador. Los filtros están mejor preparados para manejar las peticiones y respuestas para el control último por un recurso objetivo, como un controlador. Además, un controlador frecuentemente junta el control de numerosos sevicios comunes y no relacionados, como la autentificación, el login, la encriptación, etc., mientras que los filtros nos permiten controladores de acoplamiento más ligero, que se pueden combinar.
Mejora la Reutilización 
  • Los filtros promueven la limpieza del particionamiento de la aplicación y aconsejan su reutilización. Estos interceptores conectables se añaden y eliminan al código existente de forma transparente y debido a su interface estándar, funcionan en cualquier combinación y son reutilizables por varias presentaciones.
Configuración Declarativa y Flexible 
  • Se pueden combinar numerosos servicios en varias permutaciones sin tener que recompilar ni una sola vez el código fuente.
La Compartición Información es Ineficiente 
  • Compartir información entre filtros puede ser ineficiente, porque por definición todo filtro tiene acoplamiento ligero. Si se deben compartir grandes cantidades de información entre los filtros, esta aproximación podría ser muy costosa.
Patrones Relacionados

Front Controller 
  • El controlador resuelve algunos problemas similares, pero está mejor diseñado para manejar el procesamiento principal.
Decorator [GoF] 
  • El patrón Intercepting Filter está relacionado con el patrón Decorator, que proporciona envolturas conectables dinámicamente.
Template Method [GoF] 
  • El patrón de Plantillas de Métodos se utiliza para implementar la Estrategia de Plantilla de Filtros.
Interceptor [POSA2] 
  • El patrón Intercepting Filter está relacionado con el patron Interceptor, que permite que se pueden añadir servicios de forma transparente y dispararlos automáticamente.
Pipes and Filters [POSA1] 
  • El patrón Intercepting Filter está relacionado con el patrón Pipes and Filters.
Referencias

http://programacion.net/articulo/catalogo_de_patrones_de_diseno_j2ee_i_-_capa_de_presentacion_240/3

miércoles, 6 de mayo de 2015

Aumentar Cohesión

Aumentar Cohesión

  • Mover responsabilidades de un módulo a otro.

  • Mantener la coherencia semántica
- The cost of modifying A’ (B’) is less than the cost of modifying A (B). 
- A’’ and B’’ are unaffected by the modification. 
  • Abstraer servicios comunes
  • Tácticas arquitecturales (Otra visión)

Referencias

https://sistemas.uniandes.edu.co/~isis2503/dokuwiki/lib/exe/fetch.php?media=principal:modulo7-modificabilidad.pdf


Reducir el Grado de Acoplamiento

Reducir el Grado de Acoplamiento

  • Encapsulation/Information Hiding
Reducir la probabilidad que un cambio en un módulo se propague a otros por medio de una interface.
  • Wrappers                                                                                                    

*Una forma de encapsulamiento  
*Es una interface para un módulo que transforma o controla información para un módulo.
*“Encapsulation is intended to hide information, and transformations may be used as a portion of the hiding strategy” 

  • Subir de nivel de abstracción
*Parametrizar las actividades de una responsabilidad

  • Usar intermediarios


Modelo Vista Controlador

Modelo Vista Controlador

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
  • 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.
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.
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.

El modelo es el responsable de:
  • Acceder a la capa de almacenamiento de datos. Lo ideal es que el modelo sea independiente del sistema de almacenamiento.
  • 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".
  • Lleva un registro de las vistas y controladores del sistema.
  • 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 por lotes que actualiza los datos, un temporizador que desencadena una inserción, etc.).
El controlador es responsable de:
  • Recibe los eventos de entrada (un clic, un cambio en un campo de texto, etc.).
  • 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:
  • Recibir datos del modelo y los muestra al usuario.
  • Tienen un registro de su controlador asociado (normalmente porque además lo instancia).
  • 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).
El flujo que sigue el control generalmente es el siguiente:

  1. El usuario interactúa con la interfaz de usuario de alguna forma (por ejemplo, el usuario pulsa un botón, enlace, etc.)
  2. 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.
  3. 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.
  4. 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). El modelo no debe tener conocimiento directo sobre la vista. Sin embargo, se podría utilizar el patrón Observador para proveer cierta indirección entre el modelo y la vista, permitiendo al modelo notificar a los interesados de cualquier cambio. Un objeto vista puede registrarse con el modelo y esperar a los cambios, pero aun así el modelo en sí mismo sigue sin saber nada de la vista. El controlador no pasa objetos de dominio (el modelo) a la vista aunque puede dar la orden a la vista para que se actualice. Nota: En algunas implementaciones la vista no tiene acceso directo al modelo, dejando que el controlador envíe los datos del modelo a la vista.
  5. La interfaz de usuario espera nuevas interacciones del usuario, comenzando el ciclo nuevamente.
Referencias

http://si.ua.es/es/documentacion/asp-net-mvc-3/1-dia/modelo-vista-controlador-mvc.html