// 添加观察者 public addObserver(observer: Observer): void { console.log(observer, " is pushed~~"); this.observers.push(observer); }
// 移除观察者 public deleteObserver(observer: Observer): void { console.log(observer, " have deleted~~"); const idx: number = this.observers.indexOf(observer); ~idx && this.observers.splice(idx, 1); }
// 通知观察者 public notifyObservers(): void { console.log("notify all the observers ", this.observers); this.observers.forEach(observer => { // 调用 notify 方法时可以携带指定参数 observer.notify(); }); } }
定义
「具体观察者类」(ConcreteObserver)
// ObserverPattern.ts
// 具体观 class ConcreteObserver implements Observer{ constructor(private name: string) {}
notify(): void { // 可以处理其他逻辑 console.log(`${this.name} has been notified.`); } }
测试代码
// ObserverPattern.ts
functionuseObserver(): void{ const subject: Subject = new ConcreteSubject(); const Leo = new ConcreteObserver("Leo"); const Robin = new ConcreteObserver("Robin"); const Pual = new ConcreteObserver("Pual"); const Lisa = new ConcreteObserver("Lisa");
class ConcreteSubject implements Subject{ private observers: Observer[] = [];
public addObserver(observer: Observer): void { console.log(observer, " is pushed~~"); this.observers.push(observer); }
public deleteObserver(observer: Observer): void { console.log(observer, " have deleted~~"); const idx: number = this.observers.indexOf(observer); ~idx && this.observers.splice(idx, 1); }
public notifyObservers(): void { console.log("notify all the observers ", this.observers); this.observers.forEach(observer => { // 调用 notify 方法时可以携带指定参数 observer.notify(); }); } }
class ConcreteObserver implements Observer{ constructor(private name: string) {}
notify(): void { // 可以处理其他逻辑 console.log(`${this.name} has been notified.`); } }
functionuseObserver(): void{ const subject: Subject = new ConcreteSubject(); const Leo = new ConcreteObserver("Leo"); const Robin = new ConcreteObserver("Robin"); const Pual = new ConcreteObserver("Pual"); const Lisa = new ConcreteObserver("Lisa");