MVC: PropertyChangeListener vs Java Observer & Observable

Markey

Mitglied
Hallo zusammen,

ich beschäftige mich zur Zeit mit einer MVC-Java-Implementierung mit Observer-Pattern.
Nun ist bei mir die Frage gekommen, welcher Aufbau mehr Sinn macht.

Möglichkeit 1
Ich erbe in meinen Model-Klassen von Observerable und implementiere das Interface Observer in der View. Und nutze die Standard Methoden ala addObserver(Observer o) um die View am Model als Beobachter einzutragen und notifyObservers() um die View über Änderungen am Modell zu informieren.​

Möglichkeit 2
Ich deklariere und initialisiere ein Feld vom Typ PropertyChangeSupport im Model und implementiere das interface PropertyChangeListener in der View. Änderungen am Model werden ja dann über die Methode firePropertyChange(PropertyChangeEvent evt) an die eingetragenen Listener propagiert werden, oder sehe ich das falsch!?​

Welche konkreten Vor- oder Nachteile sehr ihr für die unterschiedlichen Implementierungen?

Danke für Ihre zahlreichen Antworten,

Mark
 

Markey

Mitglied
Hallo zusammen,

ich beschäftige mich zur Zeit mit einer MVC-Java-Implementierung mit Observer-Pattern.
Nun ist bei mir die Frage gekommen, welcher Aufbau mehr Sinn macht.

Möglichkeit 1
Ich erbe in meinen Model-Klassen von Observerable und implementiere das Interface Observer in der View. Und nutze die Standard Methoden ala addObserver(Observer o) um die View am Model als Beobachter einzutragen und notifyObservers() um die View über Änderungen am Modell zu informieren.​

Möglichkeit 2
Ich deklariere und initialisiere ein Feld vom Typ PropertyChangeSupport im Model und implementiere das interface PropertyChangeListener in der View. Änderungen am Model werden ja dann über die Methode firePropertyChange(PropertyChangeEvent evt) an die eingetragenen Listener propagiert werden, oder sehe ich das falsch!?​

Welche konkreten Vor- oder Nachteile seht ihr für die unterschiedlichen Implementierungen?

Danke für Eure zahlreichen Antworten,

Mark

Ich nehme mir mal raus euch zu dutzen :)
 
G

Gast2

Gast
Ich kenne MVC, ich kenne auch sämtliche Forenbeiträge zu dem Thema. :rtfm:Mich interessiert aber nicht was MVC eigentlich ist (zumeist der Fokus der Einträge), sondern was die "Best-Practices" in der Java-Umsetzung sind. Und was andere Entwickler aus welchen Gründen bevorzugen. ???:L

Steht doch einiges in dem Beitrag dazu drin, vor allem zu PropertyChangeSupport
 

schalentier

Gesperrter Benutzer
Im "klassischen" MVC nimmt man das Observerpattern. D.h. der View beobachtet Models, die entsprechende Aenderungen feuern. Ob dazu das Pattern direkt und an jedem Model implementiert wird (Moeglichkeit 1) oder man irgendwie versucht, den Code zum Pattern auszulagern (Moeglichkeit 2) spielt prinzipiell keine Rolle. Nimm was dir besser gefaellt.

Ich wuerde wahrscheinlich (haengt halt stark vom Umfang usw ab) Weg 1 gehen, da imho Java ziemlich ungeeignet ist, um bestimmte Pattern ansich in eigne Klassen auszulagern.

Allerdings rate ich vom Observerpattern generell ab (bei der Umsetzung von MVC). Irgendwann hat man dann naemlich hunderte von Observern und Observables, die alle irgendwie miteinander verbunden sind. Man verliert einfach den Ueberblick, wenns ein groesseres Projekt wird.

Viel besser gefaellt mit Publish/Subscribe mit einem EventBus. Prinzipiell ist das aehnlich, das was bei Observer der PropertyChangeSupport ist, ist dann eine Instanz von EventBus (die z.B. per DI dem Model und den Views bekannt gemacht wird). Die Models "publishen" ihre Aenderungen auf den Bus, die Views "subscriben" sich dann fuer Aenderungen, die sie interessieren. Code sieht dann z.B. so aehnlich aus (Skizze):
Java:
public class Model {
   public void setFoo( String foo ) {
      eventBus.publish( this, new ModelChanged( this.foo, foo ) );
      this.foo = foo;
   }
}
public class View {
   public void init(Model model) {
      eventBus.subscribe( model, ModelChanged.class, new EventHandler<ModelChanged>() {
          public void handle( ModelChanged event ) {
             updateGUI();
          }
      }
   }
}
public class Controller {
   public void init() {
      eventBus.subscribe( Model.class, ModelLoaded.class, new EventHandler<ModelLoaded>() {
         public void handle( ModelLoaded event ) {
            model = event.getModel();
            view  = viewFactory.getViewFor( model );
            view.init( model );
            showDialog( view );
         }
      }
   }
}

Das Ganze hat mehrere Vorteile, u.a. eine deutlich staerkere Unabhaengigkeit zwischen Model und Views, man kann den EventBus fuer alle moeglichen Events (nicht nur fuer PropertyChanges) verwenden und - das gefaellt mir persoenlich am besten - man kann mehrere EventBusse verwenden, die die handle-Methoden der EventHandler in unterschiedlichen Threads ausfuehren (BackgroundThread, EDT, ...). Zusaetzlich koennte man einen Bus einfuehren, der die Events serialisiert uebers Netzwerk streamt.

Aber es gibt unglaublich viele Moeglichkeiten und MVC beschreibt die Details nicht. MVC sagt eigentlich nur, dass Model und View getrennt wird und es noch einen Controller gibt, der alles zusammenbindet. Wie du das erreichst, haengt einfach total vom konkreten Fall ab.

edit: typo
 
Zuletzt bearbeitet:

Markey

Mitglied
Im "klassischen" MVC nimmt man das Observerpattern. D.h. der View beobachtet Models, die entsprechende Aenderungen feuern. Ob dazu das Pattern direkt und an jedem Model implementiert wird (Moeglichkeit 1) oder man irgendwie versucht, den Code zum Pattern auszulagern (Moeglichkeit 2) spielt prinzipiell keine Rolle. Nimm was dir besser gefaellt.

Ich wuerde wahrscheinlich (haengt halt stark vom Umfang usw ab) Weg 1 gehen, da imho Java ziemlich ungeeignet ist, um bestimmte Pattern ansich in eigne Klassen auszulagern.

Allerdings rate ich vom Observerpattern generell ab (bei der Umsetzung von MVC). Irgendwann hat man dann naemlich hunderte von Observern und Observables, die alle irgendwie miteinander verbunden sind. Man verliert einfach den Ueberblick, wenns ein groesseres Projekt wird.

Viel besser gefaellt mit Publish/Subscribe mit einem EventBus. Prinzipiell ist das aehnlich, das was bei Observer der PropertyChangeSupport ist, ist dann eine Instanz von EventBus (die z.B. per DI dem Model und den Views bekannt gemacht wird). Die Models "publishen" ihre Aenderungen auf den Bus, die Views "subscriben" sich dann fuer Aenderungen, die sie interessieren. Code sieht dann z.B. so aehnlich aus (Skizze):
Java:
public class Model {
   public void setFoo( String foo ) {
      eventBus.publish( this, new ModelChanged( this.foo, foo ) );
      this.foo = foo;
   }
}
public class View {
   public void init(Model model) {
      eventBus.subscribe( model, ModelChanged.class, new EventHandler<ModelChanged>() {
          public void handle( ModelChanged event ) {
             updateGUI();
          }
      }
   }
}
public class Controller {
   public void init() {
      eventBus.subscribe( Model.class, ModelLoaded.class, new EventHandler<ModelLoaded>() {
         public void handle( ModelLoaded event ) {
            model = event.getModel();
            view  = viewFactory.getViewFor( model );
            view.init( model );
            showDialog( view );
         }
      }
   }
}

Das Ganze hat mehrere Vorteile, u.a. eine deutlich staerkere Unabhaengigkeit zwischen Model und Views, man kann den EventBus fuer alle moeglichen Events (nicht fuer PropertyChanges) verwenden und - das gefaellt mir persoenlich am besten - man kann mehrere EventBusse verwenden, die die handle-Methoden der EventHandler in unterschiedlichen Threads ausfuehren (BackgroundThread, EDT, ...). Zusaetzlich koennte man einen Bus einfuehren, der die Events serialisiert uebers Netzwerk streamt.

Aber es gibt unglaublich viele Moeglichkeiten und MVC beschreibt die Details nicht. MVC sagt eigentlich nur, dass Model und View getrennt wird und es noch einen Controller gibt, der alles zusammenbindet. Wie du das erreichst, haengt einfach total vom konkreten Fall ab.

Gefällt mir! :applaus:
 

Wildcard

Top Contributor
Ich finde das man diese Art Code am besten überhaupt nicht mehr selbst schreibt. Das können Maschinen besser, die machen bei wiederkehrenden Aufgaben keine Fehler.
Deshalb lieber ein EMF Modell verwenden. Das spart dir Arbeit und du musst dir auch nicht mehr überlegen wie man denn nun am besten Property Change Support oder Observer implementiert.
Eclipse Modeling Framework ? Wikipedia
 

schalentier

Gesperrter Benutzer
[...]Deshalb lieber ein EMF Modell verwenden. Das spart dir Arbeit und du musst dir auch nicht mehr überlegen wie man denn nun am besten Property Change Support oder Observer implementiert.

Dafuer machst du dich von Eclipse abhaengig und bekommst Probleme, sobald du an die Grenzen vom generierten Code gelangst. Zudem verliert man Refactoring Moeglichkeiten.

Grad als Einsteiger finde ich, sollte man erstmal mit den Grundlagen beginnen und eben mal ein Beispielprojekt manuell durchprogrammiert haben. Da bemerkt man schon, was man immer und immer wieder schreiben muss und sucht dann nach Alternativen. Ob man dann EMF nimmt, muss jeder selbst entscheiden.
 
G

Gast2

Gast
Ich finde das man diese Art Code am besten überhaupt nicht mehr selbst schreibt. Das können Maschinen besser, die machen bei wiederkehrenden Aufgaben keine Fehler.
Deshalb lieber ein EMF Modell verwenden. Das spart dir Arbeit und du musst dir auch nicht mehr überlegen wie man denn nun am besten Property Change Support oder Observer implementiert.
Eclipse Modeling Framework ? Wikipedia

Dafür sollte ein Anfänger aber die benutzen Pattern wenigstens schon mal selber eingesetzt haben, um zu verstehen was ihm alles generiert wird und wie man es einsetzt.
 

Wildcard

Top Contributor
Dafuer machst du dich von Eclipse abhaengig und bekommst Probleme, sobald du an die Grenzen vom generierten Code gelangst. Zudem verliert man Refactoring Moeglichkeiten.
Hmm, nein, nein und nein.
EMF wird zwar von Eclipse entwickelt, ist aber Eclipse unabhängig.
Wenn man mehr Funktiontionalität möchte als der generierte Code enthält fügt man sie einfach hinzu, EMF merged das ganze problemlos. Meine Modelle bestehen typischerweise aus 75% generiertem und 25% manuellem Code.
Warum sollte man EMF Modelle nicht refactoren können?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
HarleyDavidson Eigener PropertyChangeListener funktioniert einfach nicht Allgemeine Java-Themen 3
M OOP PropertyChangeListener - Vererbung oder Komposition? Allgemeine Java-Themen 5
A PropertyChangeListener Vererbung Allgemeine Java-Themen 4
OnDemand Java Deployment Vaadin Allgemeine Java-Themen 3
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
N LlaMA, KI, java-llama.cpp Allgemeine Java-Themen 39
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
M java: unexpected type Allgemeine Java-Themen 2
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
BetziTheRealOne Java PKIX path building failed as non Admin Allgemeine Java-Themen 15
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
KonradN Java 21 Release Allgemeine Java-Themen 5
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
K Java Anwendung machen Anleitung Allgemeine Java-Themen 5
G java.io.listFiles() Allgemeine Java-Themen 3
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
K Java-Projekt Allgemeine Java-Themen 11
K Java-Projekt Allgemeine Java-Themen 0
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
rode45e Java Threads Allgemeine Java-Themen 4
G java.io.listFiles() Allgemeine Java-Themen 2
N Java Dynamic Proxy Allgemeine Java-Themen 3
N Leichte Java Gegner Ki Allgemeine Java-Themen 10
A Java modul Problem Allgemeine Java-Themen 4
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
V Funktionale Schnittstelle in Java Allgemeine Java-Themen 3
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
KonradN Java 20 am 21. März Allgemeine Java-Themen 1
O Java Website Stock Bot Allgemeine Java-Themen 3
J Front-/Backend in Java Allgemeine Java-Themen 14
doopexxx JAVA Google Webcrawler Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
lalex1491 Java Aktienkurse nachfragen Allgemeine Java-Themen 4
J Class to link Java Allgemeine Java-Themen 4
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
mrStudent Inferenz JAVA Allgemeine Java-Themen 6
U URI Rechner (Java Script) Allgemeine Java-Themen 7
TheSkyRider Java Geburtsdatum Textfeld Allgemeine Java-Themen 7
mihe7 Java 19 JavaDocs: Browserintegration Allgemeine Java-Themen 0
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
H Java Rechner Programmierung der Mathematik Allgemeine Java-Themen 33
Lennox Schinkel Java Kara Auf einen Java Host laufen lassen Allgemeine Java-Themen 17
C Fußnoten von DocX mit Java Allgemeine Java-Themen 2
C Fußnoten in DocX mit Java Allgemeine Java-Themen 1
M Aussagenlogik in Java Programmieren Allgemeine Java-Themen 22
B Per Java Word Dokument schreiben? Allgemeine Java-Themen 8
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
KonradN Oracle übergibt (Java Teile der) GraalVM Community Edition an OpenJDK Community Allgemeine Java-Themen 2
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
B Java mit command line und jars benutzen? Allgemeine Java-Themen 18
M Java Überprüfen ob .exe-Datei bereits ausgeführt wird Allgemeine Java-Themen 2
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
Mick P. F. Wie kriege ich die Fehlermeldung "java: symbol lookup error: ..." weg? Allgemeine Java-Themen 11
K Nachhilfe Java Allgemeine Java-Themen 11
KonradN Java 19 Allgemeine Java-Themen 11
F IDEA IntelliJ Java Songliste erstellen Allgemeine Java-Themen 6
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
E Java und integrierte Grafikkarten Allgemeine Java-Themen 18
Sachinbhatt Wie wird die Typumwandlung bei Mehrfachvererbung in Java implementiert? Allgemeine Java-Themen 3
Peterw73 Hilfe bei Java gesucht Allgemeine Java-Themen 3
A Java unter Win 10 Allgemeine Java-Themen 1
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
T Java Robot Class - Bot Allgemeine Java-Themen 3
E Wie Java Heap Space vergrößern? Allgemeine Java-Themen 3
B Java Programm auf virutellem Desktop laufen lassen? Allgemeine Java-Themen 1
D VBA Code mit Java ausführen möglich? Allgemeine Java-Themen 10
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
izoards Java Home Pfad unabhängig von der Version Allgemeine Java-Themen 7
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
KonradN CVE-2022-21449: Fehler in Java bei Signaturprüfung Allgemeine Java-Themen 20
berserkerdq2 Java sql Allgemeine Java-Themen 15
JordenJost Unverständlicher Java code? Allgemeine Java-Themen 21
LimDul XSD To Java - Überschreiben von Assoziationen Allgemeine Java-Themen 1
Aartiyadav Comparisons and Swapa in Bubble-sort Java Allgemeine Java-Themen 6
KonradN Java 18 Allgemeine Java-Themen 8
N Statistische Auswertung von Logfiles (Einlesen, auswerten und grafische Aufbereitung von logfiles) mit Java Allgemeine Java-Themen 9
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
Z Mit Java 8+ Streams Zeilen nummern zu Zeilen hinzufügen Allgemeine Java-Themen 17
M Verständnisfrage java.util.TimerTask Allgemeine Java-Themen 2
V Hilfe mit Java Code Allgemeine Java-Themen 4
S Processing Java Code verstehen Allgemeine Java-Themen 4
O Newton Algorithmus Java Allgemeine Java-Themen 1
P Java Quellen finden Allgemeine Java-Themen 3
M Java Analyse/ SWOT-Analyse Allgemeine Java-Themen 13
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben