Ваши мнение о моей архитектуре
Приложение состоит из классов Java (модели), из сервлетов (контроллеры) и jsp (views).
Приложение очень маленькое и достаточно примитивное, и тут можно было обойтись вообще одним классом. Однако, хочется понять как делать Правильно, что-бы на проектах по-крупнее не изобретать велосипеды и не ходить по граблям.
Итак. Классы разбиты по пакетам:
classes.controllers - сервлет NewsController;
classes.models - класс NewsModel;
classes.strategies - классы GetNews (интерфейс), GetNewsDB, GetNewsXML.
Как всё работает. Приходит гет запрос (клиент зашёл на страницу) для сервлета NewsController. Контроллер определяет что нужно сделать (получить весь список новостей, или конкретную новость), создаёт объект модели - NewsModel , и вызывает нужный метод (скажем, GetNews()) а возвращённый результат отдаёт в jsp. Дальше, самое интересное - в конструкторе NewsModel определяется какая стратегия будет использоваться для получения новостей (GetNewsDB, GetNewsXML или какая-то другая), а в методе NewsModel::GetNews уже вызывается непосредственно метод выбранной стратегии для получения списка новостей.
Т.е. фактически получается нечто следующее:
1. Юзер запрашивает список новостей (средствами браузера).
2. NewsController обращается к модели для получения списка новостей
3. Модель выбирает какую стратегию использовать , и обращается к нужному методу (через интерфейс GetNews.java).
Ответ, в обратном порядке возвращается в контроллер, и оттуда отдаётся в отображение.
немного про интерфейс GetNews - Это абстрактный класс, который описывает интерфейс стратегии.
Кажется достаточно запутанным. Но надеюсь все поняли суть.
Модель это данные, а стратегия, - это собственно код, отвечающий за формирование/поиск новостей. Кстати, опиши поподробней, как работают классы GetNewsXML, GetNewsDB? что именно они делают?
Я бы сделал так -
1) юзер посылает запрос, в запросе кодируется в том числе информация, в каком виде новости желает получить юзер.
2) контроллер принимает запрос юзера и принимает решение о том, какую стратегию использовать (возможно, на основе некоторых параметров, переданных юзером в запросе).
3) Контоллер вызывает метод SelectedStrategy.getNews(), который возвращает экземпляр модели. Сама модель - это чисто данные.
4) Контроллер передает модель на страницу отображения новостей, где она парсится и показывается юзеру.
Советую почитать про архитектуру Apache Struts.
Вьюхи, контроллеры, модели и прослойка для доступа к ним (моделям).
Действительно, по mvcшному модели делать ничего не должны. А GetNews, наверное, и должен выступить в роли "прослойки" для работы с моделью, т.е. определять как и каким образом с моделью поработать, чтобы выдать то, что нужно.
Да, согласен, тут я не подумал просто куда мне лучше впихнуть выбор стратегии, потому сунул именно сюда.
Не совсем так... Код поиска новостей находится классах-стратегиях (GetNewsDB, GetNewsXML), которые являются по сути независимыми классами реализующими выборку новостей из БД, и возврат их в Hashtable или List .
Собственно, так и есть .. Модель в моём случае это как-бы мост, между контроллером и стратегией. Контроллер не знает о существовании стратегии, он знает что у модели есть метод GetNews . Всё. Уже в методе NewsModel::GetNews вызывается метод стратегии, который непосредственно и делает выборку данных и рассовывает результат должным образом в контейнеры (список, hashtable, ...).
Кстати тут вопрос.. насколько правилен такой подход, когда стратегии существуют независимо от модели и контроллера? Единственное что их объеденияет - так это схожее имя класса.
Вот тут уже непонятки начинаются ... во-первых - если контроллер вызывает метод стратегии (которая по сути не является моделью, и не имеет к модели непосредственного отношения), то где и каким образом тогда вообще использовать модель?? Каким образом стратегия (если она не знает ничего о модели), может вернуть её экземпляр?
И кстати, по поводу
Вот что я нашёл:
источник этой цитаты
Есть минимум два понятия модели в контексте этого обсуждения:
1) модель предметной области
2) модель в MVC арихитектуре большинства веб фреймворков.
Модель предметной области - это именно модель некоего процесса или явления реального мира.
Модель MVC, применительно к вебу, - это просто срез данных, отображаемых на страничке. Этот срез получается посредством обращения к модели предметной области.
О реализации говорят по коду, а об архитектуре можно сказать, что она есть :D