Мост + шаблон команд

Я читаю шаблон команд и вижу примеры с разных сайтов, которые, кажется, используют шаблон команд 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 используется для добавления уровня абстракции и скрытия технической конкретной реализации сервиса от потребителя. Мост может иметь много операций, как определено его интерфейсом.

Другие вопросы по тегам