Я только что начал играть с Observable
, Observer
и это update()
метод и я не можем понять то, что должно я делать, когда различные действия звонят notifyObservers()
.
Я имею в виду, мой Observable
класс имеет несколько различных методов тот вызов setChanged()
и notifyObservers()
в конце. В зависимости от вызываемого метода должна быть обновлена некоторая часть UI (Swing). Однако существует только один update()
метод, реализованный в Observer
класс.
Я, хотя из передачи чего-то к notifyObservers()
метод и затем я могу проверить аргумент update()
но не похоже на хороший способ сделать это. Даже если это сделало, что я должен передать? Строка с кратким описанием действия/метода? Интервал, как код действия/метода? Что-то еще?
Что лучший способ состоит в том, чтобы обработать эту ситуацию?
в общем, вы должны обновлять все из наблюдаемого, когда вы получаете вызов update (). если это нецелесообразно, вы можете передать подсказку notifyObservers ().
Книжная банда говорит, что одним из следствий паттерна наблюдателя является:
«Неожиданные обновления. Поскольку наблюдатели не знают о присутствии друг друга, они могут не знать окончательной стоимости смены предмета. На первый взгляд безобидная операция над объектом может вызвать каскад обновлений для наблюдателей и их зависимых объектов. Более того, критерии зависимости, которые не определены или не поддерживаются должным образом, обычно приводят к ложным обновлениям, которые трудно отследить.
Эта проблема усугубляется тем фактом, что простой протокол обновления не предоставляет подробностей о том, что изменилось в теме. Без дополнительного протокола, который помог бы наблюдателям обнаружить, что изменилось, они могут быть вынуждены усердно работать, чтобы вывести изменения. " также в процессе реализации они говорят:
«Избегание протоколов обновления, специфичных для наблюдателя: модели push и pull. Реализации паттерна Observer часто заставляют субъект транслировать дополнительную информацию об изменении.Субъект передает эту информацию в качестве аргумента в Update. Объем информации может сильно различаться.
В одном крайнем случае, который мы называем моделью выталкивания, субъект отправляет наблюдателям подробную информацию об изменении, хотят они этого или нет. Другая крайность - модель тяги; субъект не отправляет ничего, кроме минимального уведомления, и после этого наблюдатели явно запрашивают подробности.
Модель притяжения подчеркивает незнание субъектом своих наблюдателей, тогда как модель выталкивания предполагает, что субъекты что-то знают о потребностях своих наблюдателей. Модель push может сделать наблюдателей менее пригодными для повторного использования, потому что классы Subject делают предположения о классах Observer, которые не всегда могут быть верными. С другой стороны, модель pull может быть неэффективной, потому что классы Observer должны определять, что изменилось, без помощи Subject. "
Второй параметр для update ()
имеет тип Object
, поэтому вы можете передать что угодно. Как вы заметили, подход довольно общий. Напротив, класс, который поддерживает EventListenerList
, может получить определенную степень безопасности типов во время выполнения при использовании, как указано.