Как Gang of Four Design Patterns вписывается в парадигму MVC? - PullRequest
17 голосов
/ 03 февраля 2012

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

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

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

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

Ответы [ 4 ]

9 голосов
/ 14 января 2013

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

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

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

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

8 голосов
/ 03 февраля 2012

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

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

Книга GoF гласит:

...

Взятый по номиналу, этот пример отражает дизайн, который отделяет виды от моделей. Но дизайн применим к более общей проблеме: разъединение объектов так, что изменения одного могут повлиять на любое количество других, не требуя, чтобы измененный объект знал детали других. Этот более общий дизайн описывается шаблоном проекта 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.

...

4 голосов
/ 03 февраля 2012

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

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

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

2 голосов
/ 04 февраля 2012

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

...