Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.41 KB | None | 0 0
  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(); // Рассылаем данные оставшимся двум наблюдателям
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement