Как выполнить различные операции в update () Observer в Java? - PullRequest
6 голосов
/ 01 июня 2010

Я только начал играть с Observable, Observer, и это метод update(), и я не могу понять, что мне делать, когда разные действия вызывают notifyObservers().

Я имею в виду, у моего Observable класса есть несколько разных методов, которые в конце вызывают setChanged() и notifyObservers(). В зависимости от вызываемого метода, некоторая часть пользовательского интерфейса (Swing) должна быть обновлена. Однако в классе Observer реализован только один update() метод.

Я хотя бы передаю что-то методу notifyObservers(), и тогда я могу проверить аргумент в update(), но это не очень хороший способ сделать это. Даже если это произойдет, что я должен пройти? Строка с кратким описанием действия / метода? Int, как код действия / метода? Что-то еще?

Как лучше всего справиться с этой ситуацией?

Ответы [ 2 ]

8 голосов
/ 01 июня 2010

В общем, вы должны обновить все из наблюдаемого, когда вы получите вызов update (). если это нецелесообразно, вы можете передать подсказку notifyObservers ().

банда говорит, что одно из следствий паттерна наблюдателя:

"Неожиданные обновления. Поскольку наблюдатели не знают о присутствии друг друга, они могут не учитывать конечную стоимость смены объекта. Казалось бы, безобидная операция над объектом может вызвать каскад обновлений для наблюдателей и их зависимых объектов. Кроме того, критерии зависимости, которые не определены или не поддерживаются, обычно приводят к ложным обновлениям, которые трудно отследить.

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

"Избегание специфичных для наблюдателя протоколов обновления: модели push и pull. При реализации шаблона Observer субъект часто передает дополнительную информацию об изменении. Субъект передает эту информацию в качестве аргумента для Update. Объем информации может изменяться широко.

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

Модель вытягивания подчеркивает незнание субъектом своих наблюдателей, тогда как модель выталкивания предполагает, что субъекты знают кое-что о потребностях своих наблюдателей. Модель push может сделать наблюдателей менее пригодными для повторного использования, потому что классы Subject делают предположения о классах Observer, которые не всегда могут быть истинными. С другой стороны, модель извлечения может быть неэффективной, поскольку классы наблюдателей должны выяснить, что изменилось без помощи субъекта. «

3 голосов
/ 01 июня 2010

Второй параметр для update() имеет тип Object, поэтому вы можете передать что-нибудь подходящее. Как вы заметили, подход довольно общий. Напротив, класс, который поддерживает EventListenerList, может получить степень безопасности типа во время выполнения, когда используется как указано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...