Нажмите кнопку подписки, чтобы получать последние новости.
_00 / Концепция
Подписывайтесь и получайте информацию из темы. Поток данных идет от субъекта к наблюдателю.
_01 / Ключевые роли
Тема и Наблюдатель. Субъект предоставляет функции для регистрации и отмены регистрации, а наблюдатель предоставляет субъекту функцию для вызова.
This file contains hidden or 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
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"); |
_02 / Компромиссы
🟢 Легко передавать данные каждому наблюдателю.
🟢 Добавляйте и удаляйте наблюдателя, не нарушая принцип открытия/закрытия.
🔴 Возможные проблемы с производительностью.