Skip to content

Instantly share code, notes, and snippets.

@OriginUnknown
Created October 13, 2015 16:35
Show Gist options
  • Save OriginUnknown/d76247cfbf3b3f4c7bfc to your computer and use it in GitHub Desktop.
Save OriginUnknown/d76247cfbf3b3f4c7bfc to your computer and use it in GitHub Desktop.
JavaScript OOP Design Pattern - Observer Pattern
//observer pattern
//convert Subject into constructor function as there can be more than 1
var Subject = function () {
var observerCollection = [],
subject = {
"registerObservers": function ( observerArr ) {
observerArr.forEach( addToRegister );
return true;
},
"unregisterObserver": function ( observer ) {
observerCollection.splice( observer.getID(), 1 );
return true;
},
"notify": function () {
observerCollection.forEach( fireNotify );
}
},
addToRegister = function ( subscriber, i ) {
assignID( subscriber, observerCollection.length );//added here to assign 0
observerCollection.push( subscriber );
},
assignID = function ( o, id ) {
o.addID( id );
},
fireNotify = function ( observer, i ) {
observer.notify();
};
return subject;
};
//constructor pattern used over revealing module pattern as there will be
//N instances of observers
function Observer () {
this.addID = function ( id ) {
if ( ! this._id ) {
this._id = id;
return true;
}
};
this.getID = function () {
if ( this._id ) {
return this._id;
}
};
this.notify = function () {
};
}
var subject = Subject(),
observer1 = new Observer(),
observer2 = new Observer(),
observer3 = new Observer(),
observer4 = new Observer();
//concrete notify() implementations
observer1.notify = function () {
console.log( "1" );
};
observer2.notify = function () {
console.log( "2" );
};
observer3.notify = function () {
console.log( "3" );
};
observer4.notify = function () {
console.log( "4" );
};
//register subscribers/observers
subject.registerObservers( [ observer1, observer2, observer3, observer4 ] );
//fire notification w/ observer #3
subject.notify();
//unregister observer #3
subject.unregisterObserver( observer3 );
//fire notification w/o observer #3
subject.notify();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment