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 相关文章推荐
javascript setTimeout()传递函数参数(包括传递对象参数)
Apr 07 Javascript
Document对象内容集合(比较全)
Sep 06 Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
Apr 07 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
Jan 09 Javascript
解决JS浮点数运算出现Bug的方法
Mar 12 Javascript
canvas压缩图片转换成base64格式输出文件流
Mar 09 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
Aug 04 Javascript
Vue插件打包与发布的方法示例
Aug 20 Javascript
原生JS实现的跳一跳小游戏完整实例
Jan 27 Javascript
在微信小程序中使用vant的方法
Jun 07 Javascript
JS实现可控制的进度条
Mar 25 Javascript
vue-cli中实现响应式布局的方法
Mar 02 Vue.js
使用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实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
PHP中把stdClass Object转array的几个方法
2014/05/08 PHP
在PHP程序中使用Rust扩展的方法
2015/07/03 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
2017/08/11 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
js删除所有的cookie的代码
2010/11/25 Javascript
jquery isType() 类型判断代码
2011/02/14 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
一个php+js实时显示时间问题
2015/10/12 Javascript
D3.js实现雷达图的方法详解
2016/09/22 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
Centos6.8下Node.js安装教程
2017/05/12 Javascript
ReactNative列表ListView的用法
2017/08/02 Javascript
JS中关于正则的巧妙操作
2017/08/31 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
python Django连接MySQL数据库做增删改查
2013/11/07 Python
python实现简单的计时器功能函数
2015/03/14 Python
Python计算三角函数之asin()方法的使用
2015/05/15 Python
python读写LMDB文件的方法
2018/07/02 Python
python读取图片任意范围区域
2019/01/23 Python
Python实现二叉搜索树BST的方法示例
2019/07/30 Python
使用python批量转换文件编码为UTF-8的实现
2020/04/03 Python
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
聘用意向书范本
2014/04/01 职场文书
2014年工会工作总结
2014/11/12 职场文书
远程教育培训心得体会
2016/01/09 职场文书
2016优秀护士先进个人事迹材料
2016/02/25 职场文书
python图片灰度化处理的几种方法
2021/06/23 Python
Python编程源码报错解决方法总结经验分享
2021/10/05 Python