Как Gang of Four Design Patterns вписываются в парадигму MVC? - программирование
Подтвердить что ты не робот

Как Gang of Four Design Patterns вписываются в парадигму MVC?

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

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

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

Мой вопрос заключается в следующем: что такое взаимодействие между MVC и шаблонами проектирования? Что они получили в первой главе книги с примером приложения MVC? Являются ли определенные шаблоны проектирования просто не релевантными в парадигме MVC? Интересно, например, как шаблон команды должен вписываться в MVC. Это кажется невероятно полезным, но мы создаем CommandModel и CommandController для отправки другим контроллерам? Разве мы просто создаем объект Command, как это предписано в книге? В принципе, мне интересно, полностью ли немыслимы идеи MVC и Design Patterns, и я просто не понимаю, или если есть некоторые шаблоны, которые не вписываются в форму.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

...

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

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

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

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

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

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

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

...

Ответ 3

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

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

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

Ответ 4

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