命令模式:將請求與實現解耦并封裝城獨立對象,從而使不同的請求對客戶端的實現參數化。我們在使用jquery的動畫時會如下面的形式調用:
$(selector).animate({params},speed,callback);
這種就是一種命令模式。
例子
以一個游戲的實現為例,當用戶按下W、S、A、D
時角色會有不同的動作,而且有回放功能記錄以前的操作:
var Ryu = {
attack: function(){
console.log("攻擊");
},
defense: function(){
console.log("防守");
},
jump: function(){
console.log("跳躍");
},
crouch: function(){
console.log("蹲下");
}
};
var makeCommand = function(receiver, state){
return function(){
receiver[state]();
}
};
var commands = {
"119": "jump", // W
"115": "crouch", // S
"97": "defense", // A
"100": "attack" // D
};
var commandStack = [];
document.onkeypress = function( ev ){
var keyCode = ev.keyCode,
command = makeCommand( Ryu, commands[keyCode] );
if(command){
command();
commandStack.push(command);
}
};
document.getElementById("replay").onClick = function(){
var command;
while( command = commandStack.shift() ){
command();
}
}
回放功能很好的體現了命令模式的作用。js中函數是一等公民,命令模式相當于記錄了一個個的執行函數。