深入理解JavaScript系列(34):设计模式之命令模式详解


Posted in Javascript onMarch 03, 2015

介绍

命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及执行可撤销的操作。也就是说改模式旨在将函数的调用、请求和操作封装成一个单一的对象,然后对这个对象进行一系列的处理。此外,可以通过调用实现具体函数的对象来解耦命令对象与接收对象。

正文

我们来通过车辆购买程序来展示这个模式,首先定义车辆购买的具体操作类:

$(function () {
    var CarManager = {
        // 请求信息

        requestInfo: function (model, id) {

            return 'The information for ' + model +

        ' with ID ' + id + ' is foobar';

        },
        // 购买汽车

        buyVehicle: function (model, id) {

            return 'You have successfully purchased Item '

        + id + ', a ' + model;

        },
        // 组织view

        arrangeViewing: function (model, id) {

            return 'You have successfully booked a viewing of '

        + model + ' ( ' + id + ' ) ';

        }

    };

})();

来看一下上述代码,通过调用函数来简单执行manager的命令,然而在一些情况下,我们并不想直接调用对象内部的方法。这样会增加对象与对象间的依赖。现在我们来扩展一下这个CarManager 使其能够接受任何来自包括model和car ID 的CarManager对象的处理请求。根据命令模式的定义,我们希望实现如下这种功能的调用:

CarManager.execute({ commandType: "buyVehicle", operand1: 'Ford Escort', operand2: '453543' });

根据这样的需求,我们可以这样啦实现CarManager.execute方法:
CarManager.execute = function (command) {

    return CarManager[command.request](command.model, command.carID);

};

改造以后,调用就简单多了,如下调用都可以实现(当然有些异常细节还是需要再完善一下的):
CarManager.execute({ request: "arrangeViewing", model: 'Ferrari', carID: '145523' });

CarManager.execute({ request: "requestInfo", model: 'Ford Mondeo', carID: '543434' });

CarManager.execute({ request: "requestInfo", model: 'Ford Escort', carID: '543434' });

CarManager.execute({ request: "buyVehicle", model: 'Ford Escort', carID: '543434' });

总结

命令模式比较容易设计一个命令队列,在需求的情况下比较容易将命令计入日志,并且允许接受请求的一方决定是否需要调用,而且可以实现对请求的撤销和重设,而且由于新增的具体类不影响其他的类,所以很容易实现。

但敏捷开发原则告诉我们,不要为代码添加基于猜测的、实际不需要的功能,如果不清楚一个系统是否需要命令模式,一般就不要着急去实现它,事实上,在需求的时通过重构实现这个模式并不困难,只有在真正需求如撤销、恢复操作等功能时,把原来的代码重构为命令模式才有意义。

Javascript 相关文章推荐
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
Mar 09 Javascript
File, FileReader 和 Ajax 文件上传实例分析(php)
Apr 27 Javascript
Android中资源文件(非代码部分)的使用概览
Dec 18 Javascript
JavaScript实现简单图片滚动附源码下载
Jun 17 Javascript
JavaScript运算符小结
Jun 03 Javascript
浅析javascript中的事件代理
Nov 06 Javascript
页面间固定参数,通过cookie传值的实现方法
May 31 Javascript
Bootstrap Table使用整理(四)之工具栏
Jun 09 Javascript
详解Vue学习笔记进阶篇之列表过渡及其他
Jul 17 Javascript
node.js实现上传文件功能
Jul 15 Javascript
layui数据表格重载实现往后台传参
Nov 15 Javascript
vue使用Google Recaptcha验证的实现示例
Aug 23 Vue.js
深入理解JavaScript系列(33):设计模式之策略模式详解
Mar 03 #Javascript
JavaScript模拟重力状态下抛物运动的方法
Mar 03 #Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
Mar 03 #Javascript
深入理解JavaScript系列(30):设计模式之外观模式详解
Mar 03 #Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
Mar 03 #Javascript
jQuery对象与DOM对象之间的相互转换
Mar 03 #Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
Mar 03 #Javascript
You might like
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
2009/04/25 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
2012/03/11 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
PHP面向对象多态性实现方法简单示例
2017/09/27 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
一个javascript参数的小问题
2008/03/02 Javascript
javascript 避免闭包引发的问题
2009/03/17 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
2010/11/23 Javascript
jQuery ul标签下拉菜单演示代码
2010/12/11 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
javascript之典型高阶函数应用介绍
2013/01/10 Javascript
网页整体变灰白色(兼容各浏览器)实例
2013/04/21 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
js 日期比较相关天数代码
2014/04/02 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
2016/07/22 Javascript
JavaScript lodash常见用法系列小结
2016/08/24 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
JS异步执行结果获取的3种解决方式
2019/02/19 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
微信自定义分享链接信息(标题,图片和内容)实现过程详解
2019/09/04 Javascript
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
python中pika模块问题的深入探究
2018/10/13 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
python实现文件助手中查看微信撤回消息
2019/04/29 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
Python sqlalchemy时间戳及密码管理实现代码详解
2020/08/01 Python
Python函数调用追踪实现代码
2020/11/27 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
AmazeUI 导航条的实现示例
2020/08/14 HTML / CSS
护士的岗位职责
2013/12/04 职场文书
政治思想表现评语
2014/05/04 职场文书
导游词之山海关
2019/12/10 职场文书