Observer хранит подписчиков, уведомляет их об изменении и предоставляет способ отписки; важно определить поведение при изменении подписок во время рассылки.
Как бы вы реализовали паттерн Observer?
Observer хранит подписчиков, уведомляет их об изменении и предоставляет способ отписки; важно определить поведение при изменении подписок во время рассылки.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Observer хранит подписчиков, уведомляет их об изменении и предоставляет способ отписки; важно определить поведение при изменении подписок во время рассылки.
Минимальная синхронная реализация со снимком подписчиков:
function createObservable() {
const listeners = new Set();
return {
subscribe(fn) {
listeners.add(fn);
return () => listeners.delete(fn);
},
notify(value) {
for (const fn of [...listeners]) fn(value);
}
};
}
Здесь исключение подписчика прерывает рассылку, а снятая во время неё подписка остаётся в текущем снимке. Иную политику нужно задать явно; повторная подписка той же функции не дублируется.