Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
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