Observable und Observer

Status
Nicht offen für weitere Antworten.

SnooP

Top Contributor
Um das Observerpattern umsetzen zu können gibt es ja in Java bereits die Klasse Observable und das Interface Observer. Ich hab jetzt das Problem das ich gegebene Modellklassen habe, die ich gerne mit einer gui verbinden möchte... die Veränderungen der Modellklassen möchte ich beobachten lassen - sprich ich möchte mir die Möglichkeit offen halten die Anzeige später beliebig zu ändern oder sogar mehrere Anzeigen gleichzeitig benachrichtigen zu können.. spricht also eigentlich alles für Observer.

Wie kann ich das jetzt mit Java-Boardmitteln erledigen? Ich müsste ja eigentlich meine Modellklasse von Observable erben lassen, dann wäre alles ganz prima... dummerweise hab ich natürlich bereits von ner anderen Klasse geerbt. Jetzt hab ich gedacht, dass ich in meiner Klasse einfach nen Feld für den Obserable mache, den ich bei einer Veränderung in meiner Modellklasse einfach benachrichtige und dieser ausgelagerte Observable ruft dann alle Observer auf.
Dummerweise ist Observable halt wirklich auf die Vererbung ausgelegt und die setChanged-Methode ist protected...

Wie mach ich das jetzt also vernünftig - bzw. wie würdet ihr vorgehen?
Soll ich ne eigene Klasse Observable machen an die ich von meiner Modellklasse delegiere und dort eine entsprechende Methode aufrufe bei einer Veränderung und die dann wiederum die setChanged-Methode aufruft? Klingt irgendwie auch blöd ;)

Oder soll ich mir nen eigenes Observerkonzept ausdenken mit Interfaces?
 
B

bygones

Gast
1. Möglichkeit: Oberklasse erbt von Observable
2. Möglichkeit: eigene Listener struktur

die fallen mir gerade ein
 

SnooP

Top Contributor
Hm jo... - Möglichkeit 1 find ich halt irgendwie unschön... an der Struktur ist eigentlich schon alles fertig und jetzt doch noch ne Oberklasse einzufügen.. hmm hmm... muss ich nochmal drüber nachdenken ;)

Möglichkeit 2 - okay - könnt ich machen... mein Modell kommuniziert in der Modellebene schon intern mitHilfe eines eigenen Listenerprinzips... wäre es jetzt sehr gegen MVC, wenn ich das vorhandene Listenerkonzept dazu verwende um gleichzeitig auch die View-Klassen zu informieren? Sprich ich adde als Listener gleichzeitig noch die GUI-Objekte?
Oder sollte ich parallel dazu lieber nen zusätzlichen Listener bauen, um noch flexibler zu sein?
 

SnooP

Top Contributor
Naja ob innere oder externe Klasse ist ja egal... wenn ich es an eine andere Klasse delegiere muss ich jenes Objekt aber auch benachrichtigen, dass sich der Zustand meines Modells geändert hat... also in etwa so, wie ichs beschrieben hab - dann muss ich bei der änderung noch mitgeben, was sich geändert hat und das in dem Delegat speichern...

Alles in allem recht umständlich..

ich glaube ich leite doch die Oberklasse von Observable ab ;) - muss mal meinen Cheffe fragen, was der dazu sacht.
 

semi

Top Contributor
Wie wäre es mit PropertyChangeSupport wie bei Java-Beans?
z.B.
Code:
public class MyModel extends Whatever {
  private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
  ...

  public void setFoo(Foo foo) {
    Foo oldValue = this.foo;
    this.foo = foo;
    pcs.firePropertyChange("foo", oldValue, foo);
  }
  
  public void addPropertyChangeListener(PropertyChangeListener listener) {
    pcs.addPropertyChangeListener(listener);
  }  

  public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
    pcs.addPropertyChangeListener(propertyName, listener);
  }

  public void removePropertyChangeListener(PropertyChangeListener listener) {
    pcs.removePropertyChangeListener(listener);
  }

  public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
    pcs.removePropertyChangeListener(propertyName, listener);
  }
}
 

semi

Top Contributor
Das liesse sich noch mit einem Proxy als Decorator "automatisieren", ist aber
schon zu viel Magic und etwas unangenehm beim Debuggen.
 

SnooP

Top Contributor
erzähl ;) ... Magic klingt gut...

sowas ähnliches wie den PropertyChangeListener hatte ich mir selbst auch überlegt.. die Existenz von dem Teil ist mir aber in dem Kontext irgendwie nicht eingefallen ;) - wäre ne alternative, allerdings die Geschichte mit den Einzeleigenschaften, die sich geändert haben find ich etwas unhübsch - mir hätte es gereicht, wenn ich das Datenmodell einfach mit dem Event mitschicken könnte - dann kann der Observer selbst entscheiden, was er denn nun für Daten braucht (Push).

Aber wie oben schon gesacht - habs jetzt doch mit dem Observable gelöst...
 

semi

Top Contributor
SnooP hat gesagt.:
erzähl ;) ... Magic klingt gut...
Vergiss es gleich wieder. Es funktioniert nur, wenn man mit bekannten Interfaces arbeitet.
(siehe Proxy#newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h))
Da Deine Model-Objekte unterschiedlich sind bringt es nichts bzw. kann so nicht funktionieren.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M OOP Design Pattern - "extends Observable implements Observer" Allgemeine Java-Themen 0
G 2 Observable und ein Observer... Allgemeine Java-Themen 4
M MVC: PropertyChangeListener vs Java Observer & Observable Allgemeine Java-Themen 11
Z Observer/Observable & Grundlagen Allgemeine Java-Themen 6
H Observer und Observable Allgemeine Java-Themen 3
G Observer / Observable oder doch lieber Message Broker? Allgemeine Java-Themen 2
D Observer/Observable Pattern vs. Listener-Konzept Allgemeine Java-Themen 4
N Observer/Observable der JAVA-API od. eigene Implementierung Allgemeine Java-Themen 2
lhein Tutorial zu Observer / Observable? Allgemeine Java-Themen 6
G Frage zu (mehrfachem) Observable/Observer Allgemeine Java-Themen 2
A Observable BeansBinding an einer JTable bzw. JXTable Allgemeine Java-Themen 3
P fehlende Mehrfachvererbung logging.Handler impl. Observable Allgemeine Java-Themen 5
GreenTeaYT Verstehe nicht ganz das Observer Pattern in einer Arrayliste? Allgemeine Java-Themen 3
S OOP JFrame als Observer eines JPanel Allgemeine Java-Themen 3
A Observer und Initialisierung Allgemeine Java-Themen 7
L Registrierung von Observer Allgemeine Java-Themen 4
S Wie kann ein Observer mehrere Observables beobachten? Allgemeine Java-Themen 9
R Observer Umsetzungsproblem Allgemeine Java-Themen 7
K Verständnisprobleme bei Observer-Pattern mit größerem Datenmodell Allgemeine Java-Themen 32
nrg Java Observer in SysTray laufen lassen / Console schließen Allgemeine Java-Themen 2
T Observer vs Listener Allgemeine Java-Themen 18
A Observer Pattern: feuern bei neuer Referenz-Zuweisung? Allgemeine Java-Themen 8
V Threads und Observer Allgemeine Java-Themen 18
U Verständnisschwierigkeiten Observer Pattern Allgemeine Java-Themen 18
B Observer vs Listener (GUI-Programmierung) Allgemeine Java-Themen 5
M Observer serialisieren Allgemeine Java-Themen 7
P Observer/TimerTask Allgemeine Java-Themen 3
P Observer Allgemeine Java-Themen 4
B Observer reagieren beim 2ten mal nicht Allgemeine Java-Themen 23
P Observer, nicht alle updates bearbeiten Allgemeine Java-Themen 2
P Abmelden beim Observer Allgemeine Java-Themen 4
N Observer Pattern Allgemeine Java-Themen 2
M Frage zu update Methode von Observer! Allgemeine Java-Themen 40
G problem mit dem observer pattern Allgemeine Java-Themen 3
G Frage zum Observer Pattern Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben