JSFiddle - React, Tailwind, and code Playground
HTML
<!--Пример паттерна Mediator/Dispatcher-->
<a href="http://blog.makushev.com/2015/08/04/mediator-dispatcher-oop-pattern/" target="_blank">Описание паттерна Mediator/Dispatcher</a>
JavaScript
//Опишем наш медиатор. Он будет диспетчером рассылки новостей.
var Dispatcher = {
//хранилище всех подписчиков
subscribers: {},
//метод для подписки на какое-либо событие
on: function (event, handler) {
if (this.subscribers.hasOwnProperty(event)) {
this.subscribers.push(handler);
} else {
this.subscribers[event] = [handler];
}
},
//метод для вызова обработчиков на некое событие
trigger: function (event, data) {
for (var ev in this.subscribers) {
if (ev !== event) {
continue;
}
if (this.subscribers.hasOwnProperty(ev)) {
this.subscribers[ev].forEach(function (handler) {
handler(data);
});
}
}
}
};
//Наш журнал, с некоторыми новостями
var Magazine = {
news: [],
//Метод в журнале, который просто добавляет новую новость
addNews: function(category, title){
this.news.push({
category: category,
title: title
});
},
//Режим "лайв". Каждые 3 секунды выпускаем новость в свет
live: function () {
var newsItem;
setInterval(function () {
if (this.news.length === 0) {
//если новости закончились - кричим об этом
Dispatcher.trigger('No news');
return;
}
newsItem = this.news.splice(0, 1)[0];
//отдаем диспетчеру очередную новость
Dispatcher.trigger(newsItem.category, newsItem.title);
}.bind(this), 3000);
}
};
//Саша, который всем обо всем рассказывает
var Sasha = {
tellToEveryone: function (anything) {
console.log('I am Sasha. Did you heard that ' + anything + ' ?');
}
};
//Маша, которая обо всем пишет в блог
var Masha = {
writeToBlog: function (anything) {
console.log("Hi, it's Masha. Just known that " + anything + '!!!...