Составные паттерны и MVC
В продакшене паттерны редко живут по одному. Типичный UI-сценарий (пульт управления, симулятор, дашборд) одновременно использует Адаптер, Декоратор, Наблюдатель и Компоновщик. Частый архитектурный каркас таких систем — Model–View–Controller (MVC). Здесь — как разложить роли и не перепутать MVC с «тремя папками в репозитории».
MVC — три роли
| Роль | Ответственность | Что не должна делать |
|---|---|---|
| Model | Данные и бизнес-правила (BPM, плейлист, заказ) | Рисовать UI и знать про кнопки |
| View | Отображение состояния модели | Менять правила расчёта скидки |
| Controller | Реакция на ввод пользователя, вызов операций модели | Хранить долгоживущее состояние домена |
Поток запроса: пользователь действует во View → Controller обновляет Model → Model уведомляет подписанные View → View перерисовывается.
В классическом примере с моделью ритма (BPM) модель хранит темп и список слушателей; представление (слайдеры, диаграмма) подписывается на изменения и не опрашивает модель в цикле — это прямое применение Наблюдателя / Наблюдателя в C#.
Какие паттерны GoF «сидят» внутри MVC
| Паттерн | Роль в MVC | Пример |
|---|---|---|
| Observer | Model → View: слабая связь, автоматическое обновление UI | PropertyChangeListener, React state, SignalR push |
| Strategy | Подключаемые алгоритмы внутри модели или контроллера | Разные способы сортировки плейлиста, расчёта доставки |
| Command | Действие пользователя как объект (undo, очередь, макрос) | Кнопка «Play» упаковывает вызов в команду с историей |
| Composite | Дерево виджетов или меню | Панель содержит слайдеры и кнопки как единый Component |
| Decorator | Дополнительное оформление View без подклассов | Обводка, тени, логирование отрисовки |
MVC — архитектурный каркас; перечисленные шаблоны — тактические кирпичи внутри него. Обзор архитектурных стилей шире — в Архитектурных паттернах.
Составной сценарий — несколько паттернов сразу
Условный симулятор уток в одном модуле может сочетать:
- утки с разным «кряканьем» — Стратегия;
- подсчёт кряков — Декоратор вокруг
Quackable; - индюк за «уткой» — Адаптер;
- MVC для DJ-пульта — Model + View + Controller.
Урок для практики: один паттерн решает одну ось изменений. Если задача — только совместить API индюка и утки, достаточно Адаптера; если ещё нужен счётчик событий — добавляется Декоратор.
MVC в корпоративном веб-приложении
Классический Spring Boot / ASP.NET MVC — это MVC плюс слои:
| Слой в проекте | Близкая роль MVC | Паттерны рядом |
|---|---|---|
| Controller / API | Controller | Фасад над сервисами |
| Service | Model (правила) | Стратегия, Команда |
| Repository | Model (доступ к данным) | Фабрика, DI |
| DTO + View (JSON, Razor, SPA) | View | Адаптер к внешнему API |
Практика в лаборатории — Spring Boot приложение: контроллер, сервис, репозиторий как разделение ответственности, а не как формальное «MVC ради MVC».
В распределённой системе «моделью» часто становится сервис домена, «представлением» — SPA или BFF, «контроллером» — API-шлюз или REST-слой. Идея та же: изменение бизнес-правил не должно тянуть переписывание всех экранов.
Чек-лист перед внедрением MVC
- Есть ли несколько представлений одних и тех же данных (веб, мобильное, отчёт)?
- Нужно ли обновлять UI при изменении модели без опроса?
- Отделены ли тесты бизнес-логики от UI-фреймворка?
Если ответ «нет» на все три вопроса, достаточно тонкого API и одного клиента — полноценный MVC может быть избыточен.
См. также
- Принципы ОО-проектирования перед паттернами
- Частые паттерны GoF
- Посредник в Java — альтернатива «спагетти» связей между виджетами
- Жизненный цикл Spring MVC — как запрос проходит контроллер в Spring
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Паттерн — это повторяющийся шаблон, узор или схема. Паттерны встречаются повсюду — в природе, архитектуре, поведении людей и, конечно, в программировании. Порождающие паттерны проектирования — это группа шаблонов, направленных на решение задач, связанных с созданием объектов. Структурные паттерны — это группа шаблонов проектирования, решающих задачи организации классов и объектов таким образом, чтобы обеспечить гибкую архитектуру программного обеспечения. Поведенческие паттерны — это группа шаблонов проектирования, которые определяют способы взаимодействия объектов и распределения ответственности между ними. Архитектурные паттерны — это проверенные решения для организации структуры программного обеспечения. Интеграция систем — одна из центральных задач в современной разработке программного обеспечения. Паттерны доменного моделирования представляют собой проверенные решения для организации бизнес-логики в программных системах. Паттерн Strategy в C# — классическая реализация через интерфейс, замена на Func и Action, DI и критерии выбора без лишних абстракций. Паттерн Iterator в C# — ручной IEnumerator, генерация итератора компилятором через yield return, ленивость, LINQ и случаи, когда класс писать всё же нужно. Abstract Factory в C# и .NET — классическая схема через интерфейсы, замена через DI-контейнер, фабричный делегат и keyed services в .NET 8. Паттерн Command в C# — классическая схема, делегаты, MediatR, очередь задач, undo и критерии выбора между объектом команды и простым вызовом сервиса. Паттерн Observer в C# — event и делегаты, IObservable IObserver, слабая связанность, отписка и как не поймать утечки памяти в долгоживущих сервисах.Обзор паттернов проектирования
Порождающие паттерны
Структурные паттерны
Поведенческие паттерны
Архитектурные паттерны
Паттерны интеграции внешних систем
Паттерны проектирования доменных моделей
Стратегия в C#
Итератор в C#
Фабрика в C#
Команда в C#
Наблюдатель в C#