深入理解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 相关文章推荐
在IE6下发生Internet Explorer cannot open the Internet site错误
Jun 21 Javascript
JS实现字体选色板实例代码
Nov 20 Javascript
常用的几段javascript代码分享
Mar 25 Javascript
jQuery 删除/替换DOM元素的几种方式
May 20 Javascript
IE10中flexigrid无法显示数据的解决方法
Jul 26 Javascript
jQuery实现监控页面所有ajax请求的方法
Dec 10 Javascript
原生js实现查询天气小应用
Dec 09 Javascript
JavaScript 事件对内存和性能的影响
Jan 22 Javascript
socket.io实现在线群聊功能
Apr 07 Javascript
vue上传图片组件编写代码
Jul 26 Javascript
实现两个文本框同时输入的实例
Sep 25 Javascript
vue路由传参三种基本方式详解
Dec 09 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
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
PHP 创建标签云函数代码
2010/05/26 PHP
php根据日期显示所在星座的方法
2015/07/13 PHP
如何优雅的使用 laravel 的 validator验证方法
2018/11/11 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
jquery 事件执行检测代码
2009/12/09 Javascript
在JS中最常看到切最容易迷惑的语法(转)
2010/10/29 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
2013/05/30 Javascript
怎么选择Javascript框架(Javascript Framework)
2013/11/22 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
2014/01/10 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
vue中轮训器的使用
2019/01/27 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
微信小程序之高德地图多点路线规划过程示例详解
2021/01/18 Javascript
Python中的True,False条件判断实例分析
2015/01/12 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
Python内建模块struct实例详解
2018/02/02 Python
python读取一个目录下所有txt里面的内容方法
2018/06/23 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
基于python实现音乐播放器代码实例
2020/07/01 Python
暑期培训随笔感言
2014/03/10 职场文书
小学课外活动总结
2014/07/09 职场文书
党员四风剖析材料
2014/08/27 职场文书
社团活动总结格式
2014/08/29 职场文书
教师考核鉴定意见
2015/06/05 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
休学证明范本
2015/06/19 职场文书
sql server偶发出现死锁的解决方法
2022/04/10 SQL Server