Мост + шаблон команд
Я читаю шаблон команд и вижу примеры с разных сайтов, которые, кажется, используют шаблон команд bridge + для демонстрации шаблона команд.
Итак, сначала из Википедии: https://en.wikipedia.org/wiki/Command_pattern, определение шаблона команды:
Шаблон команды представляет собой шаблон поведенческого проектирования, в котором объект используется для инкапсуляции всей информации, необходимой для выполнения действия или запуска события в более позднее время. Эта информация включает в себя имя метода, объект, которому принадлежит метод, и значения параметров метода.
Таким образом, с этим определением шаблон команды выглядит довольно простым, и читая книгу, расположенную здесь: https://addyosmani.com/resources/essentialjsdesignpatterns/book/, этот пример делает именно это.
(function(){
var carManager = {
// request information
requestInfo: function( model, id ){
return "The information for " + model + " with ID " + id + " is foobar";
},
// purchase the car
buyVehicle: function( model, id ){
return "You have successfully purchased Item " + id + ", a " + model;
},
// arrange a viewing
arrangeViewing: function( model, id ){
return "You have successfully booked a viewing of " + model + " ( " + id + " ) ";
}
};
carManager.execute = function ( name ) {
return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) );
};
console.log(carManager.execute( "arrangeViewing", "Ferrari", "14523" ));
console.log(carManager.execute( "requestInfo", "Ford Mondeo", "54323" ));
console.log(carManager.execute( "requestInfo", "Ford Escort", "34232" ));
console.log(carManager.execute( "buyVehicle", "Ford Escort", "34232" ));
})();
В этом примере нет ничего лишнего, я вижу только шаблон команды. Однако вернемся к Википедии, они используют следующий пример для демонстрации шаблона команды:
class Switch {
constructor() {
this._commands = [];
}
storeAndExecute(command) {
this._commands.push(command);
command.execute();
}
}
class Light {
turnOn() { console.log('turn on') }
turnOff() { console.log('turn off') }
}
class FlipDownCommand {
constructor(light) {
this._light = light;
}
execute() {
this._light.turnOff();
}
}
class FlipUpCommand {
constructor(light) {
this._light = light;
}
execute() {
this._light.turnOn();
}
}
var light = new Light();
var switchUp = new FlipUpCommand(light);
var switchDown = new FlipDownCommand(light);
var s = new Switch();
s.storeAndExecute(switchUp);
s.storeAndExecute(switchDown);
Когда я вижу этот пример выше, я сразу вижу шаблон моста, а затем вижу шаблон команды, потому что они хранят, а затем немедленно вызывают команды.
У меня вопрос такой; Правильно ли я думаю, что пример Википедии использует шаблон команды bridge + command для демонстрации шаблона команды?
РЕДАКТИРОВАТЬ:
Если я возьму 2-й пример и уберу части команды, это не шаблон моста?
class Light {
turnOn() { console.log('turn on') }
turnOff() { console.log('turn off') }
}
class FlipDownCommand {
constructor(light) {
this._light = light;
}
execute() {
this._light.turnOff();
}
}
class FlipUpCommand {
constructor(light) {
this._light = light;
}
execute() {
this._light.turnOn();
}
}
var light = new Light();
var switchUp = new FlipUpCommand(light);
var switchDown = new FlipDownCommand(light);
switchUp.execute();
switchDown.execute();
1 ответ
Во-первых, я нахожу, что интерпретация Адди Османи в примере с js немного отличается от оригинальной интерпретации GoF (а также от определения из Википедии).
Со страницы шаблона команды GoF:
Шаблон команды - это шаблон проекта, который позволяет всей информации для запроса содержаться в одном объекте. Затем команда может быть вызвана по мере необходимости, часто как часть пакета команд из очереди с возможностью отката.
Это означает, что объект команды должен содержать один параметр без параметров Execute
метод (а иногда и Undo
). Параметры команды уже должны содержаться в ней. Команду можно передать вызову, поставить в очередь и выполнить в любое время.
Пример из Википедии очень похож на оригинальный GoF и соответствует этому определению.
Он не использует шаблон моста.
Шаблон Bridge используется для добавления уровня абстракции и скрытия технической конкретной реализации сервиса от потребителя. Мост может иметь много операций, как определено его интерфейсом.