Created
June 12, 2021 09:36
-
-
Save devrkd/bf376891890956e41bbe5aa8bf6136ca to your computer and use it in GitHub Desktop.
Observer Pattern example in Typescript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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