设计模式之命令模式
2016-04-07 09:52
411 查看
命令模式主要是处理解决命令和执行的解耦,如果不显性的显性的独立一个命令安装对象,将和策略模式无法区分
目录:
1.传统命令模式
2.javascript中的命令模式
3.撤销和重做
4.宏命令
传统命令模式:
javascript的命令模式:
撤销命令和重做:
宏命令[将无法看出是命令模式]:
目录:
1.传统命令模式
2.javascript中的命令模式
3.撤销和重做
4.宏命令
传统命令模式:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <button id="button1">点击按钮1</button> <button id="button2">点击按钮1</button> <button id="button3">点击按钮1</button> <script> function $(id){ return document.getElementById(id); } var btn1=$("button1"); var btn2=$("button2"); var btn3=$("button3"); //设置命令 var setCommand=function(button,command){ button.onclick=function(){ command.execute(); } }; //设置命令 var MenuBar={ refresh:function(){ console.log("刷新菜单目录") } }; var subMen={ add:function(){ console.log("增加子菜单") }, del:function(){ console.log("删除子菜单") } }; //在让button有用前,我们先要把这些行为都分钟到命令类中 var RefreshMenuBarCommad=function(receiver){ this.receiver=receiver; }; RefreshMenuBarCommad.prototype.execute=function(){ this.receiver.refresh(); }; var AddsubMenuCommand=function(receiver){ this.receiver=receiver; }; AddsubMenuCommand.prototype.execute=function(){ this.receiver.add(); }; var DelSubMenuCommand=function(receiver){ this.receiver=receiver; }; DelSubMenuCommand.prototype.execute=function(){ console.log("删除子菜单") }; //最后吧命令接受者传入草command对象中,并且把command对象安装到button上面 var refreshMenuBarCommand=new RefreshMenuBarCommad(MenuBar); var addSubMenuCommand=new AddsubMenuCommand(subMen); var delSubMenuCommand=new DelSubMenuCommand(subMen); setCommand(btn1,refreshMenuBarCommand); setCommand(btn2,addSubMenuCommand); setCommand(btn3,delSubMenuCommand) </script> </body> </html>
javascript的命令模式:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <button id="button1">点击按钮1</button> <button id="button2">点击按钮1</button> <button id="button3">点击按钮1</button> <script> function $(id){ return document.getElementById(id); } var btn1=$("button1"); var btn2=$("button2"); var btn3=$("button3"); //设置命令 var setCommand=function(button,command){ button.onclick=function(){ command.execute(); } }; //设置命令 var MenuBar={ refresh:function(){ console.log("刷新菜单目录") } }; //在让button有用前,我们先要把这些行为都分钟到命令类中,将来可能需要提供撤销功能所以吧执行函数改为execute var RefreshMenuBarCommad=function(receiver){ return{ execute:function(){ receiver.refresh(); } } }; var refreshMenuBarCommand=RefreshMenuBarCommad(MenuBar); setCommand(btn1,refreshMenuBarCommand); </script> </body> </html>
撤销命令和重做:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <button id="replay">播放录像</button> <script> var Ryu={ attach: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":"attach"//d }; var commandStachk=[];//保存命令的堆栈 document.onkeypress=function(ev){ var keyCode=ev.keyCode; var command=makeCommand(Ryu,commands[keyCode]); if(command){ command();//执行命令 commandStachk.push(command);//将刚刚执行过的命令保存到堆 栈中 } }; document.getElementById("replay").onclick=function(){ var command; while(command=commandStachk.shift()){ command(); } } </script> </body> </html>
宏命令[将无法看出是命令模式]:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <script> var closeDoorCommand={ execute:function(){ console.log("关门") } }; var openPcCommand={ execute:function(){ console.log("开电脑") } }; var openQQCommand={ execute:function(){ console.log("登录QQ") } }; //添加命令,并执行多个命令 var MacroCommand=function() { return { commandsList: [], add: function (command) { this.commandsList.push(command) }, execute: function () { for (var i = 0, command; command = this.commandsList[i++];) { command.execute(); } } } }; var macroCommands=MacroCommand();//创建命令对象 //添加命令 macroCommands.add(closeDoorCommand); macroCommands.add(openPcCommand); macroCommands.add(openQQCommand); //执行命令 macroCommands.execute(); </script> </body> </html>
相关文章推荐
- 再玩 DevStack(Mitaka版)- 基于 trystack.cn 源
- DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter 的使用已经过时!
- 神经网络基本概念
- Android Studio debug使用release的签名
- win7启动本地MongoDB的四种方式
- UIWebView页面加载不出来的解决方案
- 每天laravel-20160702|CacheTableCommand
- iOS动画开发之五——炫酷的粒子效果
- Oracle密码过期the password has expired解决办法
- VS2008 IDE连接 ORACLE后新建查询 无响应或者长时间等待
- Windows下 maven3.0.4的安装步骤+maven配置本地仓库
- win10 设置 计算机/此电脑/我的电脑 图标到桌面上
- iOS 系统自带UItableviewcell上添加其它控件 不需要自定义cell 简单粗暴
- 优雅的项目配置--常用库和版本管理
- js ajax null验证
- 测试注意事项
- 负数取模
- svn 拉分支 merge
- Mac快捷键
- gitlab 添加https://gitlab.com/ci gitlab-ci-multi-runner