模式特点

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

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

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

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

代码实现

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.execute(); }}const warehouse = new Receiver(); // 仓库const order = new Command(warehouse); // 订单const client = new Invoker(order); // 客户client.invoke();/*输出: 发布者发布请求 命令对象->接收者->对应接口执行 接收者执行请求*/

应用场景

  1. 不关注执行者,不关注执行过程;
  2. 只要结果,支持撤销请求、延后处理、日志记录等。

优缺点

  • 优点:
  1. 发布者与接收者实现解耦;
  2. 可扩展命令,对请求可进行排队或日志记录。(支持撤销,队列,宏命令等功能)。
  • 缺点:
  1. 额外增加命令对象,非直接调用,存在一定开销。

宏命令

宏命令:一组命令集合(命令模式与组合模式的产物)

发布者发布一个请求,命令对象会遍历命令集合下的一系列子命令并执行,完成多任务。

// 宏命令对象class MacroCommand { constructor() { this.commandList = []; // 缓存子命令对象 } add(command) { // 向缓存中添加子命令 this.commandList.push(command); } exceute() { // 对外命令执行接口 // 遍历自命令对象并执行其 execute 方法 for (const command of this.commandList) { command.execute(); } }}const openWechat = { // 命令对象 execute: () => { console.log('打开微信'); }};const openChrome = { // 命令对象 execute: () => { console.log('打开Chrome'); }};const openEmail = { // 命令对象 execute: () => { console.log('打开Email'); }}const macroCommand = new MacroCommand();macroCommand.add(openWechat); // 宏命令中添加子命令macroCommand.add(openChrome); // 宏命令中添加子命令macroCommand.add(openEmail); // 宏命令中添加子命令macroCommand.execute(); // 执行宏命令/* 输出:打开微信打开Chrome打开Email*/

傻瓜命令与智能命令

傻瓜命令:命令对象需要接收者来执行客户的请求。

智能命令:命令对象直接实现请求,不需要接收者,“聪明”的命令对象。

“傻瓜命令” 与 “智能命令” 的区别在于是否有 “接收者” 对象。

// openWechat 是智能命令对象,并没有传入 receiver 接收对象const openWechat = { execute: () => { // 命令对象直接处理请求 console.log('打开微信'); }};

没有 “接收者” 的智能命令与策略模式很类似。代码实现类似,区别在于实现目标不同。

  1. 策略模式中实现的目标是一致的,只是实现算法不同(如目标:根据KPI计算奖金);
  2. 智能命令的解决问题更广,目标更具散发性。(如目标:计算奖金/计算出勤率等)。

javascript设计模式_JavaScript设计模式:命令模式(通俗易懂)相关推荐

  1. 【白话设计模式八】命令模式(Command)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  2. Head First 设计模式中的命令模式 的一个错误

    最近在看Head First 设计模式,其中命令模式中有讲到实现撤销功能,并且作者还出了一道题, 下面的是书中习题: public class MarcoCommand implements Comm ...

  3. javascript设计模式_JavaScript 设计模式 学习总结

    ---------------------------------------------------------------------------------------------------- ...

  4. Head First 设计模式总结(六) 命令模式

    本文总结了<Head First 设计模式>中的命令模式 命令模式--将请求封装成"对象",以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持撤销操作. ...

  5. 【源码分析设计模式 13】命令模式

    一.基本介绍 1.在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作时哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计 ...

  6. 设计模式笔记:命令模式

    首先看看命令模式的定义:命令模式将请求封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持撤销的操作. 所谓参数化,我的理解是实际执行的对象,比如light(电灯).strer ...

  7. Head First 设计模式笔记 5.命令模式

    文章目录 设计要求 命令模式 实际实现 命令模式具体应用 设计要求 小明接到了新任务,要求设计一个遥控器,这个遥控器上面有七个插槽,每个插槽都有对应的开和关按钮.要求每个都能控制任意家电如灯,电视,电 ...

  8. [设计模式随意链接]——命令模式

    1. 为什么要有命令模式 软件构建过程中.行为请求者与行为调用者可能有强耦合的情况.如下所示 if (type == a) { do_a() } else if (type == b) { do_b( ...

  9. 《Head First 设计模式》之命令模式——遥控器

    命令模式(Command) --将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 要点 将发出请求的对象和执行请求的对象解耦. ...

  10. 设计模式学习笔记——命令模式(Command)

    1.特点:将请求发送者与具体实现者解耦,可对请求排列.取消.重做,支持事务.(多请求,单处理) 2.概念:属于对象的行为模式[GOF95].命令模式又称为行动(Action)模式或交易(Transac ...

最新文章

  1. CVPR 2017 全部及部分论文解读集锦
  2. rocketmq中consumer设计与实现
  3. 使用sql语句,查询 mysql 的安装地址
  4. 8.1 概述-机器学习笔记-斯坦福吴恩达教授
  5. webRTC+coturn穿透服务器的安装与搭建
  6. MySQL 基础 ————事务与隔离级别总结
  7. 【转】Sql Server 跨服务器连接
  8. bat shell 命令行中 21 的含义
  9. C++中之---数组和vector
  10. word2vec和node2vec笔记(更新ing)
  11. 文字跳跃率与图片跳跃率
  12. C语言习题:输入10个学生5门课的成绩,分别用函数求:①每个学生平均分;②每门课的平均分;③找出所有分数中最高分
  13. 笔记本linux如何降低功耗,细说如何降低笔记本电脑功耗
  14. Git 报错:The ECDSA host key for gitlab.xx.net has changed, and the key for the corresponding.......
  15. 对比了论坛,博客和微博
  16. GetKeyState()和GetAsyncKeyState()的区别
  17. 某银行大数据体系架构设计与演进
  18. 创新工程-涂鸦移动面试总结
  19. 我的毕业季:从开始工作到大学毕业
  20. 【陈工笔记】# 若干块GPU,如何进行选择?一句代码搞定 #

热门文章

  1. Vuejs——(4)v-if、v-for
  2. WebCollector
  3. 《CLR Via C# 第3版》笔记之(八) - 类型的转换构造器和方法
  4. 医学遗传学词汇英语术语英文(Glossary) 5
  5. lua 垃圾回收机制
  6. c语言 dll库是线程安全吗,vsprintf是线程安全的吗?解决思路
  7. loadrunner性能测试步骤_性能测试LoadRunner操作流程之一
  8. linux的使用 --- 安装node和express
  9. python 特别慢_Python很慢?不一定哦
  10. 向视图中插入的数据能进入到基本表中去吗?_数据库调优,调的是什么及常见手法...