JS命令模式例子之菜单程序


Posted in Javascript onOctober 10, 2016

命令模式的应用场景:

        有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么,此时希望用一种松耦合的方式来设计软件,使得请求发送者和请求接收者能够消除彼此之间的耦合关系。

html代码:

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8" />
 <title>js:命令模式</title>
 <script type="text/javascript" src="command.js"></script>
</head>
<style type="text/css">
button{
 margin: 5px;
 border: 0;
 width: 70px;
 height: 35px;
 background: #6B78BF;
 color: white;
 font-size: 14px;
 font-family: "微软雅黑";
 cursor: pointer;
}
#textarea{
 margin: 5px;
 width: 400px;
 height: 200px;
 resize: none;
 color: #666;
 font-size: 14px;
 border: 2px solid #6B78BF;
}
</style>
<body>
<button id="button1">刷新</button>
<button id="button2">新增</button>
<button id="button3">删除</button>
<br/>
<textarea id="textarea">
这是预设的内容
</textarea>

</body>
</html>

js代码:

// 在页面中使用例:setCommand( button1, refreshMenuBarCommand );来发送命令


// setCommand 函数负责往按钮上面安装命令,预留好安装命令的接口
var setCommand = function( button , command ){
 button.onclick = function(){
 command.execute();
 }
}

// 编写点击按钮之后的具体行为:刷新菜单界面、增加子菜单和删除子菜单
var MenuBar = {
 refresh: function(){
 var cur_date = new Date();
 document.getElementById("textarea").value+=cur_date.toLocaleString()+" 刷新菜单目录\r";
 }
}
var SubMenu = {
 add: function(){
 var cur_date = new Date();
 document.getElementById("textarea").value+=cur_date.toLocaleString()+" 新增菜单目录\r";
 },
 del: function(){
 var cur_date = new Date();
 document.getElementById("textarea").value+=cur_date.toLocaleString()+" 删除子菜单\r";
 }
}

//封装行为在命令类中
var RefreshMenuBarCommand = function( receiver ){
 this.receiver = receiver;

}
RefreshMenuBarCommand.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(){
 this.receiver.del();
}

//命令接收者传入到 command 对象
var refreshMenuBarCommand = new RefreshMenuBarCommand( MenuBar );
var addSubMenuCommand = new AddSubMenuCommand( SubMenu );
var delSubMenuCommand = new DelSubMenuCommand( SubMenu );

window.onload = function(){
 //把 command 对象安装到 button 上面
 var button1 = document.getElementById("button1");
 var button2 = document.getElementById("button2");
 var button3 = document.getElementById("button3");
 setCommand( button1, refreshMenuBarCommand );
 setCommand( button2, addSubMenuCommand );
 setCommand( button3, delSubMenuCommand );
}

总结:

从书上抄代码练习的过程中出了很多错误,最严重的莫过于“receiver”这个单词写错了导致很多天都再没看这个练习,出错的过程让我能够重新审视代码的内容,逐行进行理解与调试。虽然仍然不很理解命令模式,但是通过这部分的内容和对mySQL的学习,心里隐隐的留下了关于命令模式的影子。

参考:

《JavaScript设计模式与开发实践》第9章9.2节

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
让广告代码不再影响你的网页加载速度
Jul 07 Javascript
jQuery调用ajax请求的常见方法汇总
Mar 24 Javascript
简单实现js页面切换功能
Jan 10 Javascript
JS简单实现点击复制链接的方法
Aug 03 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
Apr 01 Javascript
Vue结合SignalR实现前后端实时消息同步
Sep 19 Javascript
shiro授权的实现原理
Sep 21 Javascript
JS的函数调用栈stack size的计算方法
Jun 24 Javascript
JavaScript创建对象方法实例小结
Sep 03 Javascript
node学习笔记之读写文件与开启第一个web服务器操作示例
May 29 Javascript
一文了解vue-router之hash模式和history模式
May 31 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
Oct 15 Javascript
KnockoutJS 3.X API 第四章之数据控制流component绑定
Oct 10 #Javascript
KnockoutJS 3.X API 第四章之click绑定
Oct 10 #Javascript
KnockoutJS 3.X API 第四章之事件event绑定
Oct 10 #Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
Oct 10 #Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
Oct 10 #Javascript
KnockoutJS 3.X API 第四章之表单value绑定
Oct 10 #Javascript
jquery操作checkbox火狐下第二次无法勾选的解决方法
Oct 10 #Javascript
You might like
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
iOS+PHP注册登录系统 PHP部分(上)
2016/12/26 PHP
PHP+redis实现微博的推模型案例分析
2019/07/10 PHP
Thinkphp自定义生成缩略图尺寸的方法
2019/08/05 PHP
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
2010/08/27 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
vue 使用rules对表单字段进行校验的步骤
2020/12/25 Vue.js
[01:28:56]2014 DOTA2华西杯精英邀请赛 5 24 CIS VS DK
2014/05/26 DOTA
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
Python3 操作符重载方法示例
2017/11/23 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
python3实现高效的端口扫描
2019/08/31 Python
Python 字符串、列表、元组的截取与切片操作示例
2019/09/17 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
html5 canvas-1.canvas介绍(hello canvas)
2013/01/07 HTML / CSS
html5 Canvas画图教程(5)—canvas里画曲线之arc方法
2013/01/09 HTML / CSS
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
皮尔·卡丹巴西官方商店:Pierre Cardin
2017/07/21 全球购物
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
省三好学生申请材料
2014/01/22 职场文书
高中教师个人工作总结
2015/02/10 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
2021/05/25 Vue.js
Python编程源码报错解决方法总结经验分享
2021/10/05 Python
使用Nginx+Tomcat实现负载均衡的全过程
2022/05/30 Servers