深入理解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入门基础 document.write输出
Feb 22 Javascript
js日历功能对象
Jan 12 Javascript
关于JavaScript与HTML的交互事件
Apr 12 Javascript
getJSON调用后台json数据时函数被调用两次的原因猜想
Sep 29 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
Jan 02 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
May 04 Javascript
jQuery与vue实现拖动验证码功能
Jan 30 jQuery
简单理解Vue中的nextTick方法
Jan 30 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
Apr 19 Javascript
Vue的编码技巧与规范使用详解
Aug 28 Javascript
VSCode搭建React Native环境
May 07 Javascript
vue响应式原理与双向数据的深入解析
Jun 04 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
PHP数据类型之整数类型、浮点数的介绍
2013/04/28 PHP
解析smarty 截取字符串函数 truncate的用法介绍
2013/06/20 PHP
php读取本地json文件的实例
2018/03/07 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
2012/02/03 Javascript
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
JavaScript树的深度优先遍历和广度优先遍历算法示例
2018/07/30 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
ES6中new Function()语法及应用实例分析
2020/02/19 Javascript
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python中列表、字典、元组、集合数据结构整理
2014/11/20 Python
深入解析Python的Tornado框架中内置的模板引擎
2016/07/11 Python
Django 限制用户访问频率的中间件的实现
2018/08/23 Python
Python文件如何引入?详解引入Python文件步骤
2018/12/10 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
Python自动抢红包教程详解
2019/06/11 Python
pytorch的batch normalize使用详解
2020/01/15 Python
python标准库os库的函数介绍
2020/02/12 Python
python实现微信打飞机游戏
2020/03/24 Python
给Django Admin添加验证码和多次登录尝试限制的实现
2020/07/26 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
幼儿园教研活动总结
2014/04/30 职场文书
个人党性分析材料
2014/12/19 职场文书
员工工作能力评语
2014/12/31 职场文书
警示教育观后感
2015/06/17 职场文书
2016年精神文明建设先进个人事迹材料
2016/02/29 职场文书