1. 首页

深入理解JavaScript系列(34)- 设计模式之命令模式

介绍

命令模式(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系列文章,包括了原创,翻译,转载等各类型的文章,如果对你有用,请推荐支持一把,给大叔写作的动力。

作者: 汤姆大叔
链接:http://www.cnblogs.com/TomXu/archive/2012/03/08/2358593.html

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

标题:深入理解JavaScript系列(34)- 设计模式之命令模式

链接:https://www.javascriptc.com/3643.html

« [译] 使用 Proxy 来监测 Javascript 中的类
深入理解JavaScript系列(33)- 设计模式之策略模式»
Flutter 中文教程资源

相关推荐

QR code