Отправка данных от наблюдателя к наблюдаемой
У меня есть 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.