В прошлый раз, когда я изучал режим наблюдателя, во многих статьях говорится, что он также называется подпиской/публикацией (режим публикации/подписки). Но в книге «Паттерн дизайна JavaScript» все еще есть некоторые различия между двумя шаблонами. Оригинальные слова в книге следующие:
1. Режим наблюдателя требует, чтобы наблюдатели, которые хотят получать тематические уведомления, должны подписаться на события, где изменяется контент.
2. Режим SubScribe/Publish использует канал темы/события, который находится между подписчиком и издателем. Система событий позволяет коду определять конкретные события для приложения, которые могут передавать пользовательские параметры, которые содержат значения, требуемые абонентом. Цель состоит в том, чтобы избежать зависимости между подписчиками и издателями.
Разница от режима наблюдателя заключается в том, что он позволяет любому подписчику выполнять соответствующие обработчики событий для регистрации и получения уведомлений от издателей.
Хорошо, я не знаю, как быть таким сильным. Вот мое понимание:
1. В режиме наблюдателя целевой объект отвечает за поддержание наблюдателя. В режиме публикации/подписки издатели не заботятся о подписчиках, они несут ответственность только за то, чтобы выбрасывать сообщения и оставить их в покое.
2. В режиме наблюдателя наблюдатель должен предоставить интерфейс, а затем вызовать этот интерфейс, когда целевой объект изменяется, чтобы сохранить свое собственное состояние и целевое состояние согласованным. То есть все наблюдатели должны иметь унифицированный интерфейс (например, метод обновления, написанный выше, метод каждого должен назвать это имя). В режиме публикации/подписки запуск события подписчика не зависит от такого интерфейса, но запускается подписчиком путем прослушивания конкретного сообщения (это сообщение обычно содержит имя и параметры, требуемые подписчиком). Можно понять, что подписчик не слушает издателя, а в пуле сообщений. Пока есть сообщение, о котором он заботится в пуле сообщений, оно запускает событие, независимо от того, кто разместил сообщение в прошлом. Издатели и подписчики отделены.
Ниже приводится реализация режима публикации/подписки в JS. Скопируйте и вставьте его в консоли, и вы поймете ее после попытки:
Кода -копия выглядит следующим образом:
var pubsub = (function () {
var q = {}
темы = {},
subuid = -1;
// опубликовать сообщение
Q.publish = function (тема, args) {
if (! Темы [Тема]) {return;}
var subs = темы [тема],
len = subs.length;
while (len--) {
Subs [len] .func (тема, Args);
}
вернуть это;
};
// подписаться на события
Q.SubScribe = function (тема, фанк) {
Темы [Тема] = темы [Тема]? Темы [Тема]: [];
var token = (++ subuid) .toString ();
Темы [Тема] .push ({
токен: токен,
Func: Func
});
вернуть токен;
};
возврат Q;
// Отписать подписку и прекратить писать, пересечь темы, а затем вернуть токен, сохранив предыдущий, удалите указанный элемент
}) ();
// запускаемое событие
var logmsg = function (темы, данные) {
console.log ("logging:" + темы + ":" + data);
}
// Слушайте указанное сообщение «msgname '
var sub = pubsub.subscribe ('msgname', logmsg);
// опубликовал сообщение "msgname '
pubsub.publish ('msgname', 'Hello World');
// опубликовал незарегистрированное сообщение «msgname1»
pubsub.publish ('inethermsgname', 'тоже!');