По моему опыту, в традиционной настольной программе mvc gui контроллер заканчивается спагеттизацией. Большинство людей не тратят время на выделение класса контроллера.
Шаблоны проектирования в Smalltalk MVC
Триада классов Model / View / Controller (MVC) [KP88] используется для создания пользовательских интерфейсов в Smalltalk-80. Просмотр шаблонов проектирования внутри MVC должен помочь вам понять, что мы подразумеваем под термином «шаблон».
MVC состоит из трех видов объектов. Модель - это объект приложения, представление - это экранное представление, а контроллер определяет, как пользовательский интерфейс реагирует на ввод данных пользователем. До MVC проекты пользовательского интерфейса обычно объединяли эти объекты. MVC разъединяет их для повышения гибкости и повторного использования.
MVC разделяет представления и модели, устанавливая между ними протокол подписки / уведомления. Представление должно гарантировать, что его внешний вид отражает состояние модели. Всякий раз, когда данные модели изменяются, модель уведомляет представления, которые зависят от нее. В ответ каждое представление получает возможность обновить себя. Этот подход позволяет вам присоединить несколько представлений к модели, чтобы обеспечить различные презентации. Вы также можете создавать новые виды для модели, не переписывая ее.
Следующая диаграмма показывает модель и три вида. (Мы упустили контроллеры для простоты.) Модель содержит некоторые значения данных, и представления, определяющие электронную таблицу, гистограмму и круговую диаграмму, отображают эти данные различными способами. Модель связывается со своими представлениями при изменении значений, и представления связываются с моделью для доступа к этим значениям.
Взятый за чистую монету, этот пример отражает дизайн, который разделяет представления от моделей. Но дизайн применим к более общей проблеме: разъединение объектов так, что изменения одного могут повлиять на любое количество других, не требуя, чтобы измененный объект знал детали других. Этот более общий дизайн описывается шаблоном проекта Observer (стр. 293).
Другая особенность MVC заключается в том, что представления могут быть вложенными. Например, панель управления кнопками может быть реализована как сложное представление, содержащее вложенные представления кнопок. Пользовательский интерфейс для инспектора объектов может состоять из вложенных представлений, которые можно повторно использовать в отладчике. MVC поддерживает вложенные представления с классом CompositeView, подклассом View. Объекты CompositeView действуют так же, как объекты View; составное представление может использоваться везде, где оно может использоваться, но оно также содержит вложенные представления и управляет ими.
Опять же, мы можем думать об этом как о дизайне, который позволяет нам рассматривать составное представление так же, как мы рассматриваем один из его компонентов. Но дизайн применим к более общей проблеме, которая возникает всякий раз, когда мы хотим сгруппировать объекты и рассматривать группу как отдельный объект. Этот более общий дизайн описан с помощью шаблона проектирования Composite (163). Это позволяет вам создать иерархию классов, в которой некоторые подклассы определяют примитивные объекты (например, Button), а другие классы определяют составные объекты (CompositeView), которые собирают примитивы в более сложные объекты.
MVC также позволяет вам изменить способ, которым представление реагирует на ввод пользователя, не изменяя его визуальное представление. Например, вы можете изменить способ реагирования на клавиатуру или использовать всплывающее меню вместо командных клавиш. MVC инкапсулирует механизм ответа в объекте Controller. Существует иерархия классов контроллеров, облегчающая создание нового контроллера в качестве варианта существующего.
Представление использует экземпляр подкласса Controller для реализации конкретной стратегии ответа; Чтобы реализовать другую стратегию, просто замените экземпляр на контроллер другого типа. Можно даже изменить контроллер представления во время выполнения, чтобы позволить представлению изменить способ, которым он реагирует на ввод пользователя. Например, представление можно отключить, чтобы оно не принимало ввод, просто предоставив ему контроллер, который игнорирует входные события.
Отношение View-Controller является примером шаблона проектирования Strategy (315). Стратегия - это объект, представляющий алгоритм. Это полезно, когда вы хотите заменить алгоритм статически или динамически, когда у вас много вариантов алгоритма или когда алгоритм имеет сложные структуры данных, которые вы хотите инкапсулировать.
MVC использует другие шаблоны проектирования, такие как Factory Method (107), чтобы указать класс контроллера по умолчанию для представления, и Decorator (175), чтобы добавить прокрутку к представлению. Но основные отношения в MVC задаются шаблонами проектирования Observer, Composite и Strategy.