2010-06-01 2 views
6

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

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

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

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

ответ

7

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

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

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

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

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

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

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

3

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

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