Transcript Slides
CSC 313 – Advanced Programming Topics
LECTURE 8:
JAVA’S OBSERVABLE &
OBSERVER
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 code
void addObserver(Observer o)
void deleteObserver(Observer o)
void deleteObservers()
int countObservers()
Handling Updates
Observable will support push model…
void notifyObserver(Object arg)
… and pull model can also be used
void 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 ski”);
}
}
Using Observable Problem
public class CSCClass {
private Observable obs;
// Lots of unimportant code here
public void cancelClass() {
obs.notifyObservers(“Go ski”);
}
}
Using Observable Problem
public class CSCClass {
private Observable obs;
// Lots of unimportant code here
public void cancelClass() {
obs.notifyObservers(“Go ski”);
}
}
Bad & Worse Design Decisions
No update was sent
Bad & Worse Design Decisions
No update was sent
Bad & Worse Design Decisions
No update was sent; everyone went to class
Bad & Worse Design Decisions
No update was sent; everyone went to class
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 ski”);
}
}
Next Attempt
public class CSCClass {
private Observable obs;
// Lots of unimportant code here
public void cancelClass() {
obs.setChanged();
obs.notifyObservers(“Go ski”);
}
}
Next Attempt
public class CSCClass {
private Observable obs;
// Lots of unimportant code here
public void cancelClass() {
obs.setChanged();
obs.notifyObservers(“Go ski”);
}
}
Next Attempt
public class CSCClass {
private Observable obs;
// Lots of unimportant code here
public void cancelClass() {
obs.setChanged();
obs.notifyObservers(“Go ski”);
}
}
Next Attempt
public class CSCClass {
private Observable obs;
// Lots of unimportant code here
public void cancelClass() {
obs.setChanged();
obs.notifyObservers(“Go
setChanged
has protectedski”);
access
}
}
%&#*@ Awful Design
%&#*@ Awful Design
setChanged & clearChanged protected access
java.util package is sealed; cannot write class for it
Can 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 object
Kills point of push model since cannot push much
%&#*@ Awful Design
setChanged & clearChanged protected access
java.util package is sealed; cannot write class for it
Can 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
Useless o, Object arg)
This really means that can only push 1 object
Kills point of push model since cannot push much
Final Attempt
public class CSCClass extends Observable {
public void cancelClass() {
setChanged();
notifyObservers(“Go ski”);
}
}
public class Student implements Observer {
public void update(Observable o, Object arg) {
String s = (String)arg;
if (s.equals(“Get here NOW!!!”))
// Go skiing
else
// Go to class; think about skiing
}
}
Final Attempt
Final Attempt
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 in 1 week & available on Angel
Make sure that you also check the grading rubric
Help available in WTC206 during the lab time