Na minha experiência, em um programa tradicional de desktop mvc gui, o controlador acaba sendo espaguetado na exibição. A maioria das pessoas não leva tempo para fatorar uma classe de controlador.
Padrões de design no Smalltalk MVC
A tríade de classes Model / View / Controller (MVC) [KP88] é usada para criar interfaces de usuário no Smalltalk-80. Observar os padrões de design no MVC deve ajudá-lo a entender o que queremos dizer com o termo "padrão".
O MVC consiste em três tipos de objetos. O Model é o objeto do aplicativo, o View é a sua apresentação na tela e o Controller define a maneira como a interface do usuário reage à entrada do usuário. Antes do MVC, os designs de interface do usuário tendiam a agrupar esses objetos. O MVC os desacopla para aumentar a flexibilidade e a reutilização.
O MVC dissocia visualizações e modelos estabelecendo um protocolo de assinatura / notificação entre eles. Uma visualização deve garantir que sua aparência reflita o estado do modelo. Sempre que os dados do modelo são alterados, o modelo notifica as visualizações que dependem dele. Em resposta, cada visualização tem a oportunidade de se atualizar. Essa abordagem permite anexar várias visualizações a um modelo para fornecer apresentações diferentes. Você também pode criar novas visualizações para um modelo sem reescrevê-lo.
O diagrama a seguir mostra um modelo e três visualizações. (Deixamos de lado os controladores por simplicidade.) O modelo contém alguns valores de dados e as visualizações que definem uma planilha, histograma e gráfico de torta exibem esses dados de várias maneiras. O modelo se comunica com suas visualizações quando seus valores mudam, e as visualizações se comunicam com o modelo para acessar esses valores.
Tomado pelo valor nominal, este exemplo reflete um design que desacopla as visualizações dos modelos. Mas o design é aplicável a um problema mais geral: dissociar objetos para que as alterações em um possam afetar muitos outros, sem exigir que o objeto alterado conheça os detalhes dos outros. Esse design mais geral é descrito pelo padrão de design do Observer (página 293).
Outro recurso do MVC é que as visualizações podem ser aninhadas. Por exemplo, um painel de controle de botões pode ser implementado como uma visualização complexa contendo visualizações de botões aninhadas. A interface do usuário para um inspetor de objetos pode consistir em visualizações aninhadas que podem ser reutilizadas em um depurador. O MVC suporta visualizações aninhadas com a classe CompositeView, uma subclasse de View. Os objetos CompositeView agem exatamente como os objetos View; uma vista composta pode ser usada onde quer que uma vista possa ser usada, mas também contém e gerencia vistas aninhadas.
Novamente, poderíamos pensar nisso como um design que nos permite tratar uma visão composta, assim como tratamos um de seus componentes. Mas o design é aplicável a um problema mais geral, que ocorre sempre que queremos agrupar objetos e tratar o grupo como um objeto individual. Esse design mais geral é descrito pelo padrão de design Composite (163). Permite criar uma hierarquia de classes na qual algumas subclasses definem objetos primitivos (por exemplo, Button) e outras classes definem objetos compostos (CompositeView) que montam as primitivas em objetos mais complexos.
O MVC também permite alterar a maneira como uma visualização responde à entrada do usuário sem alterar sua apresentação visual. Você pode alterar a forma como responde ao teclado, por exemplo, ou usar um menu pop-up em vez de teclas de comando. O MVC encapsula o mecanismo de resposta em um objeto Controller. Existe uma hierarquia de classes de controladores, facilitando a criação de um novo controlador como uma variação de um existente.
Uma visão usa uma instância de uma subclasse Controller para implementar uma estratégia de resposta específica; Para implementar uma estratégia diferente, basta substituir a instância por um tipo diferente de controlador. É até possível alterar o controlador de uma visualização em tempo de execução para permitir que a visualização mude a maneira como responde à entrada do usuário. Por exemplo, uma exibição pode ser desativada para que não aceite entrada simplesmente fornecendo um controlador que ignora os eventos de entrada.
O relacionamento View-Controller é um exemplo do padrão de design da Estratégia (315). Uma estratégia é um objeto que representa um algoritmo. É útil quando você deseja substituir o algoritmo de maneira estática ou dinâmica, quando você tem muitas variantes do algoritmo ou quando o algoritmo possui estruturas de dados complexas que você deseja encapsular.
O MVC usa outros padrões de design, como o Método de fábrica (107) para especificar a classe do controlador padrão para uma visualização e o Decorator (175) para adicionar rolagem a uma visualização. Mas os principais relacionamentos no MVC são fornecidos pelos padrões de design Observer, Composite e Strategy.