SHARE
TWEET

Untitled

a guest Aug 22nd, 2019 67 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  *
  3.  * ПАТТЕРН НАБЛЮДАТЕЛЬ (почтальон)
  4.  * Несколько наблюдателей (подписчиков) могут получать данные от одного субьекта (почтальона)
  5.  *
  6.  */
  7.  
  8. class Publisher { // субьект, получает и рассылает данные
  9.     constructor() {
  10.         this.observersList = []; // реестр наблюдателей (подписчиков)
  11.         this.state = []; // хранит состояние Субьекта (т.е. хранит последние полученные данные)
  12.     }
  13.     subscribe(obj) { // подписка наблюдателя
  14.         return this.observersList.push(obj);
  15.     }
  16.     unsubscribe(obj) { // отписка наблюдателя
  17.         this.observersList = this.observersList.filter((item) => item !== obj);
  18.         return this.observersList;
  19.     }
  20.     notifyObservers(...args) { // рассылка данных наблюдателям
  21.         for (observer of this.observersList) {
  22.             observer.update(this, this.state);
  23.         }
  24.     }
  25.     setState (...args) {
  26.         this.state = [...args];
  27.     }
  28.     getState () {
  29.         this.state.forEach((arg) => {
  30.             console.log(arg);
  31.         });
  32.     }
  33. }
  34.  
  35. class Observer {
  36.     constructor(publisher, observerName='DefaultObserverName') { // observerName нужен только для наглядности примера
  37.         if (!publisher) {
  38.             throw new Error('Не указан Publisher (субьект) при создании наблюдателя (Observer)');
  39.         }
  40.         publisher.subscribe(this); // при создании наблюдателя автоматически добавляем его в ресстр субьекта
  41.         this.observerName = observerName;
  42.     }
  43.     update(publisher, ...args) { // получаем данные от Субьекта (Publisher) и вызываем для них функцию-обработчик
  44.         [...args].forEach((arg) => {
  45.             this.updateHandler(arg);
  46.         });
  47.     }
  48.     updateHandler(arg) { // Обработка новых данных.
  49.         console.log(this.observerName + ': ' + arg);
  50.     }
  51. }
  52.  
  53. let subject = new Publisher(), // создаем Субьекта
  54.     observer = new Observer(subject, 'Наблюдатель 1'), // создаем наблюдателя за Субьектом
  55.     observer2 = new Observer(subject, 'Наблюдатель 2'), // создаем наблюдателя за Субьектом
  56.     observer3 = new Observer(subject, 'Наблюдатель 3'); // создаем наблюдателя за Субьектом
  57.  
  58. subject.setState('foo'); // Сообщаем новые данные субьекту
  59. subject.notifyObservers(); // Рассылаем данные всем трем наблюдателям субьекта
  60. subject.unsubscribe(observer2); // Удаляем одного наблюдателя из трех из реестра наблюдателей
  61. subject.getState(); // Проверяем что за данные сейчас у субьекта
  62. subject.notifyObservers(); // Рассылаем данные оставшимся двум наблюдателям
  63. subject.setState(['BAR', 'fuck', 'man']); // Сообщаем новые данные субьекту
  64. subject.notifyObservers(); // Рассылаем данные оставшимся двум наблюдателям
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top