Apple docs на самом деле объясняет MVC лучше, чем что-либо еще, что я читал. В основном путаница, связанная с MVC, связана с тем, что это составной шаблон. Он состоит из множества основных шаблонов. Хотя MVC не обсуждался в Шаблоне проектирования Бандой четырех, основные шаблоны обсуждались.
Основное отличие, я думаю, заключается в том, что в мире Apple контроллер является шаблоном посредника в дополнение к тому, чем он обычно является.
Таким образом, в отличие от моделей традиционного подхода в мире Apple не уведомляют об изменениях. На самом деле они никого не уведомляют. Если вы хотите изменить модель, вы должны сделать это через контроллер, чтобы все были уведомлены об изменениях.
Я думаю, что этот подход намного лучше, чем традиционный. Он не накладывает ограничений на объекты модели. Им не нужно реализовывать какой-либо конкретный интерфейс. Им просто нужно решать проблемы, связанные с предметной областью. Таким образом, вы можете очень легко повторно использовать их в других приложениях.
При таком подходе в основном приходится переписывать объекты контроллера. Конечно, Apple изменила это с помощью привязок. Но если вы не используете привязки, контроллеры зависят от приложения.
Использование Apple MVC в C++
На самом деле я следовал дизайну Apple, когда программировал приложения на C++ с использованием Qt. Представления принадлежат QWidget. Я поместил весь код, связанный с внешним видом, в подкласс QWidget. Затем я делаю свой контроллер подклассом QObject и заставляю его создавать объекты представления и подключать сигналы от QWidgets к слотам в моем контроллере QObject. Мой модельный класс — это обычный класс, который ничего не наследует от Qt и реализует бизнес-логику. Он модифицируется слотами контроллеров.
В качестве альтернативы QWidgets могут быть созданы вне контроллера, поэтому вы можете повторно использовать контроллер для других типов представлений.
Не уверен, что это кому-то поможет, но я думаю, что иногда проще думать о шаблонах Cocoa в терминах C++, потому что мы привыкли получать объяснение шаблонов в терминах статически типизированного языка, такого как C++ и Java.
08.03.2009