Observer Problem

  • Themenstarter Themenstarter schwaba
  • Beginndatum Beginndatum
S

schwaba

Gast
Hallo, ich habe eine Frage bezüglich des ObserverPatterns.
Ich habe folgende Klassen:
View:
Java:
public class View implements Observer{
	private Model m;
	public View(Model m){
		this.m = m;
		m.addObserver(this);
	}
	public void update(Observable arg0, Object arg1) {
		if ((arg0 == m) && "property".equals(arg1)){
			System.out.println(m.getProperty());
		}
	}	

}
Model:
Java:
public class Model extends Observable  {
	private String property;
	public String getProperty() {
		return property;
	}
	public void setProperty(String property) {
		this.property = property;
		setChanged();
		notifyObservers("property");
	}
	public Model() {
	}

	public void doit(){
		setProperty("*Klick*");   //funktioniert
		
		SubModel s = new SubModel();	//Event wird in dieser
		s.doit();						//Klasse aufgerufen
	}
}
Java:
public class SubModel {
	public void doit(){
		//Klick
		setProperty("*Klick*"); //-->wie aufrufen?  //ERROR
	}
}
Main-Test
Java:
public class Test {
	public static void main(final String[] args) {
		Model m = new Model();
		View v = new View(m);
		
		m.doit();       //Als Test um setChanged() und notifyOberservers aufzurufen
	}

Über setProperty rufe ich im Model das setChanged() und notifyOberservers auf. Das klappt auch wunderbar, nur wenn ich jetzt von einer anderen Klasse im Model, hier in der Klasse SubModel, etwas verändere und dies der View mitteilen möchte, wie kann ich das tun?
Das Model als Referenz allen andern Model-(Sub)-Klassen übergeben und über diese Referenz setProperty aurufen? Ist aber reichlich unschön. Da gibts doch bestimmt eine bessere Lösung oder?

Danke schon mal im Vorraus,
Schwaba
 
normalerweise müßte dann SubModel auch Observable implementieren, die View dort auch registriert sein,
jedes Model informiert für sich die View,

man kann schon mehrere Klassen verwenden, aber dann sollten alle Änderungen von einer Hauptklasse ausgehen die sich darum kümmert,
wenn etwa SubModel nur von Model aus geändert wird, weiß Model ja Bescheid und es reicht wenn Model an View meldet,
SubModel muss dann gar nix machen (außer vielleicht per boolean-Rückgabewert dem Aufrufer Model etwas zu helfen)
 
Hm ok, und was wenn ich nun eine Klasse habe die darauf wartet per Netzwerk ein Packet zu empfangen? Wie teile ich das dann der VIEW mit? Die Klasse wird so nicht vom Model aus verwaltet, sie wartet ja darauf ein Packet zu empfangen.
Und diese Klasse im Observer der VIEW zu registrieren ist auch nicht so einfach.
 

Zurück
Oben