csc 313 – advanced programming topics. observer pattern in java java ♥ observer pattern &...

Post on 20-Jan-2016

220 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

top related