JS设计模式之命令模式概念与用法分析


Posted in Javascript onFebruary 06, 2018

本文实例讲述了JS设计模式之命令模式概念与用法。分享给大家供大家参考,具体如下:

客户创建命令;调用者执行该命令;接收者在命令执行时执行相应操作
简单命令对象一般用来消除二个对象(调用者和接收者)之间的耦合,而复杂的命令对象则一般用来封装不可分的或事务性的指令。

命令模式的主要用途是把调用对象(用户界面、API和代理等)与实现操作的对象隔离开。凡是两个对象间互动方式需要有更高的模块化程度时都可以用到这种模式。

命令的意思是用一个简单方法或函数去执行和这个命令相关的实际操作。就如同用遥控器打开电视一样,只按一个按键就可以打开电视,简单、方便。它具体的实现操作我们不用关心。那是有电视器来处理的。电视对遥控器提供了一个接口(信号),遥控器只需要在点击时实现这个接口就可以了。

JS设计模式之命令模式概念与用法分析

Command:
定义命令的接口,声明执行的方法。
ConcreteCommand:
命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
Receiver:
接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
Invoker:
要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。
Client:
创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行

模式分析

1.命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
2.每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。
3.命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
4.命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。
5.命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。

模式优点

1.降低对象之间的耦合度。
2.新的命令可以很容易地加入到系统中。
3.可以比较容易地设计一个组合命令。
4.调用同一方法实现不同的功能

// 命令
var CreateCommand = function( receiver ){
 this.receiver = receiver;
}
CreateCommand.prototype.execute = function() {
 this.receiver.action();
}
// 接收者 电视
var TVOn = function() {}
TVOn.prototype.action = function() {
  alert("TVOn");
}
// 接收者 电视
var TVOff = function() {}
TVOff.prototype.action = function() {
  alert("TVOff");
}
// 调用者 遥控器
var Invoker = function( tvOnCommand, tvOffCommand ) {
  this.tvOnCommand = tvOnCommand;
  this.tvOffCommand = tvOffCommand;
}
Invoker.prototype.tvOn = function() {
  this.tvOnCommand.execute();
}
Invoker.prototype.tvOff = function() {
  this.tvOffCommand.execute();
}

执行Client

var tvOnCommand = new CreateCommand( new TVOn() );
var tvOffCommand = new CreateCommand( new TVOff() );
var invoker = new Invoker( tvOnCommand, tvOffCommand );
invoker.tvOn();
invoker.tvOff();

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
Feb 13 Javascript
Jquery网页出现的乱码问题的三种解决方法
Jun 30 Javascript
10条建议帮助你创建更好的jQuery插件
May 18 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
Jan 27 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
Nov 22 Javascript
JavaScript 字符串常用操作小结(非常实用)
Nov 30 Javascript
Angular4学习笔记之准备和环境搭建项目
Aug 01 Javascript
JSON.stringify()方法讲解
Jan 31 Javascript
AngularJs中$cookies简单用法分析
May 30 Javascript
vue中利用Promise封装jsonp并调取数据
Jun 18 Javascript
uni-app 支持多端第三方地图定位的方法
Jan 03 Javascript
关于uniApp editor微信滑动问题
Jan 15 Javascript
使用selenium抓取淘宝的商品信息实例
Feb 06 #Javascript
vue一个页面实现音乐播放器的示例
Feb 06 #Javascript
使用百度地图实现地图网格的示例
Feb 06 #Javascript
js中的闭包学习心得
Feb 06 #Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
Feb 06 #Javascript
Vue仿今日头条实例详解
Feb 06 #Javascript
electron demo项目npm install安装失败的解决方法
Feb 06 #Javascript
You might like
关于PHP堆栈与列队的学习
2013/06/21 PHP
php判断数组元素中是否存在某个字符串的方法
2014/06/14 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
php采集神器cURL使用方法详解
2016/02/19 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
基于nodejs res.end和res.send的区别
2018/05/14 NodeJs
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
原生js实现自定义难度的扫雷游戏
2021/01/22 Javascript
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
详解Python 调用C# dll库最简方法
2019/06/20 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
python3实现网页版raspberry pi(树莓派)小车控制
2020/02/12 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
2020/05/19 Python
html5 http的轮询和Websocket原理
2018/10/19 HTML / CSS
打印机墨盒:123Inkjets
2017/02/16 全球购物
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
学习党章思想汇报
2014/01/07 职场文书
工程造价专业大学生职业规划范文
2014/03/09 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
我的法兰西岁月观后感
2015/06/09 职场文书
只需要100行Python代码就可以实现的贪吃蛇小游戏
2021/05/27 Python
Python实现简单的猜单词
2021/06/15 Python