桥梁+命令模式
我正在阅读命令模式,我看到来自不同站点的示例,它们似乎使用桥接+命令模式来展示命令模式。桥梁+命令模式
因此,首先,*:https://en.wikipedia.org/wiki/Command_pattern,命令模式的定义:
该命令模式是在其中一个对象 用于封装要执行的动作所需要的所有信息的行为设计图案或 稍后触发事件。该信息包括方法 名称,拥有方法的对象和方法 参数的值。
因此,根据该定义,命令模式看起来很简单,阅读这本书:https://addyosmani.com/resources/essentialjsdesignpatterns/book/#commandpatternjavascript,这个例子就是这样。
(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);
当我看到上面这个例子中,我立刻看到桥模式,然后立即看到命令模式,因为它们被储存,然后调用这些命令。
我的问题是这样的;我正确地认为*的例子是使用桥梁+命令模式来展示命令模式吗?
编辑:
如果我把第二个例子,和删除命令的部分,这是不是桥模式?
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();
的第一件事情,我觉得阿迪·奥斯马尼在JS例子解释从GoF的原始解释有点不同(也从*的定义)。
从GoF的命令模式页:
该命令模式是一个设计图案,使所有的信息对一个请求要被包含在一个对象中。然后可以根据需要调用该命令,通常作为具有回滚功能的一批排队命令的一部分。
这意味着,一个命令对象应包含一个无参数Execute
方法(有时也是一个Undo
)。该命令的参数应为 已包含在其中。该命令可以传递给调用者,排队并在任何时间后执行。
*示例与原始GoF非常相似,并遵循该定义。
它不使用桥接模式。
Bridge模式用于添加抽象级别并隐藏消费者的服务的技术具体实现。 桥可以有许多操作,如其界面所定义的。
你可以看看我刚刚添加的第三个示例。你会认为这个桥梁模式的例子吗? –
不,它仍然是命令模式,只是没有调用者。服务在哪里?抽象在哪里?既然你在谈论javascript,那么创建一个好的桥接模式有点困难。你应该看看Java/C#的例子 –
不确定桥/命令的东西,但作为命令示例显示的JS代码不起作用。即使IIFE在IIFE外部提供了“carManager”对象(它没有),它也没有'.execute()'方法。 – nnnnnn
对不起,我没有正确复制代码示例。这已得到纠正。 –
您能否澄清一下您对上述示例的疑惑,以及您想知道的内容? – gyre