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