深入理解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 相关文章推荐
jquery的Tooltip插件 qtip使用详细说明
Sep 08 Javascript
Javascript 命名空间模式
Nov 01 Javascript
js如何判断用户是否是用微信浏览器
Jun 05 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
Jul 05 Javascript
Angular2从搭建环境到开发步骤详解
Oct 17 Javascript
JS实现一个简单的日历
Feb 22 Javascript
Vue2.0组件间数据传递示例
Mar 07 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
May 26 Javascript
javascript实现文件拖拽事件
Mar 29 Javascript
Express本地测试HTTPS的示例代码
Jun 06 Javascript
Vue 使用formData方式向后台发送数据的实现
Apr 14 Javascript
javascript实现打砖块小游戏(附完整源码)
Sep 18 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
实现“上一页”和“下一页按钮
2006/10/09 PHP
不错的PHP学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
php REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
ecshop添加菜单及权限分配问题
2017/11/21 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
js href的用法
2010/05/13 Javascript
Jquery Change与bind事件代码
2011/09/29 Javascript
javascript数据类型示例分享
2015/01/19 Javascript
JS设置下拉列表框当前所选值的方法
2015/12/22 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
jQuery事件详解
2017/02/23 Javascript
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
angular过滤器实现排序功能
2017/06/27 Javascript
nodejs 子进程正确的打开方式
2017/07/03 NodeJs
[05:20]2018DOTA2亚洲邀请赛主赛事第三日战况回顾 LGD率先挺进胜者组决赛
2018/04/06 DOTA
Windows下为Python安装Matplotlib模块
2015/11/06 Python
Python爬虫爬验证码实现功能详解
2016/04/14 Python
浅谈python中scipy.misc.logsumexp函数的运用场景
2016/06/23 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
python3 实现对图片进行局部切割的方法
2018/12/05 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
2019/07/23 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
斯凯奇澳大利亚官网:SKECHERS澳大利亚
2018/03/31 全球购物
远东集团网络工程师面试题
2014/10/20 面试题
计划生育证明书写要求
2014/09/17 职场文书
汽车转让协议书范本
2014/12/07 职场文书
乐山大佛导游词
2015/02/02 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
Linux中文件的基本属性介绍
2022/06/01 Servers