Verständnisfrage Observer-Pattern

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
Tach,

ich hab da ein Verständnisproblem mit dem Observer-Pattern. Und zwar soll dieses Pattern ja dazu dienen, dass Klassen miteinander kommunizieren können ohne sich zu kennen und ohne Referenzen mitübergeben zu müssen und so gegen das MVC Pattern verstoßen würden (also wenn sie Referenzen übergeben würden)!?

Die implementierung und alles ist kein Problem, nur wie schaffe ich das jetzt, dass ich damit in beide Richtungen kommunizieren kann? Also z. B. Daten benachrichtigen View dass was geändert wurde. Anzeige in View wird angepasst und gut is. Aber was mache ich jetzt wenn z. B. auf der View der OK Button gedrückt wurde und deshalb Daten verändert werden müssen? Die GUI Klasse erbt ja nicht von Observable und kennt weder Controller noch Daten Klasse.

Hoffe mein Problem ist einigermaßen verständlich, hab vermutlich nur ne Denkblockade im Hirn bzw. hab das Observer Pattern noch nicht 100%ig verstanden :oops: .

Danke für die Antworten!
 

Wildcard

Top Contributor
In MVC - MVC ist übrigens kein DesignPattern - handelt üblicherweiße ein Controller die Events, und der kennt sowohl Model als auch View...
 

The_S

Top Contributor
Ok, danke. Auch wieder was gelernt :D .

Also dann erbt praktisch der Controller von Observable und die Daten so wie die GUI implementiert Observer!? Gut hab ich mir schon fast gedacht, nur hat mich die Beschreibung in den FAQ etwas verwirrt, da dort die Daten-Klasse von Observable erbt und nicht der Controller ???:L .

btw: Dieser Post ist noch ne Frage ob ichs richtig verstanden hab, also bitte um Antwort (nicht das mir einer denkt ich möchte es nur nochma für mich zusammenfassen ;) ). Danke
 
Hi,
ich denke du hast das Observer-Pattern noch nicht so richtig verstanden. Das eigentlich Ziel dieses Pattern ist es keineswegs eine bestimmte Trennung vorzunehmen. Diese findet zwar indirekt statt, aber vielmehr geht es um die Konsistenzerhaltung mehrerer Beobachter.
Die eigentliche Idee ist recht einfach. Ein Objekt dass Beobachtet werden kann bietet eine Methode zum Registrieren/Deregistrieren von einem Beobachter. Ein Beobachter muss wiederum eine bestimmte Methode implementieren, über die die Benachrichtigung statt findet. Tritt ein Ereingis in dem zu Beobachtendem Objekt auf, so werden alle registrierten Beobachter benachrichtigt. Eine Beispiel implementierung wären die Listener der grafischen Komponenten. Über die Parameter der Methode, die alle Listener über das eintreten des Events informieren, werden somit alle Beobachter benachrichtigt.
In anderen Sprachen (C/C++, Delphi, ...) wurden früher gerne Funktionszeiger verwendet. Hier würde einfach der Zeiger auf eine Funktion gesetzt werden (nicht auf die Instanz eines Interface / einer Klasse). Diese Funktion wurde direkt aufgerufen, wenn ein Ereignis aufgerufen wurde. Das Problem ist nun, Listener1 setzt diesen Zeiger auf sein Funktion, dann möchte Listener2 auch informiert werden und macht das gleiche. Da es sich immer um den selben Zeiger handelt, hätte man ein Problem, es würde nicht mehr jeder etwas von einer Änderung mitbekommen.

Was das bidirektionale bei dir angeht, so sollte es kein Problem sein, dass du einfach mehr als einer Klasse eine addListener/removeListener Methode hinzufügst. Wie sie ihre Listener letztlich über das eintreten von Ereignissen informieren kann dabei natürlich beliebig (aber auch gleich) sein. Ich sehe da nicht ganz dein Problem.

Gruß Der Unwissende
 

The_S

Top Contributor
Hm, ich glaube schon dass ich es prinzipiell verstehe, nur nicht wie ich es anwende :( . Wäre supi wenn mir jemand ein kleines Beispiel geben könnte, in welchem eine Daten-Klasse über einen Controller mit der GUI "kommuniziert" und umgekehrt. :)
 

Wildcard

Top Contributor
Hab heut meinen sozialen Tag :D
Code:
public class View extends JButton /* nur ein Beispiel */ implements MyListener
{
	//Model hat sich geändert
	public void update(BlaBlaEvent event)
	{
			//doSomethingCool()
	}
}

class Controller
{
	private View view;
	private Model model;
	public Controller()
	{
		model.addMyListener(view);
		view.addActionListener(new ActionListener() {
		
			public void actionPerformed(ActionEvent e)
			{
				model.setRandomValue();
		
			}
		
		});
	}
	
}

class Model
{
	private List<WeakReference<MyListener>> listenerList;
	
	void addMyListener(MyListener listener)
	{
		listenerList.add(new WeakReference<MyListener>(listener));
	}
	
	void setRandomValue()
	{
		fireUpdate();
	}
	
	void fireUpdate()
	{
		Iterator<WeakReference<MyListener>> it = listenerList.iterator();
		while(it.hasNext())
			it.next().get().update(new BlaBlaEvent());
	}
}


interface MyListener
{
	public void update(BlaBlaEvent event);
}
 

The_S

Top Contributor
Ich hab mal eine kleine Test-Applikation geschrieben. Kann ja sich ja mal wer bei Gelegenheit anschauen, ob ich das so richtig umgesetzt habe.

SoundController, von hier wird alles gesteuert

Code:
package controller;

import interfaces.ModelChangedListener;
import interfaces.ViewChangedListener;
import view.subclasses.SoundFrame;
import data.subclasses.StoreData;
import events.ModelChangedEvent;
import events.ViewChangedEvent;

public class SoundController implements ModelChangedListener, ViewChangedListener {

	private SoundFrame sf = null;
	private StoreData sd = null;
	
	public void loadApplication() {
		
		sf = new SoundFrame();
		sd = new StoreData();
		
		sf.addViewChangedListener(this);
		sd.addModelChangedListener(this);
		
		sf.fireTestString("Hallo Model, ich bin die View");
		sd.fireTestString("Hallo View, ich bin das Model");
	}
	
	public void notifyView(ModelChangedEvent mce) {
		
		sf.modelChanged(mce.getNote());
	}
	
	public void notifyModel(ViewChangedEvent vce) {
		
		sd.viewChanged(vce.getNote());
	}
}

Hier der Source für die beiden Listener ViewChangedListener und ModelChangedListener


Code:
package interfaces;

import events.ModelChangedEvent;

public interface ModelChangedListener {

	public void notifyView(ModelChangedEvent mcd);
}

Code:
package interfaces;

import events.ViewChangedEvent;

public interface ViewChangedListener {

	public void notifyModel(ViewChangedEvent vce);
}

Die beiden Events ViewChangedEvent und ModelChagnedEvent

Code:
package events;

public class ModelChangedEvent {

	private Object note = null;
	private Object source = null;
	
	public ModelChangedEvent(Object note, Object source) {
		
		setNote(note);
		setSource(source);
	}

	public Object getNote() {
		return note;
	}
	
	public void setNote(Object note) {
		this.note = note;
	}

	public Object getSource() {
		return source;
	}

	public void setSource(Object source) {
		this.source = source;
	}
}

Code:
package events;

public class ViewChangedEvent {

	private Object note = null;
	private Object source = null;
	
	public ViewChangedEvent(Object note, Object source) {
		
		setNote(note);
		setSource(source);
	}

	public Object getNote() {
		return note;
	}

	public void setNote(Object note) {
		this.note = note;
	}

	public Object getSource() {
		return source;
	}

	public void setSource(Object source) {
		this.source = source;
	}
}

Die Superklasse für StoreData

Code:
package data.superclasses;

import interfaces.ModelChangedListener;
import java.util.Vector;
import events.ModelChangedEvent;


public abstract class Data { 

	private static final long serialVersionUID = 1L;
	private Vector<ModelChangedListener> listener = null;
	
	public Data() {
		
		listener = new Vector<ModelChangedListener>();
	}
	
	public void addModelChangedListener(ModelChangedListener mcl) {
		
		listener.add(mcl);
	}
	
	public void removeModelChangedListener(ModelChangedListener mcl) {
		
		listener.remove(mcl);
	}
	
	protected void fireUpdate(ModelChangedEvent mce) {
		
		for (ModelChangedListener mcl : listener) {
			mcl.notifyView(mce);
		}
	}
	
	public abstract void viewChanged(Object obj);
}

Die Super-Klasse für SoundFrame

Code:
package view.superclasses;

import interfaces.ViewChangedListener;
import java.util.Vector;
import javax.swing.JFrame;
import events.ViewChangedEvent;

public abstract class ViewJFrame extends JFrame{

	private static final long serialVersionUID = 1L;
	private Vector<ViewChangedListener> listener = null;
	
	public ViewJFrame() {
		
		listener = new Vector<ViewChangedListener>();
	}
	
	public void addViewChangedListener(ViewChangedListener vcl) {
		
		listener.add(vcl);
	}
	
	public void removeViewChangedListener(ViewChangedListener vcl) {
		
		listener.remove(vcl);
	}
	
	protected void fireUpdate(ViewChangedEvent vce) {
		
		for (ViewChangedListener vcl : listener) {
			vcl.notifyModel(vce);
		}
	}
	
	public abstract void modelChanged(Object obj);
}

SoundFrame

Code:
package view.subclasses;

import view.superclasses.ViewJFrame;
import events.ViewChangedEvent;

public class SoundFrame extends ViewJFrame {

	private final static long serialVersionUID = 1L;
	
	public void fireTestString(String str) {
		
		fireUpdate(new ViewChangedEvent(str, this));
	}
	
	@Override
	public void modelChanged(Object obj) {
		
		System.out.println("SoundFrame hat folgende Nachricht erhalten: " + obj);
	}

}

StoreData

Code:
package data.subclasses;

import data.superclasses.Data;
import events.ModelChangedEvent;

public class StoreData extends Data {

	public void fireTestString(String str) {
		
		fireUpdate(new ModelChangedEvent(str, this));
	}

	@Override
	public void viewChanged(Object obj) {
		
		System.out.println("StoreData hat folgende Nachricht erhalten: " + obj);
	}

}

Danke fürs durchlesen :D
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
A Verständnisfrage Java Basics - Anfänger-Themen 12
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
P Verständnisfrage: PageFactory.initElements Java Basics - Anfänger-Themen 2
R do while Schleife Verständnisfrage Java Basics - Anfänger-Themen 2
G while.next() Verständnisfrage Java Basics - Anfänger-Themen 16
Vivien Kurze Verständnisfrage zu Java Point aus java.awt.* Java Basics - Anfänger-Themen 5
C Erste Schritte Anfänger Verständnisfrage zum Compiler Java Basics - Anfänger-Themen 31
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
Der Grütz Verständnisfrage zu Übung aus Java Kurs - Schaltjahr bestimmen Java Basics - Anfänger-Themen 2
J Verständnisfrage zu throws neben Funktionen Java Basics - Anfänger-Themen 2
TimoN11 Verständnisfrage bei Aufgabe Java Basics - Anfänger-Themen 2
P Verständnisfrage zum Mapping Java Basics - Anfänger-Themen 3
M Java Version Verständnisfrage Java Basics - Anfänger-Themen 16
M Verständnisfrage zu eine Online Aufgabe Java Basics - Anfänger-Themen 7
T Verständnisfrage zur Konsolenausgabe Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
D Verständnisfrage zur Modellierung einer HDD Java Basics - Anfänger-Themen 17
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
S Verständnisfrage lokale Ordnerpfade Java Basics - Anfänger-Themen 1
T Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 7
J Java Starthilfe Verständnisfrage Aufgabe Java Basics - Anfänger-Themen 2
O Anfänger, Verständnisfrage Java Basics - Anfänger-Themen 3
C Verständnisfrage zu Modulo Java Basics - Anfänger-Themen 6
C Verständnisfrage bezüglich der Do-While Schleife Java Basics - Anfänger-Themen 9
L Verständnisfrage - Speicherabbild Java Basics - Anfänger-Themen 4
melly_ Verständnisfrage zu args Java Basics - Anfänger-Themen 3
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
K Verständnisfrage eines Abschnitts Java Basics - Anfänger-Themen 6
K Rekursion Verständnisfrage Java Basics - Anfänger-Themen 19
S Modell View Controller Verständnisfrage Java Basics - Anfänger-Themen 24
J Superklassen Konstruktor Verständnisfrage Java Basics - Anfänger-Themen 1
JavaTalksToMe Erste Schritte Println-Frage (Verständnisfrage) Java Basics - Anfänger-Themen 1
R Verständnisfrage zu Objekten u. Übergabeparameter Java Basics - Anfänger-Themen 8
G Collections Verständnisfrage zur For-Each-Schleife Java Basics - Anfänger-Themen 7
b1ck Interface Verständnisfrage zum GUI mit "swing" Java Basics - Anfänger-Themen 1
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
G Verständnisfrage zu for-each Java Basics - Anfänger-Themen 4
DontFeedTheTroll Erste Schritte Verständnisfrage zu If-Anweisung Java Basics - Anfänger-Themen 7
K Rekursion-Verständnisfrage Java Basics - Anfänger-Themen 4
J Java Server Pages - Verständnisfrage Java Basics - Anfänger-Themen 2
Z Verständnisfrage Anfängerprogramm Java Basics - Anfänger-Themen 0
T Verständnisfrage Zuweisungs-/arithmet. Operatoren Java Basics - Anfänger-Themen 2
G Methoden Verständnisfrage zur Methoden Java Basics - Anfänger-Themen 7
LionAge Kapselung, Verständnisfrage zur Objekterzeugung Java Basics - Anfänger-Themen 4
Z Verständnisfrage zum Multithreading Java Basics - Anfänger-Themen 3
R OOP / Verständnisfrage zum Konstuktor (siehe code) Java Basics - Anfänger-Themen 7
gamebreiti Verständnisfrage zu contains() Java Basics - Anfänger-Themen 10
A Verständnisfrage - Koordinatenumrechnung Java Basics - Anfänger-Themen 9
J Erste Schritte Verständnisfrage im Bezug auf das (richtige) Programmieren Java Basics - Anfänger-Themen 5
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage Array Java Basics - Anfänger-Themen 2
I Interface Verständnisfrage Interfaces (Bsp.: Enumeration) Java Basics - Anfänger-Themen 2
I Verständnisfrage zu BridgePattern, Verwedung von super() Java Basics - Anfänger-Themen 4
P Verständnisfrage Java Basics - Anfänger-Themen 3
kaoZ Best Practice Verständnisfrage Listener bei lokalen Objekten Java Basics - Anfänger-Themen 8
D Input/Output Verständnisfrage Verzeichnis-/Dateiliste erstellen & Dateikonvertierung Java Basics - Anfänger-Themen 1
S Verständnisfrage zu Anweisungen und deren Wirkung Java Basics - Anfänger-Themen 7
H Verständnisfrage für oder Anweisung Java Basics - Anfänger-Themen 8
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Erste Schritte Verständnisfrage: Getter und Setter Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage zu Java-Ausgabe Java Basics - Anfänger-Themen 3
S Verständnisfrage Java Basics - Anfänger-Themen 2
N Verständnisfrage Code Java Basics - Anfänger-Themen 8
B Verständnisfrage Java Basics - Anfänger-Themen 2
H Interface Comparable Verständnisfrage Java Basics - Anfänger-Themen 6
B Verständnisfrage Codezeile Java Basics - Anfänger-Themen 7
B Verständnisfrage:Beispielprogramm BlueJ Java Basics - Anfänger-Themen 3
M Kurze Verständnisfrage zu einer Java Aufgabe Java Basics - Anfänger-Themen 12
K Erste Schritte Kleine Verständnisfrage Java Basics - Anfänger-Themen 12
R Verständnisfrage Referenzvariablen in array Java Basics - Anfänger-Themen 3
M Verständnisfrage: Objekt erzeugen u. zuweisen Java Basics - Anfänger-Themen 16
I OOP Verständnisfrage zu Singelton Pattern Java Basics - Anfänger-Themen 21
M Verständnisfrage zu JPanel Java Basics - Anfänger-Themen 3
S Verständnisfrage: Exception Gebrauch Java Basics - Anfänger-Themen 2
R Verständnisfrage NPE Java Basics - Anfänger-Themen 5
M Verständnisfrage zur Zahlenumwandlung (Dezimal-->Dual) Java Basics - Anfänger-Themen 25
P Java Objekte - Verständnisfrage Java Basics - Anfänger-Themen 9
N Verständnisfrage zu folgendem Programm Java Basics - Anfänger-Themen 2
L Grundlegende Verständnisfrage Hasmap Referenzen Java Basics - Anfänger-Themen 4
S Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 2
VfL_Freak Verständnisfrage zur Klasse "TIMER" Java Basics - Anfänger-Themen 7
P Verständnisfrage zu Instanzen/Objekten Java Basics - Anfänger-Themen 9
M Verständnisfrage im Umgang mit Map Java Basics - Anfänger-Themen 10
K Verständnisfrage zu int.length und String.length() Java Basics - Anfänger-Themen 4
G 2D Array gleichsetzen verständnisfrage Java Basics - Anfänger-Themen 2
M kleine und einfache Verständnisfrage Java Basics - Anfänger-Themen 3
N verständnisfrage java.util.Calendar Java Basics - Anfänger-Themen 4
G Datentypen bits, bytes, chars - Verständnisfrage Java Basics - Anfänger-Themen 5
E Verständnisfrage zu Shutdownhook Java Basics - Anfänger-Themen 5
D Verständnisfrage: Java und MySql Java Basics - Anfänger-Themen 3
F Rekursion Verständnisfrage Java Basics - Anfänger-Themen 6
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
Z Comparator Verständnisfrage Java Basics - Anfänger-Themen 5
D Verständnisfrage zu Funktionen Java Basics - Anfänger-Themen 6
H Verständnisfrage Persistenz Java Basics - Anfänger-Themen 10
neurox Verständnisfrage zu Threads Java Basics - Anfänger-Themen 4
E Verständnisfrage Syntax: frame.getContentPane().add(button) Java Basics - Anfänger-Themen 11
Y Kleine Verständnisfrage zum Thema dynamische Polymorphie Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben