На мій досвід, у традиційній програмі mvc gui для настільних ПК контролер виявляється спагетірованним у поданні. Більшість людей не потребують часу, щоб визначити клас контролера.
Шаблони дизайну в MVC Smalltalk
Тріада класів Model / View / Controller (MVC) [KP88] використовується для побудови інтерфейсів користувача у Smalltalk-80. Перегляд моделей дизайну всередині MVC повинен допомогти вам зрозуміти, що ми маємо на увазі під поняттям «візерунок».
MVC складається з трьох видів об’єктів. Модель є об’єктом програми, Вид - це його презентація на екрані, а Контролер визначає спосіб реакції користувальницького інтерфейсу на введення користувача. Перед MVC дизайни користувальницького інтерфейсу, як правило, збирали ці об'єкти разом. MVC роз’єднує їх для підвищення гнучкості та повторного використання.
MVC роз'єднує погляди та моделі, встановлюючи протокол підписки / повідомлення. Вид повинен забезпечити, щоб його зовнішній вигляд відображав стан моделі. Щоразу, коли дані моделі змінюються, модель сповіщає про види, які залежать від неї. У відповідь кожен вид отримує можливість оновити себе. Такий підхід дозволяє приєднувати кілька видів до моделі, щоб забезпечити різні презентації. Ви також можете створювати нові представлення для моделі, не переписуючи її.
На наступній схемі показана модель та три види. (Ми пропустили контролери для простоти.) Модель містить деякі значення даних, а представлення, що визначають електронну таблицю, гістограму та кругову діаграму, відображають ці дані різними способами. Модель спілкується зі своїми поглядами, коли змінюються її значення, а погляди спілкуються з моделлю для доступу до цих значень.
Цей приклад, взятий за номінальну вартість, відображає дизайн, який відокремлює погляди від моделей. Але конструкція застосовна до більш загальної проблеми: роз'єднання об'єктів, щоб зміни на один могли впливати на будь-яку кількість інших, не вимагаючи, щоб змінений об'єкт знав деталі інших. Ця більш загальна конструкція описана схемою дизайну спостерігача (стор. 293).
Ще одна особливість MVC полягає в тому, що представлення даних можуть вкладатись. Наприклад, контрольна панель кнопок може бути реалізована як складний вид, що містить вкладені подання кнопок. Інтерфейс користувача для інспектора об’єктів може складатися з вкладених представлень, які можуть бути використані повторно в налагоджувачі. MVC підтримує вкладені представлення з класом CompositeView, підкласом View. Об'єкти CompositeView діють так само, як і об'єкти View; складений вигляд можна використовувати скрізь, де подання можна використовувати, але воно також містить і керує вкладеними поданнями.
Знову ж таки, ми могли б сприймати це як дизайн, який дозволяє нам трактувати складений вигляд так само, як ми ставимось до одного з його компонентів. Але дизайн застосовний до більш загальної проблеми, яка виникає всякий раз, коли ми хочемо згрупувати об'єкти і трактувати групу як індивідуальний об'єкт. Цей більш загальний дизайн описується композиційною схемою (163). Це дозволяє створити ієрархію класів, в якій деякі підкласи визначають примітивні об'єкти (наприклад, Button), а інші класи визначають складові об'єкти (CompositeView), які збирають примітиви в більш складні об'єкти.
MVC також дозволяє змінювати спосіб перегляду відгуку на введення користувача, не змінюючи його візуальну презентацію. Ви можете, наприклад, змінити те, як вона реагує на клавіатуру, або ж використати спливаюче меню замість командних клавіш. MVC інкапсулює механізм реагування в об'єкт Controller. Існує ієрархія класів контролерів, що дозволяє легко створити новий контролер як варіацію на існуючому.
Представлення використовує екземпляр підкласу Controller для реалізації певної стратегії реагування; щоб реалізувати іншу стратегію, просто замініть екземпляр на інший тип контролера. Можна навіть змінити контролер подання під час виконання, щоб перегляд міняв спосіб його реагування на введення користувача. Наприклад, вигляд можна відключити, щоб він не приймав введення, просто даючи йому контролер, який ігнорує події введення.
Зв'язок View-Controller є прикладом схеми проектування стратегії (315). Стратегія - це об'єкт, який представляє алгоритм. Це корисно, коли ви хочете замінити алгоритм статично чи динамічно, коли у вас є багато варіантів алгоритму або коли алгоритм має складні структури даних, які ви хочете інкапсулювати.
MVC використовує інші шаблони дизайну, такі як Фабричний метод (107), щоб вказати клас контролера за замовчуванням для подання та Декоратор (175), щоб додати прокручування до подання. Але основні взаємозв'язки в MVC задаються моделями проектування спостерігачів, композитів та стратегій.