Skip to content

Instantly share code, notes, and snippets.

@devrkd
Created June 12, 2021 09:36
Show Gist options
  • Save devrkd/bf376891890956e41bbe5aa8bf6136ca to your computer and use it in GitHub Desktop.
Save devrkd/bf376891890956e41bbe5aa8bf6136ca to your computer and use it in GitHub Desktop.
Observer Pattern example in Typescript
interface Observable {
subscribe(observer: Observer): void;
unsubscribe(observer: Observer): void;
notify(): void;
}
interface Observer {
update(subject: Subject);
}
class Subject implements Observable {
private observers: Observer[] = [];
subscribe(observer: Observer) {
this.observers.push(observer);
}
unsubscribe(observer: Observer) {
this.observers = this.observers.filter((o) => {
return o !== observer
})
console.log('observer detached...' + observer.constructor.name);
}
notify() {
this.observers.forEach((o) => {
o.update(this);
})
}
}
class Score extends Subject {
private score: number;
public updateScore(score: number)
{
this.score = score;
console.log('got new score.....');
this.notify();
}
public getScore() {
return this.score;
}
}
class DisplayScore implements Observer {
update(subject: Score) {
console.log('Display score: ' + subject.getScore());
}
}
class CliScore implements Observer {
update(subject: Score) {
console.log('CLI score: ' + subject.getScore());
}
}
const score = new Score();
const display = new DisplayScore();
const cli = new CliScore();
score.subscribe(display);
score.subscribe(cli);
score.updateScore(4);
score.unsubscribe(cli);
score.updateScore(5);
score.unsubscribe(display);
score.updateScore(6);
/* Output of above code
got new score.....
Display score: 4
CLI score: 4
observer detached...CliScore
got new score.....
Display score: 5
observer detached...DisplayScore
got new score.....
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment