《JavaScript设计模式》——9.8 Command(命令)模式
本节书摘来自异步社区《JavaScript设计模式》一书中的第9章,第9.8节, 作者: 【美】Addy Osmani 译者: 徐涛 更多章节内容可以访问云栖社区“异步社区”公众号查看。
9.8 Command(命令)模式Command模式旨在将方法调用、请求或操作封装到单一对象中,从而根据我们不同的请求对客户进行参数化和传递可供执行的方法调用。此外,这种模式将调用操作的对象与知道如何实现该操作的对象解耦,并在交换出具体类(对象)方面提供更大的整体灵活性。
用基于类的编程语言解释具体类是最恰当的,它们与抽象类的思想相关。一个抽象类定义一个接口,但不一定为它所有的成员函数提供实现。它作为一个基类,派生出其他类。实现缺失功能的派生类被称为一个具体的类(见图9-7)。
Command模式背后的主要思想是:它为我们提供了一种分离职责的手段,这些职责包括从执行命令的任意地方发布命令以及将该职责转而委托给不同对象。
实施明智的、简单的命令对象将把action动作和调用该动作的对象绑定在一起。它们始终包括一个执行操作(如run()或execute())。所有具有相同接口的Command对象可以根据需要轻松交换,这被认为是该模式的一个更大好处。
为了演示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 +")"; })();
看一下上面的代码,它可以通过直接访问对象轻松地调用我们的CarManager方法。我们认为这里没有任何错误,从技术上讲,它是完全有效的JavaScript。然而,它在有些情况下可能是不利的。
例如,试想如果CarManager里的核心API改变了会怎么样。这将要求程序里所有直接访问这些方法的对象都需要进行修改。这可能被视为一个耦合层,它实际上最大程度地违反了松耦合对象的OOP方法论。而我们可以通过进一步抽象API来解决这个问题。
现在让我们来扩展CarManager,这样Command模式下的应用程序会产生如下结果:接受任意可以在CarManager对象上执行的命名方法,传递可以使用的任意数据,如CarModel(模型)和ID。
这是我们希望能够实现的内容:
CarManager.execute("buyVehicle", "Ford Escort", "453543");
按照这个结构,我们现在应该为CarManager.execute方法添加一个定义,如下所示:
CarManager.execute = function (name) { return CarManager[name] CarManager[name].apply(CarManager, [].slice.call(arguments, 1));
因此我们最终的示例调用看起来是这样的:
CarManager.execute("arrangeViewing", "Ferrari", "14523"); CarManager.execute("requestInfo", "Ford Mondeo", "54323"); CarManager.execute("requestInfo", "Ford Escort", "34232"); CarManager.execute("buyVehicle", "Ford Escort", "34232");
js发布订阅模式 emit 方法取到 arguments 里第一个当做 event,根据 event 值去执行对应缓存列表中的函数(发布者发布事件到调度中心,调度中心处理代码)
HTML中的JavaScript文档模式 HTML中的JavaScript文档模式是指浏览器在解析HTML文档时采用的模式,它可以影响文档的呈现方式和JavaScript的行为。本文将介绍文档模式的分类和作用,以及如何设置文档模式。
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- 浅议javascript的内存泄露
- 【JavaScript 6连载】二、函数(工厂模式)
- JavaScript之变量
- javascript 清空数组的方法
- [Javascript] Filter out Duplicates from Flat JavaScript Array with array.filter / reduce / Set
- [Javascript] Macro and Micro tasks
- [Javascript] Create an Image with JavaScript Using Fetch and URL.createObjectURL
- [Javascript] Replicate JavaScript Constructor Inheritance with Simple Objects (OLOO)
- [Javascript] JavaScript赋值时的传值与传址
- [Javascript] Iterate Over Items with JavaScript's for-of Loop
- [Javascript] Either Functor
- [Javascript] Redirect the browser using JavaScript
- [Javascript] How to use JavaScript's String.replace
- [Javascript] What is JavaScript Function Currying?
- [Javascript] Broadcaster + Operator + Listener pattern -- 2 Unsubscribe from Broadcaster
- [Javascript] How to use JavaScript's String.replace
- Javascript 严格模式详解
- 使用ABAP和JavaScript代码生成PDF文件的几种方式
- java和javascript日期校验和闰年问题分析和解决方案
- Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle
- 两种使用JavaScript触发ABAP事件的技术手段
- 利用Chrome开发者工具memory comparison分析一个时间段内的JavaScript代码内存占用率
- javascript案例10——下拉菜单
- 1.1.4:DHTMLX Rich Text|JavaScript/HTML Rich Text Editor
- ZingGrid JavaScript 1.5.0 Crack
- 【华为OD机试 2023】 最多几个直角三角形(C++ Java JavaScript Python)
- Javascript 在严格模式下禁止指向 this
- 关于 Javascript 严格模式下多文件合并时注意