En mi experiencia, en un programa tradicional de gui mvc de escritorio, el controlador termina espaciado en la vista. La mayoría de las personas no se toman el tiempo para factorizar una clase de controlador.
Patrones de diseño en Smalltalk MVC
La tríada de clases Modelo / Vista / Controlador (MVC) [KP88] se usa para construir interfaces de usuario en Smalltalk-80. Mirar los patrones de diseño dentro de MVC debería ayudarlo a ver lo que queremos decir con el término "patrón".
MVC consta de tres tipos de objetos. El Modelo es el objeto de la aplicación, la Vista es su presentación en pantalla y el Controlador define la forma en que la interfaz de usuario reacciona a la entrada del usuario. Antes de MVC, los diseños de interfaz de usuario tendían a agrupar estos objetos. MVC los desacopla para aumentar la flexibilidad y la reutilización.
MVC desacopla las vistas y los modelos al establecer un protocolo de suscripción / notificación entre ellos. Una vista debe garantizar que su apariencia refleje el estado del modelo. Cada vez que los datos del modelo cambian, el modelo notifica las vistas que dependen de él. En respuesta, cada vista tiene la oportunidad de actualizarse. Este enfoque le permite adjuntar múltiples vistas a un modelo para proporcionar diferentes presentaciones. También puede crear nuevas vistas para un modelo sin reescribirlo.
El siguiente diagrama muestra un modelo y tres vistas. (Hemos omitido los controladores por simplicidad). El modelo contiene algunos valores de datos, y las vistas que definen una hoja de cálculo, un histograma y un gráfico circular muestran estos datos de varias maneras. El modelo se comunica con sus vistas cuando cambian sus valores, y las vistas se comunican con el modelo para acceder a estos valores.
Tomado al pie de la letra, este ejemplo refleja un diseño que desacopla las vistas de los modelos. Pero el diseño es aplicable a un problema más general: desacoplar objetos para que los cambios en uno puedan afectar a cualquier número de otros sin requerir que el objeto modificado conozca los detalles de los demás. Este diseño más general es descrito por el patrón de diseño del Observador (página 293).
Otra característica de MVC es que las vistas se pueden anidar. Por ejemplo, un panel de control de botones podría implementarse como una vista compleja que contiene vistas de botones anidados. La interfaz de usuario para un inspector de objetos puede consistir en vistas anidadas que pueden reutilizarse en un depurador. MVC admite vistas anidadas con la clase CompositeView, una subclase de Vista. Los objetos CompositeView actúan igual que los objetos View; una vista compuesta se puede usar donde sea que se pueda usar una vista, pero también contiene y administra vistas anidadas.
Nuevamente, podríamos pensar en esto como un diseño que nos permite tratar una vista compuesta al igual que tratamos uno de sus componentes. Pero el diseño es aplicable a un problema más general, que ocurre cada vez que queremos agrupar objetos y tratar el grupo como un objeto individual. Este diseño más general es descrito por el patrón de diseño Compuesto (163). Le permite crear una jerarquía de clases en la que algunas subclases definen objetos primitivos (por ejemplo, Button) y otras clases definen objetos compuestos (CompositeView) que ensamblan las primitivas en objetos más complejos.
MVC también le permite cambiar la forma en que una vista responde a la entrada del usuario sin cambiar su presentación visual. Es posible que desee cambiar la forma en que responde al teclado, por ejemplo, o hacer que use un menú emergente en lugar de teclas de comando. MVC encapsula el mecanismo de respuesta en un objeto Controlador. Existe una jerarquía de clase de controladores, lo que facilita la creación de un nuevo controlador como una variación de uno existente.
Una vista utiliza una instancia de una subclase de Controlador para implementar una estrategia de respuesta particular; Para implementar una estrategia diferente, simplemente reemplace la instancia con un tipo diferente de controlador. Incluso es posible cambiar el controlador de una vista en tiempo de ejecución para permitir que la vista cambie la forma en que responde a la entrada del usuario. Por ejemplo, una vista se puede deshabilitar para que no acepte entradas simplemente dándole un controlador que ignore los eventos de entrada.
La relación Vista-Controlador es un ejemplo del patrón de diseño de la Estrategia (315). Una estrategia es un objeto que representa un algoritmo. Es útil cuando desea reemplazar el algoritmo, ya sea estática o dinámicamente, cuando tiene muchas variantes del algoritmo o cuando el algoritmo tiene estructuras de datos complejas que desea encapsular.
MVC utiliza otros patrones de diseño, como el Método de fábrica (107) para especificar la clase de controlador predeterminada para una vista y el Decorador (175) para agregar desplazamiento a una vista. Pero las relaciones principales en MVC están dadas por los patrones de diseño de Observador, Compuesto y Estrategia.