Javascript 理解基本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

我有一个关于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
    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