Шаблон наблюдателя vs шаблон посредника
Я сделал некоторые googling и да, я знаю, что вопросы о разнице между этими двумя были заданы раньше на stackoverflow и во всем интернете. Но в основном я нахожу сформулированные ответы, которые могут сбивать с толку.
мой вопрос в том, может ли кто-нибудь здесь предоставить мне два визуальных примера паттернов медиатора и наблюдателя, которые могут четко продемонстрировать разницу между ними. в JavaScript. Спасибо!
1 ответов
Да, они отличаются. Я объясню на примерах из реальной жизни, основываясь на типичном одностраничном сценарии веб-приложения. Я предполагаю, что ваша веб-страница следует типичному шаблону Model-View-XXX, поэтому у вас будут "представления" на нем. Под видом я понимаю компонент javascript, отвечающий за визуальное представление и связанную с ним логику некоторой части вашей страницы - заголовка, списка изображений, хлебных крошек-все это типичные представления.
Обозреватель
лучше всего использовать для отдельных объектов с большим влиянием на общую функциональность сайта. Типичным примером могут быть параметры пользователя или конфигурация сайта.
var settings = {
fonts: "medium",
colors: "light",
observers: [],
addObserver: function (observer) {
this.observers.push(observer);
},
update : function(newSettings) {
for (k in newSettings)
this[k] = newSettings[k];
this.fire();
}
fire: function() {
var self = this;
observers.forEach(function() { this.update(self); });
}
}
где каждый вид будет вести себя примерно так:
var view = {
init: function() {
//... attach to DOM elements etc...
settings.addObserver(this);
},
update: function(settings) {
//... use settings to toggle classes for fonts and colors...
}
}
посредник
лучше всего использовать для различных частей вашего сайта должны быть организованы по определенной логике. Если вы в конечном итоге отслеживаете одно действие пользователя через несколько обратных вызовов и в конечном итоге передаете состояние через события, вероятно, имеет смысл представьте посредников. В каждом рабочем процессе будет один посредник. Конкретным примером может служить загрузка фотографий.
var uploadMediator = {
imageUploading: false,
actors: {},
registerActor: function(name, obj) {
actors[name] = obj;
},
launch: function() {
if (imageUploading)
error('Finish previous upload first');
actors['chooser'].show();
actors['preview'].hide();
actors['progress'].hide();
}
selected: function(img) {
actors['preview'].show(img);
}
uploading: function(progressNotifier) {
imageUploading = true;
actors['progress'].show(progressNotifier);
}
uploaded: function(thumbUrl) {
//show thumbUrl in the image list
imageUploading = false;
}
}
когда ваша страница инициализируется, все участники (различные части пользовательского интерфейса, возможно, представления) регистрируются с посредником. Затем он становится единственным местом в коде для реализации всей логики, связанной с управлением состоянием во время процедуры.
Примечание: приведенный выше код предназначен только для демонстрационных целей и требует немного больше для реального производства. Наиболее в книгах также не просто так используются конструкторы функций и прототипы. Я просто пытался передать минимум идей, стоящих за этими шаблонами.
эти шаблоны, конечно, легко применимы и на среднем уровне, например, на основе узла.js.