Вопрос

Итак, для моего текущего проекта есть три основных класса Java:

  1. графический интерфейс
  2. Мгновенное сообщение
  3. Вычисление

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

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

Бывший.Скажем, графический интерфейс хочет войти в систему пользователя, он проходит через посредника, чтобы создать поток и войти в систему, но затем посредник должен передать успех/неуспех обратно в графический интерфейс, а также обновить сообщение о состоянии.

Другая проблема заключается в том, что необходимо обновить графический интерфейс, но не требуется модератор.Практично ли просто разрешить графическому интерфейсу создавать экземпляр этого класса и запускать его, или все должно проходить через посредника?

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

Это было полезно?

Решение

Если вы считаете, что Observer требует слишком много накладных расходов, Mediator может оказаться лучшим решением.Я определенно считаю, что вам не следует доверять графическому интерфейсу.Если вы собираетесь использовать шаблон «Посредник», то ответственность за это должен взять на себя сам посредник.Вы можете рассмотреть вариант шаблона «Команда».Если бы вы использовали Ruby, я мог бы порекомендовать передавать обратные вызовы функций, чтобы избежать обращения посредника к графическому интерфейсу по каждой мелочи.Но поскольку это Java, может помочь некоторая форма инкапсуляции действия в стиле шаблона команды.

Другие советы

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

Однако я не знаю, как бы вы поступили с обратным вызовом в Java.В языке, где функции являются первоклассными гражданами, вы можете просто передать функцию, но вы работаете на Java, поэтому, я думаю, вам придется использовать шаблон команды, как предложил кморрис.

Вы также можете попробовать заставить графический интерфейс предоставить посреднику объект обратного вызова, который обрабатывает получение возвращаемых значений или устанавливает любые необходимые вам значения (версия шаблона команды).Тогда на каждый вызов из графического интерфейса к посреднику будет один вызов.

Другая идея состоит в том, чтобы сгруппировать методы, вызываемые посредником, в семантически связанные фрагменты.В частности, если у посредника есть разделы, в которых он имеет тенденцию вызывать несколько методов графического интерфейса подряд:

   gui.a()
   gui.b()
   gui.c()

вы можете создать один метод, который обрабатывает результат вызова всех трех.Преимущество семантически сгруппированных методов (т.е. setFileInformation над setFileMenu, setTab, и т. д.) также тогда, если вам нужно изменить графический интерфейс, содержимое методов может измениться, но вызов, который делает посредник, может не измениться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top