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 相关文章推荐
让FireFox支持innerText的实现代码
Dec 01 Javascript
js鼠标左右键 键盘值小结
Jun 11 Javascript
简单的js表单验证函数
Oct 28 Javascript
JS调用页面表格导出excel示例代码
Mar 18 Javascript
JS实现点击按钮获取页面高度的方法
Nov 02 Javascript
js实现对table的增加行和删除行的操作方法
Oct 13 Javascript
在vue中给列表中的奇数行添加class的实现方法
Sep 05 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
May 08 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
May 10 Javascript
vue项目出现页面空白的解决方案
Oct 31 Javascript
Vue实现手机扫描二维码预览页面效果
May 28 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
Jan 29 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
PHP的FTP学习(一)[转自奥索]
2006/10/09 PHP
详解在YII2框架中使用UEditor编辑器发布文章
2018/11/02 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
JQuery 操作select标签实现代码
2010/05/14 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
2010/09/15 Javascript
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
2013/02/16 Javascript
ComboBox 和 DateField 在IE下消失的解决方法
2013/08/30 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
自己实现ajax封装示例分享
2014/04/01 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
jquery ztree实现右键收藏功能
2017/11/20 jQuery
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
leaflet加载geojson叠加显示功能代码
2020/02/21 Javascript
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
python使用mysqldb连接数据库操作方法示例详解
2013/12/03 Python
Python操作CouchDB数据库简单示例
2015/03/10 Python
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
python路径的写法及目录的获取方式
2019/12/26 Python
python suds访问webservice服务实现
2020/06/26 Python
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
Tod’s英国官方网站:意大利奢华手工制作手袋和鞋履
2019/03/15 全球购物
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
维多利亚的秘密阿联酋官网:Victoria’s Secret阿联酋
2019/12/07 全球购物
大学军训自我鉴定
2013/12/15 职场文书
大学老师推荐信
2014/02/25 职场文书
售后客服个人自我评价
2014/09/14 职场文书
公司授权委托书范本
2014/09/18 职场文书
班主任2015新年寄语
2014/12/08 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript