300 likes | 433 Views
This lecture covers the fundamentals of Java's Observable and Observer pattern, focusing on efficient one-to-many communication. Learn how to dynamically respond to events, manage observer registration, and update actions during execution seamlessly. Examine the strengths and weaknesses of push vs. pull models in data sharing. Understand the importance of maintaining observers and handling updates effectively while navigating Java's built-in classes like java.util.Observable and java.util.Observer. Gain insights into practical applications and common design flaws.
E N D
CSC 313 – Advanced Programming Topics Lecture 9:Java’s Observable & Observer
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 • Subjectadds & 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 • Subjectadds & 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 Observerneeds 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 • Subjectprovides strategy to Observers via a param • To get data, Observeruses 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 Observersin code void addObserver(Observer o)void deleteObserver(Observer o)void deleteObservers() intcountObservers()
Handling Updates • Observable approach supports push… void notifyObserver(Object arg) … & pull model available as well void notifyObserver()booleanhasChanged()void clearChanged()void setChanged() • Notifications sent to Observer’s only method void update(Observableo, Object arg)
Using Observable Problem public class CSCClass {private Observable obs;// Lots of unimportant code herepublic void cancelClass() {obs.notifyObservers(“Go drinking!”);} }
Using Observable Problem public class CSCClass {private Observable obs;// Lots of unimportant code herepublic void cancelClass() {obs.notifyObservers(“Go drinking”);} }
Using Observable Problem public class CSCClass {private Observable obs;// Lots of unimportant code herepublic 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 setChangedbefore notifying • Use of notifyObservers inconsistent, too • Calls clearChanged automatically once updates sent
Updated Code public class CSCClass {private Observable obs;// Lots of unimportant code herepublic void cancelClass() {obs.setChanged();obs.notifyObservers(“Go drinking”);} }
Next Attempt public class CSCClass {private Observable obs;// Lots of unimportant code herepublic void cancelClass() {obs.setChanged();obs.notifyObservers(“Go drinking”);} }
Next Attempt public class CSCClass {private Observable obs;// Lots of unimportant code herepublic void cancelClass() {obs.setChanged();obs.notifyObservers(“Go drinking”);} }
Next Attempt public class CSCClass {private Observable obs;// Lots of unimportant code herepublic void cancelClass() {obs.setChanged();obs.notifyObservers(“Go drinking”);} }
Next Attempt public class CSCClass {private Observable obs;// Lots of unimportant code herepublic void cancelClass() {obs.setChanged();obs.notifyObservers(“Go ski”);} } setChanged has protected access
%&#*@ Awful Design • setChanged & clearChangedprotected 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 onlypush 1 object • Kills point of push model since cannot push much
%&#*@ Awful Design • setChanged & clearChangedprotected access • java.util package is sealed; cannot write class for it • Can only be called & used from within subclass • Must write subclass of Observableto 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 onlypush 1 object • Kills point of push model since cannot push much Useless
Final Attempt public class CSCClassextends 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 CSCClassextends 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} }
Observable Pros & Cons • Cons: • Pros:
Observable Pros & Cons • Cons: • Need a subclass of Observableto 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