我正在探索命令模式,并且试图弄清楚这种模式的实际好处。
我已阅读以下文章:https : //www.safaribooksonline.com/library/view/learning-javascript-design/9781449334840/ch09s08.html
凝视了足够长的时间后,我仍然看不到实施的好处。让我澄清一下我没有得到。
我们有以下命令对象:
(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) );
};
文章说,这是我们要实现的目标:
CarManager.execute( "buyVehicle", "Ford Escort", "453543" );
原因是我有以下问题:
看一下上面的代码,通过直接访问对象来调用我们的CarManager方法将是微不足道的。我们所有人都认为这没有错,这是可以原谅的-从技术上讲,它是完全有效的JavaScript。但是,在某些情况下这可能是不利的。
例如,假设CarManager背后的核心API是否已更改。这将要求所有直接访问我们应用程序中的这些方法的对象也必须进行修改。这可以看作是耦合层,它实际上与尽可能松散耦合对象的OOP方法背道而驰。相反,我们可以通过进一步抽象API来解决此问题。
我看不到的是,该解决方案在以下方面有何好处:
CarManager.buyVehicle("Ford Escort", "453543");
如果“核心API”发生变化,它们是什么意思?我假设他们正在谈论接口,即。命令对象的方法及其实现。但是,如果它们中的任何一个发生了更改,则在方法的调用方式上似乎都没有任何改变(无论是否使用execute,如果方法名称发生更改,则两者都不起作用)。
另外,我看不到该execute
方法如何解耦任何东西。无论execute
是被调用还是直接执行该方法,调用对象无论如何都需要对命令对象的引用。
此外,在文章中(请参见视觉方案),他们提到了客户端,接收者,调用者和命令对象。在示例中,我仅看到两个对象(?)。
有人可以启发我吗?
我认为这种解释没有抓住重点。该命令模式用于物化方法调用(“行动”),这样就可以对付他们编程。例如,您可以将命令名称存储在数组中并彼此立即执行,或者可以在基础API(execute
函数)中记录命令名称并存储以进行重播。
当然,JS已经很动态了,实际上并没有太大变化(您始终可以使用方括号表示法按名称执行方法),但是在该execute
函数中您可以将方法名称作为字符串使用,因此您可以使用它-您否则需要ES6代理。
当然,如果API发生变化,则使用它的代码也需要发生变化。该execute
方法甚至可能适得其反,因为它不能立即明确指出string参数是需要更改的方法名称(重构工具不会这样),并且当您使用名称错误。
我想本文试图在此说明的一点是,当您已经有此命令模式时,外观更易于实现。您可以以编程方式处理方法名称和参数。
假设buyVehicle
方法已更改为buyCar
方法。您以前曾提供过向后兼容性的位置
CarManager.buyVehicle = CarManager.buyCar;
您可以使用命令模式插入行
if (name == "buyVehicle")
name = "buyCar";
在execute
方法中。没有太大的优势,但是可能适用于更复杂的情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句