深入理解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模块模式分析
May 16 Javascript
文本框的字数限制功能jquery插件
Nov 24 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
Jun 17 Javascript
jQuery快速高效制作网页交互特效
Feb 24 Javascript
Vue2组件tree实现无限级树形菜单
Mar 29 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
Jul 27 Javascript
vue router学习之动态路由和嵌套路由详解
Sep 21 Javascript
AngularJS遍历获取数组元素的方法示例
Nov 11 Javascript
在React项目中使用Eslint代码检查工具及常见问题
Oct 10 Javascript
微信小程序学习笔记之本地数据缓存功能详解
Mar 29 Javascript
JavaScript通如何过RGraph实现动态仪表盘
Oct 15 Javascript
vue element实现表格合并行数据
Nov 30 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
用IE远程创建Mysql数据库的简易程序
2006/10/09 PHP
php 常用类整理
2009/12/23 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
Laravel框架自定义公共函数的引入操作示例
2019/04/16 PHP
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
jQuery最佳实践完整篇
2011/08/20 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
关于iframe跨域POST提交的方法示例
2017/01/15 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
JavaScript基础之流程控制语句的用法
2017/08/31 Javascript
nodejs使用http模块发送get与post请求的方法示例
2018/01/08 NodeJs
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
微信公众平台 发送模板消息(Java接口开发)
2019/04/17 Javascript
Python3使用requests登录人人影视网站的方法
2016/05/11 Python
浅谈Python 对象内存占用
2016/07/15 Python
python利用urllib和urllib2访问http的GET/POST详解
2017/09/27 Python
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
详解Python with/as使用说明
2018/12/13 Python
python使用threading.Condition交替打印两个字符
2019/05/07 Python
在Pandas中处理NaN值的方法
2019/06/25 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
2019/08/09 Python
python 5个实用的技巧
2020/09/27 Python
基于OpenCV的路面质量检测的实现
2020/11/04 Python
Canvas制作旋转的太极的示例
2018/03/09 HTML / CSS
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
毕业生找工作推荐信
2013/11/21 职场文书
应届实习生的自我评价范文
2014/01/05 职场文书
给幼儿园老师的表扬信
2014/01/19 职场文书
暑期社会实践个人总结
2015/03/06 职场文书
放假通知范文
2015/04/14 职场文书
资金申请报告范文
2015/05/14 职场文书
处世之道:关于真诚相待的名言推荐
2019/12/02 职场文书