深入理解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 相关文章推荐
8个超棒的学习 jQuery 的网站 推荐收藏
Apr 02 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
Feb 03 Javascript
javascript实现控制div颜色
Jul 07 Javascript
jquery实现超简洁的TAB选项卡效果代码
Aug 28 Javascript
JS简单模拟触发按钮点击功能的方法
Nov 30 Javascript
javascript实现保留两位小数的多种方法
Dec 18 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
Aug 25 Javascript
深入理解JavaScript中的预解析
Jan 04 Javascript
Javascript(es2016) import和require用法和区别详解
Aug 11 Javascript
vue+node+webpack环境搭建教程
Nov 05 Javascript
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
Dec 01 Javascript
vue spa应用中的路由缓存问题与解决方案
May 31 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
URL Rewrite的设置方法
2007/01/02 PHP
初级的用php写的采集程序
2007/03/16 PHP
测试PHP连接MYSQL成功与否的代码
2013/08/16 PHP
从PHP $_SERVER相关参数判断是否支持Rewrite模块
2013/09/26 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
2013/11/26 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
2014/04/08 PHP
ThinkPHP表单自动验证实例
2014/10/13 PHP
thinkphp模板继承实例简述
2014/11/26 PHP
php array_slice 取出数组中的一段序列实例
2016/11/04 PHP
$.ajax json数据传递方法
2008/11/19 Javascript
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
关于div自适应高度/左右高度自适应一致的js代码
2013/03/22 Javascript
JS数组的赋值介绍
2014/03/10 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
2016/05/09 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
2019/05/20 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
2020/01/21 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
Python中音频处理库pydub的使用教程
2017/06/07 Python
python实现二分查找算法
2017/09/21 Python
python使用插值法画出平滑曲线
2018/12/15 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
python热力图实现简单方法
2021/01/29 Python
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
鲜果饮品店创业计划书
2014/01/21 职场文书
物流业务员岗位职责
2014/02/08 职场文书
网络营销策划方案
2014/06/04 职场文书
创业项目大全(适合在家创业的项目)
2019/08/15 职场文书
vue封装数字翻牌器
2022/04/20 Vue.js
Java界面编程实现界面跳转
2022/06/16 Java/Android