深入理解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 常用关键字列表集合
Dec 04 Javascript
javascript 文章截取部分无损html显示实现代码
May 04 Javascript
jQuery 图片切换插件(代码比较少)
May 07 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
Feb 22 Javascript
封装的jquery翻页滚动(示例代码)
Nov 18 Javascript
用JS在浏览器中创建下载文件
Mar 05 Javascript
js实现class样式的修改、添加及删除的方法
Jan 20 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
Feb 20 Javascript
bootstrap时间插件daterangepicker使用详解
Oct 19 Javascript
使用3D引擎threeJS实现星空粒子移动效果
Sep 13 Javascript
JQuery发送ajax请求时中文乱码问题解决
Nov 14 jQuery
Vue scoped及deep使用方法解析
Aug 01 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
PHP反转字符串函数strrev()函数的用法
2012/02/04 PHP
php画图实例
2014/11/05 PHP
php实现简单加入购物车功能
2017/03/07 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
在Node.js中实现文件复制的方法和实例
2014/06/05 Javascript
Windows8下搭建Node.js开发环境教程
2014/09/03 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
JS实现仿新浪黄色经典滑动门效果代码
2015/09/27 Javascript
JS常用加密编码与算法实例总结
2016/12/22 Javascript
javascript滚轮事件基础实例讲解(37)
2017/02/14 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
vue.js简单配置axios的方法详解
2017/12/13 Javascript
Vue Element 分组+多选+可搜索Select选择器实现示例
2018/07/23 Javascript
[06:37]2014DOTA2国际邀请赛 昔日王者渴望重回巅峰
2014/07/12 DOTA
[01:10]DOTA2次级职业联赛 - EP战队宣传片
2014/12/01 DOTA
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
Python列表生成器的循环技巧分享
2015/03/06 Python
Python利用ElementTree模块处理XML的方法详解
2017/08/31 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
Python实现FM算法解析
2019/06/18 Python
Python获取统计自己的qq群成员信息的方法
2019/11/15 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
牵手50台湾:专为黄金岁月的单身人士而设的交友网站
2021/02/18 全球购物
英国豪华家具和家居用品购物网站:Teddy Beau
2020/10/12 全球购物
实习生个人找工作的自我评价
2013/10/30 职场文书
管理部部长岗位职责
2013/12/05 职场文书
大学英语演讲稿范文
2014/04/24 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
终止或解除劳动合同及劳动关系的证明书
2014/10/06 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
同学聚会祝酒词
2015/08/10 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android