最近在看设计模式,不过在命令模式卡住了,不懂这个模式有什么作用。以下贴全部代码:
var CarManager = (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 + " ) ";
}
return CarManager ;
};
})();
//调用CarManager的各种方法
加上CarManager.execute
的理由,作者是这样解释的:
如果CarManager的核心API会发生改变的这种情况.这可能需要所有直接访问这些方法的对象也跟着被修改.这可以被看成是一种耦合,明显违背了OOP方法学尽量实现松耦合的理念.取而代之,我们可以通过更深入的抽象这些API来解决这个问题。
现在让我们来扩展我们的CarManager,以便我们这个命令模式的应用程序得到接下来的这种效果:接受任何可以在CarManager对象上面执行的方法,传送任何可以被使用到的数据,如Car模型和ID。
添加解耦代码都代码如下:
var CarManager = (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 + " ) ";
}
return CarManager ;
};
})();
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" ));
};
我想问 CarManager.execute
是如何达到解耦的。它和直接调用CarManager
中的方法有何不同?
点这里查看原文。
这个讲的不是命令模式吧,你还是去看看『正统』的命令模式吧。
简单的讲命令模式是为了把命令的发起者与命令的执行彻底分开,比如可能命令发起者在发起这个命令后就马上被杀死了,但他发的这个命令仍旧有效当满足条件时就会被执行;比如由于命令与发起者无关,于是我们在某些情况下可以做到撤销之前执行过的命令。