Js设计模式——命令模式

来源:http://www.chinese-glasses.com 作者:Web前端 人气:138 发布时间:2020-04-22
摘要:时间: 2019-09-24阅读: 124标签: 模式 时间: 2019-07-14阅读: 274标签:模式命令模式:请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命

时间: 2019-09-24阅读: 124标签: 模式

时间: 2019-07-14阅读: 274标签: 模式命令模式:请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

命令模式是JavaScript设计模式中行为型的一种设计模式;

生活小栗子:客户下单,订单记录了客户购买的产品,仓库根据订单给客户备货。

定义:

模式特点

向某些对象发送请求,但是并不知道被请求的操作具体是什么,所以我们希望以一种松耦合的方式来设计程序,使得请求发送者和接收者之间能够消除彼此之间的耦合关系;而我们的这种松耦合的方式就是命令模式;

命令模式由三种角色构成:

白话解释:

发布者invoker(发出命令,调用命令对象,不知道如何执行与谁执行);接收者receiver(提供对应接口处理请求,不知道谁发起请求);命令对象command(接收命令,调用接收者对应接口处理发布者的请求)。

10bet,假如你是你们公司研发部门团队leader,这时你们领导分布给你一个任务,你粗略的看了一下,很简单的需求比较容易实现;而你作为团队leader,每天肯定会有很多事情,所以你准备把需求直接丢给组员去开发和实现;领导根本不在意是你做的还是你让谁做的,领导要的只是最终成果!这里领导就是命令的发布者,而你就是命令的接收者;

发布者invoker和接收者receiver各自独立,将请求封装成命令对象command,请求的具体执行由命令对象command调用接收者receiver对应接口执行。

代码实现:

命令对象command充当发布者invoker与接收者receiver之间的连接桥梁(中间对象介入)。实现发布者与接收之间的解耦,对比过程化请求调用,命令对象command拥有更长的生命周期,接收者receiver属性方法被封装在命令对象command属性中,使得程序执行时可任意时刻调用接收者对象receiver。因此command可对请求进行进一步管控处理,如实现延时、预定、排队、撤销等功能。

!DOCTYPE htmlhtml lang="en"head meta charset="UTF-8" meta name="viewport" content="width=device-width, initial-scale=1.0" meta http-equiv="X-UA-Compatible" content="ie=edge" titleDocument/title/headbody button 发布命令给前端/button button 发布命令给后台/button/bodyscript var button1 = document.getElementById("button1"); var button2 = document.getElementById("button2"); // 定义命令 var command = function(Executor,func){ Executor.onclick = func; } // 定义领导 var Leader = {}; Leader.teamleader = { web:function(){ console.log("前端马上完成"); }, java:function(){ console.log("后台马上完成") } } command(button1,Leader.teamleader.web); command(button2,Leader.teamleader.java);/script/html

代码实现

这里的将命令对象单独的定义为一个方法,根据参数执行不同的任务。点击不同按钮的时候,执行不同的命令;

class Receiver { // 接收者类 execute() { console.log('接收者执行请求'); }}class Command { // 命令对象类 constructor(receiver) { this.receiver = receiver; } execute () { // 调用接收者对应接口执行 console.log('命令对象-接收者-对应接口执行'); this.receiver.execute(); }}class Invoker { // 发布者类 constructor(command) { this.command = command; } invoke() { // 发布请求,调用命令对象 console.log('发布者发布请求'); this.command.cmd(); }}const warehouse = new Receiver(); // 仓库const order = new Command(warehouse); // 订单const client = new Invoker(order); // 客户client.invoke();/*输出: 发布者发布请求 命令对象-接收者-对应接口执行 接收者执行请求*/

宏命令:

应用场景有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。需要一种松耦合的方式来设计程序,使得发送者和接收者能够消除彼此之间的耦合关系。——《JavaScript 设计模式与开发实践》不关注执行者,不关注执行过程;只要结果,支持撤销请求、延后处理、日志记录等。优缺点

宏命令是一组命令的集合,通过执行宏命令的方式可以一次性执行一批命令;

优点:

电脑开机自启动项:现在很多软件都默认添加了电脑开机自启动,就是我们电脑开机之后默认启动某些特定的软件;这就是一种宏命令的场景;

发布者与接收者实现解耦;

 var QQCommand = { excute:function(){ console.log("自启动QQ成功"); } } var weChatCommand = { excute:function(){ console.log("自启动微信成功"); } } var MacroCommand = function(){ return { list:[], add:function(command){ this.list.push(command); }, excute:function(){ for(var i = 0,command;command = this.list[i++];){ command.excute(); } } } } var macroCommand = MacroCommand(); macroCommand.add(QQCommand); macroCommand.add(weChatCommand); macroCommand.excute();

可扩展命令,对请求可进行排队或日志记录。(支持撤销,队列,宏命令等功能)。

本文由10bet发布于Web前端,转载请注明出处:Js设计模式——命令模式

关键词:

上一篇:跨域那些疑惑10bet:

下一篇:没有了

最火资讯