Как банда четырех шаблонов проектирования вписывается в парадигму MVC?

Я размышлял над шаблонами дизайна в течение некоторого времени и только начинаю понимать, как на самом деле я могу начать более сознательно включать некоторые из них в свою работу по разработке. Однако я все еще не понимаю, как они трактовали MVC в начале книги и как это соотносится с остальной частью книги.

Большинство фреймворков, с которыми я работал - Spring, Yii, ASP.NET и даже Objective-C Cocoa (UIKit) - соответствуют парадигме MVC. Я получаю MVC, потому что для меня это полезный способ классификации объектов и того, как они должны сообщать или взаимодействовать друг с другом. Кроме того, эти фреймворки как бы навязывают вам это, даже если вы не собираетесь думать в стиле MVC.

Я также чувствую, что понимаю предпосылку шаблонов проектирования: они действительно не любят подклассы, им нравятся абстрактные интерфейсы, и они стремятся к слабой связанности. Я не могу сказать, что полностью понимаю все шаблоны или их полезность, но я чувствую это.

Мой вопрос таков: каково взаимодействие между MVC и шаблонами проектирования? Что они имели в виду в первой главе книги с примером приложения MVC? Некоторые шаблоны проектирования просто не актуальны в парадигме MVC? Мне интересно, например, как шаблон Command должен вписаться в MVC. Это кажется невероятно полезным, но можем ли мы создать CommandModel и CommandController для отправки другим контроллерам? Мы просто создаем Command объект, как предписано в книге? По сути, мне интересно, являются ли идеи MVC и шаблонов проектирования полностью несовместимыми, и я просто не понимаю, или есть некоторые шаблоны, которые не вписываются в шаблон.


person tacos_tacos_tacos    schedule 02.02.2012    source источник
comment
это может быть полезно прочитать: stackoverflow.com/questions/3148097/mvc -and-command-pattern   -  person roman    schedule 03.02.2012
comment
Я думаю, что смысл этого первого раздела (на самом деле это глава 2) состоял в том, чтобы показать, что это настоящие концепции, используемые в реальных программах, а не просто еще одна академическая работа с возвышенными идеями из башни из слоновой кости.   -  person tcarvin    schedule 03.02.2012


Ответы (4)


Мое личное мнение таково, что MVC - это упрощенная версия паттерна наблюдателя, который является упрощенной версией паттерна посредника.

MVC: одна модель, одно представление, Контроллер управляет связью между ними.

Шаблон наблюдателя: одна модель, несколько представлений (наблюдатели / подписчики) и издатель управляет общением.

Шаблон посредника: несколько разных моделей, несколько представлений и посредник управляет связью между ними.

person Stephane Rolland    schedule 14.01.2013
comment
Я нашел ваш дзен-ответ на этот вопрос и полностью согласен. - person Miroslav Trninic; 07.07.2013
comment
Я не думаю, что между моделью и представлением в MVC существует взаимосвязь 1-1. Вы можете легко создать несколько представлений для одной и той же модели. По крайней мере, насколько я понимаю, это одно из преимуществ использования MVC; наличие нескольких представлений одной и той же модели, которые обновляются одновременно с одним обновлением модели. - person Thomas Eizinger; 23.12.2017
comment
@ThomasEizinger, но какие различия вы бы заметили (если таковые имеются) с шаблоном наблюдателя? - person Stephane Rolland; 24.12.2017
comment
Этот парень (peter.michaux.ca/maria), например, утверждает, что MVC на самом деле является комбинацией три шаблона: Наблюдатель, Стратегия и Композиция. У меня нет личного опыта работы со Smalltalk (откуда возник MVC), но я думаю, что было бы разумным описать MVC как комбинацию этих трех шаблонов. - person Thomas Eizinger; 24.12.2017
comment
@ThomasEizinger Я прочитаю об этом, хотя моя первая инстинктивная реакция заключалась в том, что он ошибался. Я не вижу паттерна композиции в MVC, но я буду читать больше, чтобы понять его точку зрения. Спасибо за информацию. - person Stephane Rolland; 24.12.2017

MVC в книге GoF предназначен для настольных компьютеров, он использует шаблон наблюдателя для обновления представлений. Пример команды в книге GoF предназначен для редактора.

Существуют и другие разновидности MVC, в которых использование других шаблонов проектирования может быть неочевидным:
В чем разница между MVC и MVVM?
Управление абстракцией презентации

В книге GoF говорится:

...

Взятый на первый взгляд, этот пример отражает дизайн, который отделяет представления от моделей. Но проект применим к более общей проблеме: разделение объектов таким образом, чтобы изменения одного объекта могли повлиять на любое количество других, не требуя, чтобы измененный объект знал детали других. Этот более общий дизайн описывается шаблоном проектирования Observer (стр. 293).

Еще одна особенность MVC заключается в том, что представления могут быть вложенными. Например, панель управления кнопками может быть реализована как сложное представление, содержащее вложенные представления кнопок. Пользовательский интерфейс инспектора объектов может состоять из вложенных представлений, которые можно повторно использовать в отладчике. MVC поддерживает вложенные представления с классом CompositeView, подклассом View. Объекты CompositeView действуют так же, как объекты View; Составное представление можно использовать везде, где можно использовать представление, но оно также содержит вложенные представления и управляет ими.

Опять же, мы могли бы думать об этом как о дизайне, который позволяет нам обрабатывать составное представление так же, как мы относимся к одному из его компонентов. Но дизайн применим к более общей проблеме, которая возникает всякий раз, когда мы хотим сгруппировать объекты и относиться к группе как к отдельному объекту. Этот более общий дизайн описывается шаблоном проектирования Composite (163). Он позволяет создавать иерархию классов, в которой некоторые подклассы определяют примитивные объекты (например, Button), а другие классы определяют составные объекты (CompositeView), которые собирают примитивы в более сложные объекты.

MVC также позволяет изменять способ реагирования представления на ввод пользователя без изменения его визуального представления. Например, вы можете изменить его реакцию на клавиатуру или использовать всплывающее меню вместо командных клавиш. MVC инкапсулирует механизм ответа в объект контроллера. Существует иерархия классов контроллеров, позволяющая легко создать новый контроллер как вариант существующего.

Представление использует экземпляр подкласса Controller для реализации конкретной стратегии ответа; чтобы реализовать другую стратегию, просто замените экземпляр контроллером другого типа. Можно даже изменить контроллер представления во время выполнения, чтобы представление изменяло то, как оно реагирует на ввод пользователя. Например, представление можно отключить, чтобы оно не принимало ввод, просто предоставив ему контроллер, который игнорирует события ввода.

Отношения «представление-контроллер» являются примером шаблона проектирования «Стратегия» (315). Стратегия - это объект, представляющий алгоритм. Это полезно, когда вы хотите заменить алгоритм статически или динамически, когда у вас много вариантов алгоритма или когда алгоритм имеет сложные структуры данных, которые вы хотите инкапсулировать.

MVC использует другие шаблоны проектирования, такие как Factory Method (107), чтобы указать класс контроллера по умолчанию для представления и Decorator (175), чтобы добавить прокрутку в представление. Но основные взаимосвязи в MVC задаются шаблонами проектирования Observer, Composite и Strategy.

...

person Ray Tayek    schedule 02.02.2012

MVC - это шаблон. Но он охватывает только небольшой аспект веб-приложения. Еще один распространенный шаблон, который используется с MVC, - это репозиторий. Это скорее архитектурные шаблоны ... их объем имеет большее влияние на проект в целом.

паттерны GOF будут появляться повсюду разными способами. Они могут помочь построить инфраструктуру MVC в зависимости от выбранного дизайна. например, стратегия часто используется, поэтому вы можете подключать различные способы выполнения таких действий, как «аутентификация» и т. д.

Вам не обязательно использовать шаблоны как есть, они даже не обязательно должны быть одинаковой структурой кода. Это больше принцип / цель шаблона, который вы используете в дизайне.

person Keith Nicholas    schedule 02.02.2012

MVC - это архитектурный шаблон. Он идеально сочетается с другими шаблонами проектирования, такими как Command Pattern. Но вы не применяете шаблоны только потому, что они существуют и написаны в авторитетной книге. Вы применяете шаблоны, когда у вас есть проблема программирования / дизайна, и есть способ решить эту проблему, которая была обнаружена кем-то другим и была записана. Способ решения проблемы - это узор. Например, у вас есть приложение, которое сохраняет данные в базе данных. Сохраняемые данные довольно сложны: некоторые записи необходимо вставить, некоторые записи обновить, а некоторые удалить. Последовательность шагов важна, потому что записи, которые нужно вставить в одну таблицу, зависят от записей, которые нужно вставить в другую таблицу. Таким образом, необходимо использовать транзакцию базы данных. Один из возможных способов реализации транзакции - использовать шаблон команды. Способ сделать это очень хорошо объяснен в статье Лармана «Применение UML и шаблонов "книга (глава« Проектирование среды сохранения состояния с использованием шаблонов », раздел« Разработка транзакции с использованием шаблона команд »- прокрутите вниз до страницы 556). PersistentObject - это абстрактный класс модели. Все остальные классы модели расширяют его. В этом примере MVC реализован на уровнях пользовательского интерфейса, приложения и домена, но команда реализована на уровне постоянства. Эти шаблоны помогают решать различные проблемы, и в этом примере они дополняют друг друга.

person bancer    schedule 04.02.2012
comment
Проголосуйте за, потому что вы явно заявляете, что MVC на самом деле является архитектурным шаблоном. - person raddevus; 04.12.2015