topical media & game development
actionscript-lib-util-Observable.ax
actionscript-lib-util-Observable.ax
[swf]
flex
package {
// import util.Observer;
A Java-style @ax-actionscript-lib-util-Observable class used to represent the "subject"
of the Observer design pattern. Observers must implement the Observer
interface, and register to observe the subject via addObserver().
public class @ax-actionscript-lib-util-Observable {
// A flag indicating whether this object has changed.
private var changed:Boolean = false;
// A list of observers.
private var observers:Array;
Constructor function.
public function @ax-actionscript-lib-util-Observable () {
observers = new Array();
}
Adds an observer to the list of observers.
parameter: o The observer to be added.
public function addObserver (o:actionscript_lib_util_Observer):Boolean {
// Can't add a null observer.
if (o == null) {
return false;
}
// Don't add an observer more than once.
for (var i:Number = 0; i < observers.length; i++) {
if (observers[i] == o) {
// The observer is already observing, so quit.
return false;
}
}
// Put the observer into the list.
observers.push(o);
return true;
}
Removes an observer from the list of observers.
parameter: o The observer to remove.
public function removeObserver (o:actionscript_lib_util_Observer):Boolean {
// Find and remove the observer.
var len:Number = observers.length;
for (var i:Number = 0; i < len; i++) {
if (observers[i] == o) {
observers.splice(i, 1);
return true;
}
}
return false;
}
Tell all observers that the subject has changed.
parameter: infoObj An object containing arbitrary data
to pass to observers.
public function notifyObservers (infoObj:Object):void {
// If the object hasn't changed, don't bother notifying observers.
if (!changed) {
return;
}
// Make a copy of the observers array. We do this
// so that we can be sure the list won't change while
// we're processing it.
var observersSnapshot:Array = observers.slice(0);
// This change has been processed, so unset the "changed" flag.
clearChanged();
// Invoke update() on all observers.
for (var i:Number = observersSnapshot.length-1; i >= 0; i--) {
observersSnapshot[i].update(this, infoObj);
}
}
Removes all observers from the observer list.
public function clearObservers ():void {
observers = new Array();
}
Indicates that the subject has changed.
protected function setChanged():void {
changed = true;
}
Indicates that the subject has either not changed or
has notified its observers of the most recent change.
protected function clearChanged ():void {
changed = false;
}
Checks if the subject has changed.
returns: true if the subject has changed, as determined by setChanged().
public function hasChanged():Boolean {
return changed;
}
Returns the number of observers in the observer list.
returns: An integer: the number of observers for this subject.
public function countObservers ():Number {
return observers.length;
}
}
}
(C) Æliens
27/08/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.