javascript组合模式
组合命令
<script>
var MacroCommand = function () {
return {
commandList: [],
add: function (command) {
this.commandList.push(command);
},
execute: function () {
for(var i = 0,command; command = this.commandList[i++];){
command.execute();
}
}
}
};
var openAcCommand = {
execute: function () {
console.log('打开空调');
}
};
/*************电视和音响是连在一起的,所以需要同时打开**************/
var openTvCommand = {
execute: function () {
console.log('打开电视机');
}
};
var openSoundCommand = {
execute: function () {
console.log('打开音响');
}
};
//被组合成一个命令
var macrocommand1 = MacroCommand();
macrocommand1.add(openTvCommand);
macrocommand1.add(openSoundCommand);
/*************开门打开PC和QQ是连贯动作*****************/
var closeDoorCommand = {
execute: function () {
console.log('关门');
}
};
var openPcCommand = {
execute: function () {
console.log('打开电脑');
}
};
var openQQCommand = {
execute: function () {
console.log('登录QQ');
}
};
//组合成一个命令
var macroCommand2 = MacroCommand();
macroCommand2.add(closeDoorCommand);
macroCommand2.add(openPcCommand);
macroCommand2.add(openQQCommand);
/***********将所有要执行的命令组合成一个总命令***********/
var macroCommand = MacroCommand();
macroCommand.add(openAcCommand);
macroCommand.add(macrocommand1);
macroCommand.add(macroCommand2);
/**********绑定总命令************/
var setCommand = (function (command) {
document.getElementById('button').onclick = function () {
command.execute();
}
})(macroCommand);
</script>
以上代码存在问题,在某些情况下我们向子叶节点添加节点,这显然是不合适,我们可以对子叶节点封堵添加方法
var openAcCommand = {
execute: function () {
console.log('打开空调');
},
add: function () {
console.log('不能再添加子叶节点');
}
};