Skip to content

Instantly share code, notes, and snippets.

@jmcmaster
Last active April 9, 2018 16:55
Show Gist options
  • Save jmcmaster/611fd11be31a2af6cfa54ccd3f4b4371 to your computer and use it in GitHub Desktop.
Save jmcmaster/611fd11be31a2af6cfa54ccd3f4b4371 to your computer and use it in GitHub Desktop.
// Observer Pattern
// Inspired by: https://addyosmani.com/resources/essentialjsdesignpatterns/book/#observerpatternjavascript
var Subject = function() {
let observers = [];
const publicAPI = {
subscribeObserver: function(observer) {
observers.push(observer);
},
unsubscribeObserver: function(observer) {
var index = observers.indexOf(observer);
if (index > -1) {
observers.splice(index, 1);
}
},
notifyObserver: function(observer) {
var index = observers.indexOf(observer);
if (index > -1) {
observers[index].notify();
}
},
notifyAllObservers: function() {
for (var i = 0; i < observers.length; i++) {
observers[i].notify();
}
}
};
return publicAPI;
}
var Observer = function(num) {
return {
notify: function() {
console.log(`Observer ${num} is notified!`);
}
}
}
// Usage:
var subject = new Subject();
var observer1 = new Observer(1);
var observer2 = new Observer(2);
var observer3 = new Observer(3);
var observer4 = new Observer(4);
subject.subscribeObserver(observer1);
subject.subscribeObserver(observer2);
subject.subscribeObserver(observer3);
subject.subscribeObserver(observer4);
subject.notifyObserver(observer2);
subject.unsubscribeObserver(observer2);
subject.notifyAllObservers();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment