Javascript 理解基本js设计模式中的命令模式
我有一个关于addy osmani的书中的基本js设计模式的问题Javascript 理解基本js设计模式中的命令模式,javascript,design-patterns,Javascript,Design Patterns,我有一个关于addy osmani的书中的基本js设计模式的问题 (function(){ var carManager = { // request information requestInfo: function( model, id ){ return "The information for " + model + " with ID " + id + " is foobar"; }, // purchase the car
(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 + " ) ";
}
/* The function that acts as a common point for function calls */
execute : function ( name ) {
return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) );
};
};
})();
上面是作为模式解释的一部分放置的代码。它将把execute作为模块的单一入口点,模块将根据传递给它的参数调用适当的方法
carManager.execute( "arrangeViewing", "Ferrari", "14523" );
carManager.execute( "requestInfo", "Ford Mondeo", "54323" );
carManager.execute( "requestInfo", "Ford Escort", "34232" );
carManager.execute( "buyVehicle", "Ford Escort", "34232" );
这里我的问题是关于这种模式的优点。
引用该书:
如果carManager背后的核心API发生了变化。这需要所有人的支持
对象直接访问应用程序中的这些方法
也可以修改。这可以看作是一个耦合层
有效地违背了松散耦合的OOP方法
尽可能多地使用对象。相反,我们可以通过
进一步抽象API
根据上述优点,execute
方法是作为其一部分添加的层。但是正如您所看到的,即使是这个附加抽象层的实现,也需要更改模块外部的方法调用,因为第一个参数引用被调用的函数名
假设模块的内部功能从“arrangeViewing”更改为“arrangeViewing 2”,这将需要该模块的所有依赖代码从
carManager.execute( "arrangeViewing", "Ferrari", "14523" );
到
除非我们在执行函数代码中不使用映射,它将函数标签指向内部的实际函数。那么,上述优势对于上述代码示例来说不是毫无意义吗
此外,根据本书上面引用的代码,我们不会将carManager
发布到外部范围,以便其他模块能够使用它。另外,如果我们将execute作为单个入口点,那么为什么其他函数不能是私有的呢
我的观点正确吗?还是我遗漏了什么重要的东西?在java、C++、C等静态类型语言中,通过命令模式进行解耦是很重要的。但在JavaScript这样的动态类型语言中,它并不重要,因为我们可以非常自由地传递任何方法。所以我也不认为这有什么好处 但是命令还有书中没有提到的其他特性,例如命令可以作为系统中操作的唯一真实来源,我们可以记录系统中发生的事情,我们可以创建优雅的回滚机制,如果需要,为命令创建队列等等 顺便说一下,整个Redux体系结构包括:
另外,我发现沿着GoF书阅读Addy的书很有用。我个人不认为
.execute()
比直接调用所需方法有任何好处。正如您所指出的,仍然存在着同样多的耦合,而且会更慢。命令模式的实际要点是命令是可序列化的数据结构。如果execute
方法没有从name
参数将方法一一映射,则不需要任何紧密耦合。我认为Addy在书中提出的观点仍然是,您的确定逻辑属于execute方法,该方法的名称最终无关紧要,但确实需要映射。
carManager.execute( "arrangeViewing2", "Ferrari", "14523" );
The Store = The Receiver
The Action = The Command
Dispatch = Executor