The Observer Pattern
GoF book, Design Patterns: Elements of Reusable Object-Oriented Software :
"One or more observers are interested in the state of a subject and register their interest with the subject by attaching themselves. When something changes in our subject that the observer may be interested in, a notify message is sent which calls the update method in each observer. When the observer is no longer interested in the subject's state, they can simply detach themselves."
--------------------------------------------------
function OL(){ this.ol = []; }
OL.prototype.add = function(o) { return this.ol.push( o ); };
OL.prototype.remove = function(i) { this.ol.splice( i, 1 ); };
OL.prototype.count = function() { return this.ol.length; };
OL.prototype.get = function(i) { if( i > -1 && i < this.ol.length ){ return this.ol[i]; } };
OL.prototype.indexOf = function(o) {
for(var i; i < this.ol.length; i++) {
if( this.ol[i] === o ) { return i; }
return -1;
}
};
// Maybe just extend OL class or using [] as new OL() ?
function Subject() { this.os = new OL();}
Subject.prototype.addObserver = function( o ){ this.os.add( o ); };
Subject.prototype.removeObserver = function( o ){ this.os.remove( this.os.indexOf(o) ); };
Subject.prototype.notify = function( context ){
var observerCount = this.os.count();
for(var i=0; i < observerCount; i++){
this.os.get(i).update( context );
}
};
// The Observer
function Observer(){
this.update = function(){
// ...
};
}
--------------------------------------------------
// Extend an object with an extension
function extend(obj, extension){
for (var key in extension){
obj[key] = extension[key];
}
}
// Concrete Subject
// Extend the controlling checkbox with the Subject class
extend( aSubject, new Subject() );
// aFunction will trigger notifications and passing data to its observers
aSubject.aFunction = function(){ aSubject.notify( aSubject.data ); };
// aObjAction will add observer to aSubject
aObjAction.aMethod = addO;
// Concrete Observer
function addO(){
// Extend the aO with the Observer class
extend(aO, new Observer());
// Override with custom update behaviour
aO.update = function( value ){ alert(value); };
// Add observer to aSubject
aSubject.addObserver(aO);
}
--------------------------------------------------
// When aObjAction.aMethod is called, aO observer is added to aSubject
// When aSubject.aFunction is called, aO will alert its data
Differences Between The Observer And Publish/Subscribe Pattern
Observer pattern: observer must subscribe itself to the subject firing the event.Publish/Subscribe pattern: use a topic/event channel, subscriber received notifications and publisher firing the event.
沒有留言:
張貼留言