Я разрабатываю приложение Java Swing
и я следую подходу MVC. У меня есть контроллер, а затем у меня есть моя модель и мой взгляд.
Model
и View
взаимодействуют только через Controller
. Controller
связывался с Model
и View
по интерфейсам, что приводило к довольно большому вложенному коду.
После того, как мой босс просмотрел код, он пожаловался, что он не модульный. Ему нужен более модульный подход. Где он мог бы добавить новый модуль или удалить его без особых хлопот. С модулями он имел в виду как панель инструментов, таблицу, панель меню... все относительно моей модели View
. Ему также не нравились все интерфейсы и вложенный код, который он видел.
Какие у вас есть предложения по изменению моего подхода, не испортив весь код, который у меня уже есть (на самом деле это очень много кода, действительно много!).
Я сделал google для "java mvc modular", и я не нашел много информации об этом.
Подход, который, как я думаю, может решить мою проблему, - это использовать EventBus
. Модуль просто должен был отправить событие с использованием шины, и контроллер обработает его. По крайней мере, нет вложенного кода со всеми этими интерфейсами.
С автобусом я бы просто сделал что-то вроде (на модуле):
bus.post(new MyEvent());
И на контроллере:
@Subscribe
public void onEventMyEvent(MyEvent event) {
// handle the event
}
--------------- РЕДАКТИРОВАТЬ -------------
После прочтения ссылки, предоставленной пользователем trashgod (в разделе комментариев), и сделайте вывод, что то, что я делаю прямо сейчас, использует MVP (Model View Presenter)
Viewer MVP (Model View Presenter)
представленный этим изображением:
(Кредиты для изображения для udalmik и здесь: введите ссылку здесь)
Шаблон Model, View, Controller позволяет нам отделить бизнес-логику, визуализацию экрана и обработку асинхронных событий в дискретных классах. Преимущество этого в том, что он эффективно отделяет все основные обязанности приложения, ориентированного на GUI, в выделенные классы. Это означает, что функциональность каждого класса изолирована, что позволяет лучше адаптироваться к конкретным приложениям и поддерживать их.
Таким образом, при таком фундаментальном подходе общая архитектура приложения для вашего приложения пока хороша, однако то, что ищет ваш босс, несколько отличается. Он просит реализовать некоторую архитектуру, которая позволит вам быстро и просто изменить пользовательский интерфейс. Итак, немедленно, вы можете сказать, что он просит, относительно элемента View MVC.
Ниже я использую псевдокод, чтобы предоставить общий пример того, как вы могли бы создавать эти модульные графические элементы.
public final class View {
private GUIElement mModularElement;
public final void setModularElement(final GUIElement pModularElement) {
this.mModularElement = pModularElement;
}
public final GUIElement getModularElement() {
return this.mModularElement;
}
public final void onRender(final GUIVariable pGUIVariable) {
this.getModularElement().draw(pGUIVariable);
}
}
В этом коде мы определили View
на доступ приложения к экземпляру, что называется ModularElement
, типа GUIElement
. Используя общедоступные методы getter/setter, Controller
может получить View
для визуализации любого типа объекта, который наследуется от GUIElement
. Итак, если вы когда-либо хотели изменить GUI, вы могли бы указать новый вид GUIElement
без внесения изменений в окружающую архитектуру.
Это базовый пример, поскольку для обеспечения максимальной гибкости GUIElement необходимо будет выполнять другие виды ответственности, а не только рендеринг. Они включают в себя определение макета экрана, инкапсуляцию дополнительных графических элементов, то, как они обрабатывают MotionEvents, все это связано с расширением функциональности GUIElement. Вы даже можете рисовать массив GUIElements. Важно отметить, что mModularElement
будет существовать в вашей Model
чтобы придерживаться шаблона MVC; реализация выше позволяет избежать этого в интересах простоты.
Надеюсь это поможет.