深入理解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 乱码问题
Aug 06 Javascript
jQuery的:parent选择器定义和用法
Jul 01 Javascript
JavaScript中Null与Undefined的区别解析
Jun 30 Javascript
JS代码实现table数据分页效果
May 26 Javascript
jQuery实现的tab标签切换效果示例
Sep 05 Javascript
JS弹出窗口的运用与技巧大全
Nov 01 Javascript
微信小程序中hidden不生效原因的解决办法
Apr 26 Javascript
Vue实现双向数据绑定
May 03 Javascript
详解Vue爬坑之vuex初识
Jun 14 Javascript
jQuery+CSS实现的table表格行列转置功能示例
Jan 08 jQuery
图文讲解vue的v-if使用方法
Feb 11 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
Aug 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
php旋转图片90度的方法
2013/11/07 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
2014/05/08 Javascript
JS中prototype的用法实例分析
2015/03/19 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
微信小程序 http请求的session管理
2017/06/07 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
2018/02/08 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
2018/10/08 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
express框架中使用jwt实现验证的方法
2019/08/25 Javascript
vue-cli3项目升级到vue-cli4 的方法总结
2020/03/19 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
[02:24]DOTA2痛苦女王 英雄基础教程
2013/11/26 DOTA
在Python中利用Into包整洁地进行数据迁移的教程
2015/03/30 Python
python中将一个全部为int的list 转化为str的list方法
2018/04/09 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
2018/07/09 Python
python3使用pandas获取股票数据的方法
2018/12/22 Python
python调用其他文件函数或类的示例
2019/07/16 Python
使用python的turtle绘画滑稽脸实例
2019/11/21 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
2020/05/07 Python
java字符串格式化输出实例讲解
2021/01/06 Python
香港时装购物网站:ZALORA香港
2017/04/23 全球购物
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
某公司C#程序员面试题笔试题
2014/05/26 面试题
2014年个人工作总结模板
2014/12/15 职场文书
边城读书笔记
2015/06/29 职场文书
公司宣传语大全
2015/07/13 职场文书
Go语言基础知识点介绍
2021/07/04 Golang
python疲劳驾驶困倦低头检测功能的实现
2022/04/04 Python