Ich habe mal eine Frage bzgl. der Eventprogrammierung in Java. Es ist ja so, dass man jedem Objekt (z.B. einem Button) mehrere Objekte übergeben kann, die ein Event Interface implementieren.
Würde es eigentlich technisch funktionieren, einem Objekt (z.B. dem Button) mehrere Objekte zu üerbgeben, die bspw. das ActionListener oder MouseListener implementieren und vor allem, würde das einen Sinn machen,
wenn man all diese Objekte dann durchiteriert?
Den ersten Teil deiner Frage verstehe ich noch. Und ja, es kann durchaus Sinn machen dass eine Klasse mehrere Listener implementiert:
Java:
classMultiListenerimplementsActionListener,MouseListener,FocusListener{...}MultiListener ml =newMultiListener();
myButton.addActionListener(ml);
myButton.addMouseListener(ml);
myTextField.addFocusListener(ml);
So zumindest verstehe ich deine Frage. Das Problem ist dann u.a., dass man in diesem MultiListener stärker die Event-Quellen unterschieden muss.
Auf die Frage wann so etwas sinnvoll ist lautet die korrekte Antwort: Kommt drauf an
[...] würde das einen Sinn machen, wenn man all diese Objekte dann durchiteriert?
Beim notify der observer iteriert man ja über alle registrierten observer und schickt jeweils das Event an die Weiter.
Beim Button-Beispiel:
Am Button könnte z.b. ein Obsever (Eventhandler) hängen, der auf den Klick reagiert und daraufhin daten aus einer Datenbank an die Gui schickt um sie dort anzuzeigen, gleichzeitig könnte ein 2. Observer das Event an ein Logging-System weiterleiten, das sich dann um einen passenden Logeintrag kümmert.
Ich meine damit z.B., dass es drei verschiedene Objekte gibt, die alle z.B. das Interface MouseListener implementieren und das dann einem Objekt (z.B. der Button) diese drei Eventobjekte mittels addMouseListener() übergeben werden.
Ok, das ist verständlich, dies würde in etwa dem Beispiel mit dem Datenbank und dem Logging-Listener entsprechen.
Der Vorteil davon ist, dass deine Listener keine Abhängigkeiten haben, wenn du dein Logging änderst willst du ja nicht im Listener umbauen müssen der sich um die Datenbank kümmert.
Es kann also je nach Anwendung durchaus Sinn machen.
Allerdings ist mir dann nicht mehr klar, was genau du mit dem iterieren meinst?
Naja die Objekte, die das Interface vom Typ MouseListener implementieren, werden ja über die Methode .addMouseListener() in "einem Objekt" (z.B. einem Button) in einer Liste vom Typ des Interfaces ablegt. Mein Verständnis ist jetzt so, dass von jetzt bspw. genau an diesem Objekt das Event ausgelöst wird, dann alle drei Obejkte automatisch durchiteriert werden, ohne, dass ich das verhindern kann. es geschieht also implizit.
Und hier ist eben die Frage, ob das technisch funktioneirt und überhaupt einen Sinn ergibt und ob ich so etwas als Entwickler prüfen und abfangen / bzw. verhindern muss?
Die Methode wo das ActionPerformed geworfen wird, sieht dann so aus, dass der Button über alle gespeicherten Listener iteriert, prüft welche ActionListener sind und an diese dann ein passendes Event schickt.
Das entspricht auch einem Beispiel des Observer-Patterns in der Java-API, Subject wäre der Button, Observer sind die Listener.