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 相关文章推荐
jquery淡化版banner异步图片文字效果切换图片特效
Apr 08 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
Oct 16 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
Mar 20 Javascript
全面解析Bootstrap手风琴效果
Apr 17 Javascript
第五章之BootStrap 栅格系统
Apr 25 Javascript
JQuery validate 验证一个单独的表单元素实例
Feb 17 Javascript
关于angular js_$watch监控属性和对象详解
Apr 24 Javascript
Node.js readline模块与util模块的使用
Mar 01 Javascript
mock.js模拟数据实现前后端分离
Jul 24 Javascript
js设计模式之代理模式及订阅发布模式实例详解
Aug 15 Javascript
使用JS location实现搜索框历史记录功能
Dec 23 Javascript
JavaScript实现两个数组的交集
Mar 25 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切割页面div内容的实现代码分享
2012/07/31 PHP
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
js中parseFloat(参数1,参数2)定义和用法及注意事项
2013/01/27 Javascript
浅析LigerUi开发中谨慎载入common.css文件
2013/07/09 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
AngularJS基础 ng-mousemove 指令简单示例
2016/08/02 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
webpack打包node.js后端项目的方法
2018/03/10 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
微信小程序wepy框架学习和使用心得详解
2019/05/24 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
Python中的CURL PycURL使用例子
2014/06/01 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
TensorFlow入门使用 tf.train.Saver()保存模型
2018/04/24 Python
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
解决Python内层for循环如何break出外层的循环的问题
2019/06/24 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
东南亚冒险旅行与活动:Adventoro
2019/10/16 全球购物
Delphi CS笔试题
2014/01/04 面试题
学生检讨书范文
2015/01/27 职场文书
安徽导游词
2015/02/12 职场文书
总结Java对象被序列化的两种方法
2021/06/30 Java/Android
利用Python脚本写端口扫描器socket,python-nmap
2022/07/23 Python