csc 313 – advanced programming topics. observer pattern in java java ♥ observer pattern &...
TRANSCRIPT
LECTURE 8:JAVA’S OBSERVABLE & OBSERVER
CSC 313 – Advanced Programming Topics
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 will support push model…void notifyObserver(Object arg)
… and pull model can also be usedvoid 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 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 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