observer
observer
is TypeScript library implementing the Observer pattern.
Installation
To start using observer install the npm package:
npm i @xcore24/observer
Basic Usage
import { ObservableSubject, Observer } from '@xcore24/observer'
// Определим кастомный тип для уведомлений
type Context = {
oldPrice: number
newPrice: number
}
// Создадим базовый класс для работы с супермаркетами
// Будем наблюдать за некоторыми из них
class SuperMarket extends ObservableSubject<Context> {
private _price: number = 240
set price (newPrice: number) {
const oldPrice = this._price
this._price = newPrice
const context: Context = {
oldPrice,
newPrice
}
// Уведомляем подписчиков об изменении некоторого состояния
this.notifyChange(context)
}
get price () {
return this._price
}
}
// Создадим базового наблюдателя за стоимостью товаров
class ChangePricesObserver extends Observer<Context> {
// Реализуем метод который будет вызываться у наблюдателя каждый раз, когда изменяется стоимость
// Каждый наблюдатель может по-своему реагировать на данное изменение
change(context: Context): void {
const {oldPrice, newPrice} = context
// Для тестирования возьмем первый из коллекции наблюдаемый субъект
// В реальной жизни его можно передавать через context
const subjectName = this.observableSubjects[0].name
console.log([`Налюдатель "${this.name}" заметил, что в магазине "${subjectName}" изменилась стоимость на товар X. Старая цена "${oldPrice}". Новая цена: "${newPrice}"`])
}
}
// Создаем объект супермакета МАГНИТ за которым хотим наблюдать
// Обычно в нем изменяются цены на продукты и нас об этом не уведомляют (даже на кассе) :(
// Но мы, пожалуй, исправим сейчас это ;)
const magnit = new SuperMarket('МАГНИТ')
// Поставим наблюдателей в этот магаз -- пусть смотрят и нас уведомляют вовремя
const observer1 = new ChangePricesObserver('Иван')
const observer2 = new ChangePricesObserver('Алексей')
const observer3 = new ChangePricesObserver('Антон')
// Добавляем наблюдателей в наблюдаемый объект
magnit
.attach(observer1)
.attach(observer2)
.attach(observer3)
// Установим новую стоимость
magnit.price = 390