observer pattern dependents, publish-subscribe, listener dirk...

17
Observer Pattern Dependents, Publish- Subscribe, Listener interling [email protected] Zugelder [email protected]

Upload: walborg-wubben

Post on 05-Apr-2015

118 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Observer Pattern

Dependents, Publish-Subscribe, Listener

Dirk Winterling [email protected] Zugelder [email protected]

Page 2: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Problemdefinition

Falls mehrere Objekte von einander abhängig sind und eines dieser Objekte geändert wird, sollen alle davon abhängigen über die Änderung informiert werden.

Dirk Winterling [email protected] Zugelder [email protected]

1 zu n Beziehung (keine Begrenzung der abhängigen Objekte)

Page 3: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Lösung

Sehr enge Kopplung zwischen dem Objekt und seinen Observern

wenig flexibel, kaum wiederverwendbar z.B. wenn ein neuer Observer (Listener) hinzugefügt werden soll

Trennung der Beteiligten voneinander

Observer muss von Änderungen erfahren

Dirk Winterling [email protected] Zugelder [email protected]

Page 4: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Beispiel (Ausgangssituation)

Dirk Winterling [email protected] Zugelder [email protected]

Page 5: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Beispiel (nach Veränderung)

Dirk Winterling [email protected] Zugelder [email protected]

Page 6: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Anwendungsmöglichkeiten

Wenn bei einer Änderung eines Objektes andere Objekte geändert werden müssen, man aber nicht weiß, wie viele Objekte dies sind.

Wenn ein Objekt in der Lage sein soll andere Objekte zu benachrichtigen, ohne zu wissen, welche diese sind. (Vermeidung einer engen Kopplung zwischen Objekten)

Dirk Winterling [email protected] Zugelder [email protected]

Page 7: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Strukturdiagramm

Dirk Winterling [email protected] Zugelder [email protected]

Page 8: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Beteiligte Objekte

Dirk Winterling [email protected] Zugelder [email protected]

Page 9: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Methoden im Detail

Dirk Winterling [email protected] Zugelder [email protected]

Page 10: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Interaktion der Elemente

Dirk Winterling [email protected] Zugelder [email protected]

Page 11: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

CodebeispielObservable

+setValue()+getValue() : Integer

ExcelTabelle

Observer

KuchenDiagramm SäulenDiagramm

Class ExcelTabelle extends Observable{

private int value;

public void setValue (int newValue){

value = newValue;setChanged();notifyObservers(value);

}

public int getValue (){

return value;}

}

class KuchenDiagramm extends Observer{

public void update (Observable o, Object newValue){

//Update des Diagramms…

}}

class SäulenDiagramm extends Observer{

public void update (Observable o, Object newValue){

//Update des Diagramms…

}}

Dirk Winterling [email protected] Zugelder [email protected]

Page 12: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Vorteile

Das Observer-Pattern ermöglicht es Subjekte und Observer getrennt zu behandeln (z.B. auszutauschen)

abstrakte Kopplung zwischen Subjekt und Observer: Ein Subjekt weiß nur, welche Observer bei ihm registriert sind, kennt also deren konkrete Subklassen nicht.

Unterstützung von Broadcast-Kommunikation: die Anzahl der zu benachrichtigenden Observer durch das Subjekt ist beliebig. Daher können Observer zu jeder Zeit hinzugefügt oder abgemeldet werden.

Dirk Winterling [email protected] Zugelder [email protected]

Page 13: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Nachteile

Unerwartete Updates: Da die Observer nicht gegenseitig ihrer Existenz bewußt sind, können unerwünschte Effekte auftreten. Beispielsweise kann die durch einen Observer ausgelöste Änderung zu einer aufwendigen Kaskasde von Änderungen in den anderen Observern führen

Dirk Winterling [email protected] Zugelder [email protected]

Page 14: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Active Observers ( Pull-Observers, Voyeur Patterns)

Das Subjekt informiert den Observer lediglich über eine Veränderung.

Der Observer fragt nun seinerseits bei dem Subjekt nach, welche Veränderung durchgeführt wurde und holt sich die für ihn notwendigen Änderungen ab

Dirk Winterling [email protected] Zugelder [email protected]

Page 15: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Passive Observers ( Push-Observers)

Das Subjekt informiert alle Observer detailliert über die durchgeführten Änderungen.

Alle Informationen werden übergeben, egal ob der Observer sie verwerten kann oder nicht.

Dirk Winterling [email protected] Zugelder [email protected]

Page 16: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Change Manager

Bildet die Schnittstelle zwischen Subjekt und Observer

Er definiert Update-Strategien Er aktuallisiert alle Observer auf den Wunsch

eines Subjektes

Dirk Winterling [email protected] Zugelder [email protected]

Die Interaktionen zwischen Subjekt und

Observer können durchaus sehr komplex sein.

Page 17: Observer Pattern Dependents, Publish-Subscribe, Listener Dirk Winterlingdw08@hdm-stuttgart.dedw08@hdm-stuttgart.de Marco Zugeldermz10@hdm-stuttgart.demz10@hdm-stuttgart.de

Literatur

„Design Patterns“ Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

Technische Hochschule Zürich Uni Weimar

Dirk Winterling [email protected] Zugelder [email protected]