Observer Pattern notifyObservers

Status
Nicht offen für weitere Antworten.

knowledge

Bekanntes Mitglied
Hallo,

bevor ein notifyObservers Aufruf erfolgreich ist, muss ja mittels setChanged das flag auf true gesetzt werden. Im Buch "Designpatterns von Kopf bis Fuß" wurde dies damit erklärt, dass man dadurch eine höhere Flexibilität gewinnt. Am Beispiel einer Wetterstation, welche Observer informiert, wurde erklärt, dass man, wenn sich die Temperatur nur geringfügig ändert so ja permanent die Observer informieren würde. Das Flag gibt jedoch die Möglichkeit, dass informieren etwas feiner zu steuern, z.B. informiere nur, wenn sich ein Temperaturwert um 1 Grad geändert hat. Kennt jemand das Beispiel?

Beim Lesen habe ich mich gefragt, wo da die höhere Flexibilität sein soll. Wenn notifyObservers immer die Observer informieren würde, d.h. kein flag vorher geprüft wird, wäre ich doch trotzdem noch flexibel.

Für das o.g. Szenario würde ich ja folgendes schreiben (Pseudocode):

if(temperatureNew-temperatureOld>= 2)
{
setChanged();
notifyObservers();
}

So müsste ich ja, wenn das Flag nicht da wäre ja nur schreiben:

if(temperatureNew-temperatureOld>= 2)
{
notifyObservers();
}

Wo also bringt mir das setChanged Flag eine höhere Flexibilität? Das habe ich noch nicht ganz verstanden.

Schönes WE
 
S

SlaterB

Gast
das ist ein einfacher boolean, ich würde dem nicht zu viel Bedeutung beimessen,

ich könnte mir vorstellen, dass eine Daten-Update-Methode nur
if(temperatureNew-temperatureOld>= 2)
{
setChanged();
}

lautet und ein separat laufender Thread alle 100ms nachschaut, ob hasChanged() true ergibt und dann notifyObservers(); aufruft,
damit das ganze nicht zu oft passiert,
oder es wird generell alle 100ms informiert, ganz egal ob sich was geändert hat oder nicht und hasChanged() gibt dann diese Info,
diese Konstanz widerspricht allerdings ein wenig dem Observer-Prinzip,
andererseits ist das bei 10 Observern vielleicht mit einem Thread leichter zu steuern als wenn jeder einzelne derzeitige Observer kein Observer mehr ist sondern selber ein Thread ist und alle 100ms selber aktiv vorbeischaut


außerdem könnte es mehrere Observer geben, manche interessieren sich für alle Ereignisse,
andere fragen hasChanged() ab und machen evtl. gar nix

so in der Art, nix was man sonst nicht selber programmieren könnte,
allerdings kann ich nicht behaupten, damit alle Gedankengänge aus Pattern-Büchern wiedergegeben zu haben
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
Hmja, wie auch SlaterB ha(tt/b)e ich Schwierigkeiten, diese "Begründung" mit der "höheren Flexibilität" so nachzuvoellziehen, und alle Beispiele, wo das was bringen würde, würden "gestelzt" wirken.

So einen Thread, der immer läuft und regelmäßig benachrichtigt will man mit diesem Pattern ja gerade vermeiden - deswegen kann das kaum der Grund sein. Ach das
außerdem könnte es mehrere Observer geben, manche interessieren sich für alle Ereignisse,
andere fragen hasChanged() ab und machen evtl. gar nix

kann nicht stimmen: Wenn hasChanged() "false" liefert, werden die Observer garnicht erst benachrichtigt! (Das prüft das Observable schon selbst)

Der einzige Gedanke, der mir käme, wäre, dass man mehrere Änderungen machen will, aber nicht bei JEDER Änderung einzeln die Observer banchrichtigen, sondern erst, wenn alle Änderungen gemacht wurden - etwa sowas wie
Code:
void setSomeThings(int a, int b, int c)
{
    setA(a); // Prüften jeweils, ob es eine "echte"
    setB(b); // Änderung war, und setzen ggf. 
    setC(c); // das hasChanged-flag

    // Das benachrichtigt die Observer nur, wenn
    // einer der Aufrufe oben das hasChanged
    // flag wirklich gesetzt hat
    notifyObservers(); 
}
aber das wirkt sehr konstruiert: Eigentlich sollte jede set-Methode selbst notifyObservers aufrufen.

Ein Fall, wo es einen Hauch von Sinn machen würde, wäre, wenn man die Änderungen "Teleskopartig" aufbaut
Code:
void setSomeThings(int a, int b)
{
    if (this.a != a)
    {
        this.a = a;
        setChanged();
    }

    // Prüft auf Änderungen, setzt ggf. das changed-flag,
    // und ruft ggf. notifyObservers auf (wordurch das 
    // changed-flag zurückgesetzt wird)
    setB(b);

    // Das benachrichtigt die Observer nur, wenn
    // sie nicht schon von setB aus benachrichtigt
    // wurden...
    notifyObservers(); 
}
Aber ... das wirkt NOCH konstruierter und chaotischer...
 

knowledge

Bekanntes Mitglied
verdammt, aber irgend einen sinn muss das doch machen :-( umsonst bräuchte man doch nicht ein booleand und die abfrage in notifyObservers, wenn das nicht sinnvoll wäre
 

Marco13

Top Contributor
Wie SlaterB schon gesagt hat: Es ist nichts, was man nicht selbst durch einen boolean nachbauen könnte - aber zufällig bietet Observable das schon bequem an...
 

knowledge

Bekanntes Mitglied
Hallo Marco,

das man das nachbauen kann ist klar :) Die Frage die sich mir immernoch stellt, wie so ein boolean flag eine Verbesserung bringt gegenüber einem "sofortigen senden". D.h. notifyObservers prüft ja das Flag und informiert erst dann. Eine Prüfung ob informiert werden soll (siehe Temperaturbsp.) ist jedoch auch ohne solch ein Flag möglich.

Also statt:

if(differenz>=2)
{
setChanged();
notifyObserver();
}

nur ein
if(differenz>=2)
{
notifyObserver(); // wenn die Methode immer senden würde
}

D.h. das Flag selber bringt doch keine wirkliche Verbesserung... Das ist mir noch nicht klar, wieso das nicht ohne das Flag gelöst wurde
 
S

SlaterB

Gast
notifyObservers() + hasChanged() sind public, können von außen aufgerufen werden,
setChanged() + clearChanged() sind protected, damit ist zumindest eine gewisse Kontrolle Observable selber gegeben bzw. dessen SubKlassen

dies spricht wiederum dafür, dass das ganze dafür ausgelegt, dass jemand anders von außen notifyObservers() aufruft (siehe mein ersten Post),
warum auch immer
vielleicht soll dies ein neuer Thread sein, allein schon weil die update-Methoden aller Oberserver lange brauchen können,
wer nur kurz setTemparature() an einem unscheinbaren Datenobjekt aufruft, rechnet nicht unbedingt damit,
zwei Sekunden warten zu müssen, bis das halbe Programm per Observierung geupdated wurde

wenn man also davon ausgeht, dass in bestimmten Programmen aus irgendeinem Grunde nicht direkt in jeder set-Methode auch das notify() drinsteht,
sondern mehr oder weniger zeitversetzt durcheinander vielleicht durch Einsatz von Threads nofity()-Aufrufe von außen reinkommen,
dann scheint eine solche simple Steuerung zur Vermeidung doppelter notify()-Durchläufe gar nicht so überflüssig,

in einfachen Fällen kann man aber vielleicht drauf verzichten, siehe diese Anleitung, die in zwei von drei Versionen darauf verzichtet
(und es auch nicht näher erklärt)
http://de.wikibooks.org/wiki/Java_Standard:_Muster_Observer
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
Wie in meinem zweiten Beispiel schon angedeutet: Wenn die Bedingung, unter der die Observer genotified werden sollten, komplexer wird, ist es so vielleicht übersichtlicher. Sowas wie
Code:
if (a != newA) { a = newA; setChanged(); }
if (b != newB) { b = newB; setChanged(); }
if (c != newC) { c = newC; setChanged(); }
if (d != newD) { d = newD; setChanged(); }
if (e != newE) { e = newE; setChanged(); }
if (f != newF) { f = newF; setChanged(); }
notifyObservers();
wäre ja effektiv nur durch ein flag vernünftig nachzubauen - wie sollte dieser Codeblock sonst aussehen?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Methoden Observer-Pattern mit Consumer und accept( ) Java Basics - Anfänger-Themen 6
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
fLooojava MVC Pattern und Observer Pattern Java Basics - Anfänger-Themen 6
A Observer Pattern Problem Java Basics - Anfänger-Themen 15
J Interface Frage zu Interfces am Beispiel Observer Pattern Java Basics - Anfänger-Themen 8
Helgon Observer Pattern - hasChanged() immer false Java Basics - Anfänger-Themen 10
C OOP Observer Pattern Java Basics - Anfänger-Themen 2
W Observer-Pattern Java Basics - Anfänger-Themen 3
T Verständnisfrage Observer-Pattern Java Basics - Anfänger-Themen 8
S Observer Pattern notifyObserver Java Basics - Anfänger-Themen 6
M Observer Pattern Java Basics - Anfänger-Themen 14
A MVC Observer Pattern Java Basics - Anfänger-Themen 2
Y Observer update Java Basics - Anfänger-Themen 3
N Observer funktioniert nicht Java Basics - Anfänger-Themen 13
G Observer löst zweimal aus Java Basics - Anfänger-Themen 8
A ein observer "post"problem Java Basics - Anfänger-Themen 3
F Observer Java Basics - Anfänger-Themen 7
U observer thread safe Java Basics - Anfänger-Themen 4
B Wozu Observer? Java Basics - Anfänger-Themen 9
Spin Observer Patteern java Java Basics - Anfänger-Themen 7
O Liste - Observer/Observeable - HashMap Hilfe Java Basics - Anfänger-Themen 19
O Observer - Einfach erklärt? Java Basics - Anfänger-Themen 5
P Fragen zum Observer Muster und Datenbanken Java Basics - Anfänger-Themen 2
T Observer ansprechen Java Basics - Anfänger-Themen 2
R Observer funktioniert nicht. Sehe keine Fehler Java Basics - Anfänger-Themen 2
hdi JList mit Model und Observer -> Chaos, blicke nicht durch Java Basics - Anfänger-Themen 22
hdi Observer als statische Klasse ? Java Basics - Anfänger-Themen 2
N observer frage Java Basics - Anfänger-Themen 2
G Implementierung des Observer/Observable Patterns - Gut so? Java Basics - Anfänger-Themen 3
N observer Java Basics - Anfänger-Themen 12
H [erledigt] Observable/Observer Beobachter entfernen Java Basics - Anfänger-Themen 2
G Unterschied Observer&Observable<->java.beans.Prope Java Basics - Anfänger-Themen 4
G Benötige Hilfe bei Problem mit Observer! Java Basics - Anfänger-Themen 2
E Observer Java Basics - Anfänger-Themen 7
K Observer Observable update() . Java Basics - Anfänger-Themen 13
Y Observer - notifyObservers(Object arg) Java Basics - Anfänger-Themen 4
M Servlets und Observer Java Basics - Anfänger-Themen 2
G Observable/Observer-Patterns Java Basics - Anfänger-Themen 9
G Observable/Observer update wird nicht ausgeführt Java Basics - Anfänger-Themen 9
D was ist der vorteil vom Builder-design pattern? Java Basics - Anfänger-Themen 11
W GoF-Pattern im Programmierer-Alltag Java Basics - Anfänger-Themen 113
D Java Pattern mit X Ausgabe Stern Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Pattern.matcher,die Besonderheiten. Java Basics - Anfänger-Themen 12
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
F Design pattern Java Basics - Anfänger-Themen 29
W RegEx Matcher + Pattern und Emails Java Basics - Anfänger-Themen 8
M Schlüsselworte Unterschied: String.matches und Pattern.compile Java Basics - Anfänger-Themen 2
C Best Practice JTable in MVC Pattern Java Basics - Anfänger-Themen 7
D Design Pattern Command Java Basics - Anfänger-Themen 3
Bregedur Methoden Matcher und Pattern bei sich wiederholenden Werten Java Basics - Anfänger-Themen 1
S Regex Pattern Java Basics - Anfänger-Themen 3
Z Pattern und Matcher substring zu String möglich? Java Basics - Anfänger-Themen 4
B Pattern für Email Liste Java Basics - Anfänger-Themen 3
J Builder Pattern implementieren Java Basics - Anfänger-Themen 3
Tarrew Proxy Design-Pattern Java Basics - Anfänger-Themen 1
M Methoden Pattern Matching Vokal Java Basics - Anfänger-Themen 2
agent47 Pattern split Java Basics - Anfänger-Themen 2
J MVC Pattern, mehrere Controller/Views/Models Java Basics - Anfänger-Themen 0
B Strategy Pattern - Rechner Java Basics - Anfänger-Themen 6
I Vertändnisfrage zu Prototype Pattern Java Basics - Anfänger-Themen 0
L Kompositum-Pattern Hilfe :O Java Basics - Anfänger-Themen 4
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
S Je nach erhaltene Daten unterschiedlich reagieren (Design Pattern?) Java Basics - Anfänger-Themen 3
B Pattern Matching ohne Match-Methoden Java Basics - Anfänger-Themen 11
Furtano OOP Memento Pattern | übergabe einer Kopie des Arrays Java Basics - Anfänger-Themen 0
F Erste Schritte Pattern zum Zerlegen von selbstdefinierten Dateinamen Java Basics - Anfänger-Themen 7
M MVC + Strategy Pattern Ansatz (mit Code) Java Basics - Anfänger-Themen 5
A Design Pattern - Welche? Java Basics - Anfänger-Themen 33
Rudolf OOP Übungen zu Design Pattern in Java Java Basics - Anfänger-Themen 6
S OOP Regex Pattern Java Basics - Anfänger-Themen 2
P Grundsatzfrage zu Decorator-Pattern Java Basics - Anfänger-Themen 6
L Pattern Matching Java Basics - Anfänger-Themen 3
L RegExp bzw Pattern in Java Java Basics - Anfänger-Themen 6
R aktualisierung des View im MVC-Pattern Java Basics - Anfänger-Themen 5
M RegEx Pattern Matcher Java Basics - Anfänger-Themen 16
R Pattern bzw. Regex HTML-Code Java Basics - Anfänger-Themen 10
N Regexp Pattern & Matcher Problem Java Basics - Anfänger-Themen 4
I OOP Verständnisfrage zu Singelton Pattern Java Basics - Anfänger-Themen 21
R Welches Design pattern Java Basics - Anfänger-Themen 10
B static und Pattern matching Java Basics - Anfänger-Themen 22
T pattern klappt nicht so Java Basics - Anfänger-Themen 6
T Decorator Pattern Java Basics - Anfänger-Themen 7
A Pattern und Matcher Java Basics - Anfänger-Themen 9
T Frage zu Pattern/Matcher Java Basics - Anfänger-Themen 6
D Pattern in Midi-Sequencer Java Basics - Anfänger-Themen 2
V Frage zu Decorator-Pattern Java Basics - Anfänger-Themen 4
S OOP Factory Pattern Java Basics - Anfänger-Themen 2
M Regex-Pattern Java Basics - Anfänger-Themen 2
Haubitze_Broese Pattern für Links in RSS-Reader Java Basics - Anfänger-Themen 6
Raidri Pattern liefert false Java Basics - Anfänger-Themen 9
megachucky regex-Problem ( mit den Klassen Matcher / Pattern) --> XML prüfen Java Basics - Anfänger-Themen 11
O useDelimiter / Muster im Parameter (Pattern) Java Basics - Anfänger-Themen 6
S Problem mit Pattern Java Basics - Anfänger-Themen 2
S Pattern.matches mit Ignore Case Java Basics - Anfänger-Themen 2
N in int array einen pattern(eine zahl) finden Java Basics - Anfänger-Themen 21
A Hilfe zu Pattern Java Basics - Anfänger-Themen 2
Y Pattern Java Basics - Anfänger-Themen 2
A Proxy Pattern implementieren Java Basics - Anfänger-Themen 2
N OOP MVC Pattern Java Basics - Anfänger-Themen 3
G Probleme mit Pattern und Aussagenlogik Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben