2012-06-05 5 views
4

У меня есть базовый шаблон MVC, созданный на Java, который использует класс/интерфейс Observable/Observer.Как использовать функцию наблюдения Java Observer, Object?

Observable Observer  Observable/Observer 
Model   Controller View 

View triggers an event to the Controller, when the user interacts with the GUI. 
- E.g presses a button, fills in a field, etc. 

Model triggers an event to the View when it updates its state. 
- E.g when the a button was pressed and the Controller requests new results. 

Мой вопрос о функции наблюдателя

update(Observable obs, Object arg); 

Это одна функция, но у меня есть много различных видов обновления делать в моей View, например. Как я могу элегантно различать обновление до, скажем, моих результатов поиска или отображения дополнительной информации? Это два совершенно разных обновления, в которых используются разные объекты из Модели.

Моя первая идея состояла в том, чтобы использовать объект для передачи строки, которая описывает, какое обновление требуется.

"UpdateResults" "DisplayAdditionalInformation" "AddQuestions" 

но это кажется подверженным ошибкам и уродливым. Мой второй инстинкт должен был создать объектСобытия, который будет принят как объект, но тогда я должен постоянно спрашивать, какие EventObject я использую:

if (arg instanceof ResultEventObject) 
    // Get results from model 
else if (arg instanceof InformationEventObject) 
    // Get information from model 
else if (arg instanceof QuestionsEventObject) 
    // get questions from model 

Моя третья идея заключается в том, чтобы просто обновить все, но кажется бессмысленно неэффективным.

Возможно, я неправильно понимаю интерфейс Observable/Observer, или я не использую update(), как это было предусмотрено его авторами. Поэтому мой вопрос: как правильно использовать функцию update, когда у меня есть много разных типов обновлений или событий для обработки?

+2

Реализации Observer/Наблюдаемая картина довольно старая в Java, Syne JDK 1.0. Теперь гораздо полезнее создать пользовательскую реализацию с использованием параметризации. – nkukhar

+0

@NKukhar, пожалуйста, расширьте свой комментарий о параметризации. – Thufir

+0

@Thufir взгляните на этот вопрос ответ: http://stackoverflow.com/questions/4283304/having-trouble-getting-the-observer-pattern-working – nkukhar

ответ

1

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

Для прослушивания модели обновление всего простейшего решения, и вы можете это сделать, если производительность не станет проблемой.

Смежные вопросы