Как смотреть на наблюдаемый объект, содержащий наблюдаемое поле - PullRequest
2 голосов
/ 08 июня 2010

Мне нужен совет относительно MVC и Observer-Pattern.

Например, модель содержит классы «Адрес» и «Персона». Класс Address содержит поля street: String, почтовый индекс: String, location: String. В то время как класс Person содержит поля name: String, firstName: String, address: Address.

Мой подход пока выглядит примерно так: И Адрес, и Персона наблюдаемы. Если вызывается один из их установщиков, я проверяю, отличаются ли текущее значение и новое значение. Только в этом случае происходит событие обновления. Событие содержит источник, имя измененного поля, старое и новое значение.

Класс для представления содержит текстовые поля для отображения и редактирования информации о человеке: имя, имя, улица, почтовый индекс, местоположение. Он знает модель Person и является подписанным наблюдателем для этого человека. Таким образом, он получает события обновления от объекта person.

Мои вопросы касаются поля адреса из типа Address в классе person, поскольку адрес сам по себе можно наблюдать. Если представление получает событие обновления от лица, когда был установлен новый адрес, я могу обновить все поля, связанные с адресом в представлении. Но что, если поле адреса изменится? Должно ли представление также регистрироваться для обновления событий с адреса?

Будем благодарны за любые намеки на общие подходы к проектированию. Привет.

Ответы [ 2 ]

1 голос
/ 08 июня 2010

IMO представление может регистрироваться в качестве наблюдателя на столько объектов модели, сколько пожелает. В общем, я не знаю каких-либо причин, почему наблюдатель должен ограничиваться наблюдением только одного наблюдаемого.

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

Более того, если один Observable является членом другого, логика обновления регистраций Observer становится немного сложнее.

0 голосов
/ 08 июня 2010

Я использовал привязку данных JFace довольно часто, и они делают это следующим образом:

Вы создаете привязку между элементом модели и элементом GUI.Для простоты мы берем поле String в модели и создаем привязку к текстовому объекту (Textfield) в графическом интерфейсе.Таким образом, всякий раз, когда значение в модели изменяется, происходит событие, значение может быть проверено и преобразовано, а текстовый виджет уведомлен.Привязка делает то же самое в другом направлении: при каждом редактировании в графическом интерфейсе событие запускается, проверяется и, при необходимости, преобразуется в отслеживаемое поле наблюдаемой модели.

Таким образом, типичный случай - 1: 1 отношение между полем модели и компонентом редактора.

...