Отправка данных от наблюдателя к наблюдаемой

У меня есть Java-приложение, которое реализует шаблон наблюдателя / наблюдаемого. В моей модели MVC класс наблюдателя - это View, а наблюдаемый класс - контроллер.

Каждое изменение в моем наблюдаемом классе отправляется наблюдателю с помощью setChanged(); а также notifyObservers(); инструкции, и класс наблюдателя изменяется с помощью метода обновления.

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

Любая помощь будет оценена.

4 ответа

В схеме наблюдателя вы не отправляете данные в наблюдаемую (которая обычно является моделью, а не контроллером, но идете с тем, что работает для вас).

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

Обычно шаблон наблюдателя используется для слабой связи между двумя компонентами в одном направлении.

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

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

На самом деле, если ваш View также Controller, хорошо... у вас есть два Controllers:) Что вы могли бы сделать, так это реализовать шаблон MVC, который вы упомянули:

+--------------------------------------+
|              +--------------------+  |
|          +---<     Controller     |  | <- Your current "Observable"
|          |   +--------------------+  |
|          |                           |
|    +-----v-----+                     |
|    |   Model   <-------+             |
|    +-----v-----+       |             |
|          |             |             |
|          |             |             |
|    +-----v-------------^----------+  |
|    |  View   +     Controller     |  | <- Your current "Observer"
|    +------------------------------+  |
|                                      |
+---------- Your application ----------+

Так твой ток Observerв шаблоне MVC, будет как View и Controller, Теперь вы хотите иметь уникальный Model это будет Observer из ваших двух Controllers (это все еще будет Observable) и все ваши View будет оставаться Observer, но теперь будет подключен к вашему уникальному Model,

Тот Model Я говорю о том, будет ли просто содержать данные приложения, которые вы либо:

  • манипулируя с Controllers
  • показывая с Views

Вы также можете сделать это в основном представляет внутреннее состояние приложения. Я думаю, что это то, что вы ищете здесь. Шаблон MVC заставит вас много выиграть в гибкости:)
Вы можете прочитать больше об этом здесь: MVC Pattern - tutorialspoint.

Observer может взаимодействовать с Observable в своем методе обновления, используя ссылку на Observable:

void update(Observable o, Object arg)

Этот метод вызывается всякий раз, когда наблюдаемый объект изменяется. Приложение вызывает метод notifyObservers объекта Observable, чтобы уведомить всех наблюдателей объекта об изменении.

Параметры:

  • o - наблюдаемый объект.
  • arg - аргумент, передаваемый методу notifyObservers.
Другие вопросы по тегам