Нажмите кнопку подписки, чтобы получать последние новости.

_00 / Концепция

Подписывайтесь и получайте информацию из темы. Поток данных идет от субъекта к наблюдателю.

_01 / Ключевые роли

Тема и Наблюдатель. Субъект предоставляет функции для регистрации и отмены регистрации, а наблюдатель предоставляет субъекту функцию для вызова.

class Subject {
observers = new Map();
addObserver(observer: Observer) {
this.observers.set(observer, observer);
}
removeObserver(observer: Observer) {
this.observers.delete(observer);
}
notify(msg: string) {
this.observers.forEach((observer) => {
observer.receive(msg);
});
}
}
class Observer {
private readonly name: string;
constructor(name: string) {
this.name = name;
}
receive(msg: string) {
console.log(`${this.name} receive ${msg}!`);
}
}
const observerA = new Observer("Observer A");
const observerB = new Observer("Observer B");
const observerC = new Observer("Observer C");
const subject = new Subject();
subject.addObserver(observerA);
subject.addObserver(observerB);
subject.addObserver(observerC);
subject.notify("new content is available");
view raw observer.ts hosted with ❤ by GitHub

_02 / Компромиссы

🟢 Легко передавать данные каждому наблюдателю.
🟢 Добавляйте и удаляйте наблюдателя, не нарушая принцип открытия/закрытия.
🔴 Возможные проблемы с производительностью.