CSC 313 – Advanced Programming Topics. Observer Pattern Intent Efficiently perform 1-to-many...

30
LECTURE 9: JAVA’S OBSERVABLE & OBSERVER CSC 313 – Advanced Programming Topics

Transcript of CSC 313 – Advanced Programming Topics. Observer Pattern Intent Efficiently perform 1-to-many...

LECTURE 9:JAVA’S OBSERVABLE & OBSERVER

CSC 313 – Advanced Programming Topics

Observer Pattern Intent

Efficiently perform 1-to-many communication Easy to respond dynamically when

event(s) occurs Can create many, many possible actions to

occur Update which actions used throughout

execution Can also use to break mutual

dependency UML class diagram cycles split and

managed Dirty & ugly hack that also is incredibly

useful

Registering an Observer

Subject adds & removes Observers as needed Adding is simple Events also simple, call Observers’ update

method Removing not as simple, but still not very

hard Requires some means of holding

Observers Array ArrayList or LinkedList HashMap

Registering an Observer

Subject adds & removes Observers as needed Adding is simple Events also simple, call Observers’ update

method Removing not as simple, but still not very

hard Requires some means of holding

Observers Array*

ArrayList or LinkedList HashMap

* Anyone who still did not object to this, fails BIG!

Getting the Word Out

Calling Observers’ update methods is simple But for call Observer needs associated information Not always clear what is best way to share this data Must understand strengths & weaknesses of each

Push model is easiest of two approaches Observers get data directly from Subject Method’s parameters have values to be used

Another approach using pattern’s pull model Subject provides strategy to Observers via a param To get data, Observer uses strategies methods

Observer Pattern in Java

Java ♥ Observer Pattern & uses everywhere Find pattern in JButton & ActionListeners

Tracking mouse in Swing using Observer Pattern

Much of the multi-threaded API uses this Event-based code needs Observers

to work Not limited to Java; true for most OO

languages

java.util.Observable

Among original classes included in Java Works with java.util.Observer interface

Observable manages Observers in codevoid addObserver(Observer o)void deleteObserver(Observer o)void deleteObservers() int countObservers()

Handling Updates

Observable approach supports push…void notifyObserver(Object arg)

… & pull model available as wellvoid notifyObserver()boolean hasChanged()void clearChanged()void setChanged()

Notifications sent to Observer’s only method void update(Observable o, Object arg)

Using Observable Problem

public class CSCClass {private Observable obs;

// Lots of unimportant code here

public void cancelClass() { obs.notifyObservers(“Go drinking!”);}

}

Using Observable Problem

public class CSCClass {private Observable obs;

// Lots of unimportant code here

public void cancelClass() { obs.notifyObservers(“Go drinking”);}

}

Using Observable Problem

public class CSCClass {private Observable obs;

// Lots of unimportant code here

public void cancelClass() { obs.notifyObservers(“Go drinking”);}

}

Bad & Worse Design Decisions No update was sent

Bad & Worse Design Decisions No update was sent; sobriety ruled

the day

Bad & Worse Design Decisions No update was sent; sobriety ruled

the day

Bad & Worse Design Decisions No update was sent; sobriety ruled the

day

notifyObservers misnamed horribly Should be notifyObserversIfChanged Must call setChanged before notifying

Use of notifyObservers inconsistent, too Calls clearChanged automatically once

updates sent

Updated Code

public class CSCClass {private Observable obs;

// Lots of unimportant code here

public void cancelClass() { obs.setChanged(); obs.notifyObservers(“Go drinking”);}

}

Next Attempt

public class CSCClass {private Observable obs;

// Lots of unimportant code here

public void cancelClass() { obs.setChanged(); obs.notifyObservers(“Go drinking”);}

}

Next Attempt

public class CSCClass {private Observable obs;

// Lots of unimportant code here

public void cancelClass() { obs.setChanged(); obs.notifyObservers(“Go drinking”);}

}

Next Attempt

public class CSCClass {private Observable obs;

// Lots of unimportant code here

public void cancelClass() { obs.setChanged(); obs.notifyObservers(“Go drinking”);}

}

Next Attempt

public class CSCClass {private Observable obs;

// Lots of unimportant code here

public void cancelClass() { obs.setChanged(); obs.notifyObservers(“Go ski”);}

}

setChanged has protected access

%&#*@ Awful Design

%&#*@ Awful Design

setChanged & clearChanged protected accessjava.util package is sealed; cannot write class for itCan only be called & used from within subclass

Must write subclass of Observable to use it

As this is Java, that class cannot extend others

Updates received in method of Observer:

void update(Observable o, Object arg)

This really means that can only push 1 objectKills point of push model since cannot push much

%&#*@ Awful Design

setChanged & clearChanged protected accessjava.util package is sealed; cannot write class for itCan only be called & used from within subclass

Must write subclass of Observable to use it

As this is Java, that class cannot extend others

Updates received in method of Observer:

void update(Observable o, Object arg)

This really means that can only push 1 objectKills point of push model since cannot push much

Useless

Final Attempt

public class CSCClass extends Observable {public void cancelClass() { setChanged(); notifyObservers(“Go drinking”);}

}

public class Student implements Observer {public void update(Observable o, Object arg) { String s = (String)arg; if (!s.equals(“Get here NOW!!!”))

// Go drinking else

// Go to class}

}

Final Attempt

public class CSCClass extends Observable {public void cancelClass() { setChanged(); notifyObservers(“Go drinking”);}

}

public class Student implements Observer {public void update(Observable o, Object arg) { String s = (String)arg; if (!s.equals(“Get here NOW!!!”))

// Go drinking else

// Go to class with a drink}

}

Final Attempt

Final Attempt

Observable Pros & Cons

Cons:

Pros:

Observable Pros & Cons

Cons: Need a subclass of Observable to use Must call setChange before notifyObservers

Can push only 1 object to Observers Pros:

Already has code to add & remove Observers

Easy to rewrite and improve upon this design

For Next Lecture

Two (short) readings available on web Will start looking into how code is

optimized How does Java run & make programs

faster? What can we do to make our code

faster? Using final can be huge. Why would it

matter?

Lab #2 due at week’s end & still on Angel Make sure that you also check the

grading rubric Use Assignment Submitter when turning

it in