2012-04-02 6 views
1

Ich verwende das MVP-Entwurfsmuster und habe meinen Moderator als Zuhörer auf den verschiedenen Schaltflächen und anderen interaktiven Elementen meiner Ansicht registriert. Und das funktioniert gut, ich werde benachrichtigt, wenn ein Benutzer eine Aktion in der GUI durchführt.Benachrichtigen des Moderators, dass sich das Modell geändert hat

Allerdings nicht das Verfahren zur Benachrichtigung des Präsentators, wenn das Modell ändert. Ich habe Daten von einem Server, der z. B. in einem Benutzermodell verarbeitet wird, und ändert den Wert meines Benutzerobjekts.

Wie benachrichtigen Sie den Moderator, dass das Modell in Java geändert wurde?

Lassen Sie mein Modell einen Verweis auf den Präsentator halten und nennen Sie explizit etwas wie presenter.userObjectHasBeenUpdated() in meinem Modell, nachdem ich das Benutzerobjekt geändert habe? Oder gibt es eine Möglichkeit, einen Listener auf das Benutzerobjekt zu setzen, das automatisch presenter.userObjectHasBeenUpdated() aufruft, wenn das Benutzerobjekt geändert wird?

Antwort

5

Ich würde sagen, dass Sie eine dedizierte Schnittstelle wie Observer erstellen und lassen Sie Ihre Moderatoren es implementieren. Dann kann sich jeder Präsentator selbst auf den Modellobjekten registrieren, um benachrichtigt zu werden, wenn sich ein Objekt ändert.

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

und im Modell:

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); 
    } 
} 

Natürlich können Sie all dies, indem Thread-Sicherheit verbessern, Ihre Mitteilung usw. eingeben ...

+0

Funktioniert gut Prost Mate. –

0

Wenn Sie Swing-Komponenten verwenden zu Zeigen Sie die angezeigten Daten an, Sie können ihre jeweiligen Modelle zur Benachrichtigung verwenden. Sie funktionieren auch als Listener, haben aber je nach Komponente feinere Benachrichtigungen. Zum Beispiel kann JTable über Änderungen in einer Zeile oder Änderungen in der ganzen Tabelle informiert werden. Ein Beispiel finden Sie unter http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/table/AbstractTableModel.html#fireTableChanged(javax.swing.event.TableModelEvent).

Verwandte Themen