深入理解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 相关文章推荐
javascript实现动态CSS换肤技术的脚本
Jun 29 Javascript
实现JavaScript中继承的三种方式
Oct 16 Javascript
jquery异步循环获取功能实现代码
Sep 19 Javascript
javascript是怎么继承的介绍
Jan 05 Javascript
jquery制作select列表双向选择示例代码
Sep 02 Javascript
node+express+ejs制作简单页面上手指南
Nov 26 Javascript
JS实现简单路由器功能的方法
May 27 Javascript
JavaScript实现时间倒计时跳转(推荐)
Jun 28 Javascript
Node.js读取文件内容示例
Mar 07 Javascript
JS在if中的强制类型转换方式
Jul 15 Javascript
如何通过Proxy实现JSBridge模块化封装
Oct 22 Javascript
javascript进阶篇深拷贝实现的四种方式
Jul 07 Javascript
深入理解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
SONY SRF-22W(33W)的电路分析和维修案例
2021/03/02 无线电
Php注入点构造代码
2008/06/14 PHP
javascript+php实现根据用户时区显示当地时间的方法
2015/03/11 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
2018/06/22 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
javascript 拖放效果实现代码
2010/01/22 Javascript
jQuery 表格插件整理
2010/04/27 Javascript
用jquery实现下拉菜单效果的代码
2010/07/25 Javascript
document.getElementById介绍
2011/09/13 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
微信小程序 label 组件详解及简单实例
2017/01/10 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
javascript 数组精简技巧小结
2020/02/26 Javascript
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
简单介绍Python中的len()函数的使用
2015/04/07 Python
在Python中使用成员运算符的示例
2015/05/13 Python
详细解读tornado协程(coroutine)原理
2018/01/15 Python
python实现ID3决策树算法
2018/08/29 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
2020/03/19 Python
Python格式化输出--%s,%d,%f的代码解析
2020/04/29 Python
办公室综合文员岗位职责范本
2014/02/13 职场文书
股东授权委托书范文
2014/09/13 职场文书
反四风个人对照检查材料思想汇报
2014/09/25 职场文书
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
邀请函范文
2015/02/02 职场文书
2015年度质量工作总结报告
2015/04/27 职场文书
北京青年观后感
2015/06/15 职场文书
Pytest中conftest.py的用法
2021/06/27 Python
Java使用Unsafe类的示例详解
2021/09/25 Java/Android
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL