Шаблон Java Swing + MVC по модульному принципу

1

Я разрабатываю приложение 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) представленный этим изображением: Изображение 174551 (Кредиты для изображения для udalmik и здесь: введите ссылку здесь)

  • 0
    И твой вопрос?
  • 1
    Возможный дубликат : «не каждое взаимодействие должно проходить через контроллер вашего приложения».
Показать ещё 3 комментария
Теги:
model-view-controller
module
design-patterns
swing

1 ответ

1
Лучший ответ

Шаблон 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; реализация выше позволяет избежать этого в интересах простоты.

Надеюсь это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню