@xcore24/observer
v1.0.4
Published
TypeScript library implementing the Observer pattern
Downloads
20
Maintainers
Readme
observer
observer is TypeScript library implementing the Observer pattern.
Installation
To start using observer install the npm package:
npm i @xcore24/observerBasic 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
