export interface Observer { update(nextState: T | null): void; } export abstract class Subject { private observers: Set> = new Set>(); private state: T | null = null; public getState() { return this.state; } public setState(nextState: T) { if(nextState === this.state){ return; } this.state = nextState; this.notify(); } public attach(observer: Observer) { this.observers.add(observer); } public detach(observer: Observer) { this.observers.delete(observer); } private notify() { this.observers.forEach(item => item.update(this.state)); } }