Уведомление докладчика о том, что модель изменилась - PullRequest
2 голосов
/ 02 апреля 2012

Я использую шаблон проектирования MVP и зарегистрировал своего докладчика в качестве слушателя на различных кнопках и других интерактивных элементах на моем виде. И это прекрасно работает, я получаю уведомления всякий раз, когда пользователь выполняет какие-либо действия в графическом интерфейсе.

Однако у меня нет процедуры уведомления докладчика об изменении модели. У меня есть данные, поступающие с сервера, который обрабатывается, например, в модели User, и изменяет значение моего объекта User.

Как уведомить докладчика о том, что модель изменилась в Java?

Позволяет ли моя модель содержать ссылку на презентатора и явно вызывать что-то вроде presenter.userObjectHasBeenUpdated() в моей модели после того, как я изменил объект User? Или есть способ размещения прослушивателя на объекте User, который будет автоматически вызывать presenter.userObjectHasBeenUpdated() при изменении объекта User?

Ответы [ 2 ]

6 голосов
/ 02 апреля 2012

Я бы сказал, что вы создаете специальный интерфейс, такой как Observer, и позволяете вашим докладчикам реализовывать его.Затем каждый докладчик может зарегистрироваться на объектах модели, чтобы получать уведомления при каждом изменении объекта.

public interface Observer {
     public void update(Object notification, Object source);
}

и в вашей модели:

private List<Observer> observers = new ArrayList<Observer>();

public void addObserver(Observer observer) {
    if (!observers.contains(observer)) {
         observers.add(observer);
    }
}

public void removeObserver(Observer observer) {
    observers.remove(observer);
}

protected fireNotification(Object notification) {
    for(Observer observer:observers) {
        observer.update(notification, this);
    }
}

Конечно, вы можете улучшить все это, добавивПотоковая безопасность, ввод вашего уведомления и т.д ...

0 голосов
/ 02 апреля 2012

Если вы используете Swing Components для отображения данных в представлении, вы можете использовать их соответствующие модели для уведомления.Они также работают как слушатели, но имеют более высокий уровень уведомлений в зависимости от компонента.Например, JTable может быть уведомлен об изменении в строке или изменении всей таблицы.См. http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/table/AbstractTableModel.html#fireTableChanged(javax.swing.event.TableModelEvent) для примера.

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