前端设计模式之旅:命令模式

news2024/11/24 15:35:42

在这里插入图片描述

引言

使用命令模式,我们可以将执行特定任务的对象与调用该方法的对象解耦。

核心思想

命令模式的核心思想是将请求封装成一个对象,从而使请求的发起者和请求的执行者解耦。

这样,请求的发起者只需要知道如何创建命令对象并将其传递给请求者,而不需要知道命令对象的具体实现细节。

  • 命令模式还支持可撤销操作,因为命令对象可以保存执行前的状态,并在需要时恢复状态。这样,可以通过撤销命令对象来撤销之前的操作。

适用场景

  1. 需要将请求发送者和接收者解耦的场景

命令模式可以将请求封装成对象,从而使得请求的发送者和接收者之间解耦,使得系统更加灵活。

  1. 需要支持撤销和重做操作的场景

命令模式可以将请求封装成对象,并提供撤销和重做操作,从而使得系统更加灵活和可靠。

  1. 需要支持事务操作的场景

命令模式可以将多个请求封装成一个事务,从而保证事务的原子性和一致性。

  1. 需要支持日志和审计功能的场景

命令模式可以将请求封装成对象,并记录请求的执行情况,从而支持日志和审计功能。

  1. 需要支持队列请求的场景

命令模式可以将请求封装成对象,并将请求放入队列中,从而支持队列请求的场景。

案例实践

假设我们有一个简单的计算器,它可以执行加、减、乘、除四种操作。

我们可以使用命令模式来实现这个计算器,将每个操作封装成一个命令对象,然后将命令对象传递给计算器,从而实现不同的操作。

  • 首先,我们定义一个命令接口,它包含一个execute方法:
class Command {
  execute() {}
}
  • 然后,我们定义四个具体的命令类,分别对应加、减、乘、除四种操作:
class AddCommand extends Command {
  constructor(receiver, value) {
    super();
    this.receiver = receiver;
    this.value = value;
  }

  execute() {
    this.receiver.add(this.value);
  }
}

class SubCommand extends Command {
  constructor(receiver, value) {
    super();
    this.receiver = receiver;
    this.value = value;
  }

  execute() {
    this.receiver.sub(this.value);
  }
}

class MulCommand extends Command {
  constructor(receiver, value) {
    super();
    this.receiver = receiver;
    this.value = value;
  }

  execute() {
    this.receiver.mul(this.value);
  }
}

class DivCommand extends Command {
  constructor(receiver, value) {
    super();
    this.receiver = receiver;
    this.value = value;
  }

  execute() {
    this.receiver.div(this.value);
  }
}

其中,每个命令类都包含一个接收者对象和一个操作值,execute方法会调用接收者对象的相应方法来执行操作。

  • 最后,我们定义一个计算器类,它包含一个命令队列和一个执行命令的方法:
class Calculator {
  constructor() {
    this.commands = [];
    this.current = 0;
  }

  addCommand(command) {
    this.commands.push(command);
  }

  executeCommand() {
    this.commands[this.current].execute();
    this.current++;
  }

  undo() {
    this.commands[this.current - 1].execute();
    this.current--;
  }

  redo() {
    this.commands[this.current].execute();
    this.current++;
  }
}

其中,addCommand方法用于将命令对象添加到命令队列中,executeCommand方法用于执行当前命令,undo方法用于撤销上一个命令,redo方法用于重做上一个命令。

  • 使用这些类来实现一个简单的计算器:
const calculator = new Calculator();
const receiver = {
  value: 0,
  add: function (value) {
    this.value += value;
    console.log(`Add ${value}, result: ${this.value}`);
  },
  sub: function (value) {
    this.value -= value;
    console.log(`Sub ${value}, result: ${this.value}`);
  },
  mul: function (value) {
    this.value *= value;
    console.log(`Mul ${value}, result: ${this.value}`);
  },
  div: function (value) {
    this.value /= value;
    console.log(`Div ${value}, result: ${this.value}`);
  },
};

const addCommand = new AddCommand(receiver, 10);
const subCommand = new SubCommand(receiver, 5);
const mulCommand = new MulCommand(receiver, 2);
const divCommand = new DivCommand(receiver, 4);

calculator.addCommand(addCommand);
calculator.addCommand(subCommand);
calculator.addCommand(mulCommand);
calculator.addCommand(divCommand);

calculator.executeCommand(); // Add 10, result: 10
calculator.executeCommand(); // Sub 5, result: 5
calculator.executeCommand(); // Mul 2, result: 10
calculator.executeCommand(); // Div 4, result: 2.5

calculator.undo(); // Div 4, result: 10
calculator.undo(); // Mul 2, result: 20
calculator.undo(); // Sub 5, result: 25
calculator.undo(); // Add 10, result: 35

calculator.redo(); // Add 10, result: 10
calculator.redo(); // Sub 5, result: 5
calculator.redo(); // Mul 2, result: 10
calculator.redo(); // Div 4, result: 2.5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1306768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM架构的超市管理系统设计

基于SSM架构的超市管理系统设计 目录 基于SSM架构的超市管理系统设计 1 环境及工具1.1 IDEA软件安装1.2 JDK环境配置1.3 MySQL数据库安装1.3.1常规情况1.3.2非常规情况 1.4 Tomcat安装 2 部署与设计2.1 数据库信息创建2.2项目创建与部署 3 相关说明4 功能操作说明4.1 管理员操作…

ORA-600 [2662] “Block SCN is ahead of Current SCN“

ORA-600 [2662] "Block SCN is ahead of Current SCN" (Doc ID 28929.1)​编辑To Bottom Note: For additional ORA-600 related information please read Note:146580.1PURPOSE: This article discusses the internal error "ORA-600 [2662]"…

基于Java技术的会员制度管理的商品营销系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本商品营销系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

anolisos8.8安装显卡+CUDA工具+容器运行时支持(containerd/docker)+k8s部署GPU插件

anolisos8.8安装显卡及cuda工具 一、目录 1、测试环境 2、安装显卡驱动 3、安装cuda工具 4、配置容器运行时 5、K8S集群安装nvidia插件 二、测试环境 操作系统:Anolis OS 8.8 内核版本:5.10.134-13.an8.x86_64 显卡安装版本:525.147.05 c…

生物芯片市场分析:预计2029年将达到180亿美元

生物芯片(biochip或bioarray)是根据生物分子间特异相互作用的原理,将生化分析过程集成于芯片表面,从而实现对DNA、RNA、多肽、蛋白质以及其他生物成分的高通量快速检测。狭义的生物芯片概念是指通过不同方法将生物分子(寡核苷酸、cDNA、genomic DNA、多肽…

修改Docker0和容器的地址

修改Docker0和容器的地址 1. 需求 默认服务器安装完Docker-ce后会给docker0分配172.17.0.1/16地址. 公司新接入一个网段正好与172.17.0.1/16冲突,此时访问这台服务器的容器时就会发生网络不可达. 2. 解决方法 修改/etc/docker/daemon.json 加入一个自定义网段 vim /etc/d…

SpringBoot学习(一)——Maven安装

SpringBoot学习(一)——Maven安装 下载安装 Maven的下载页面:https://maven.apache.org/download.cgi SpringBoot学习(一)——Maven安装 下载安装 Maven的下载页面:https://maven.apache.org/download…

戏曲教育数字化思维?搜维尔科技助推中国戏曲数字人产业发展!

一场关于中国传统戏曲与数字媒体交汇的探讨之旅将于上周六完结,讲座活动旨在推动AI时代大背景下,利用元宇宙、数字人等创新技术焕发中国传统戏曲全新活力,我司做为校企合作优秀单位,受到王教授邀请,一同见证了中国戏曲…

解决 php 连接mysql数据库时报错:Fatal error: Class ‘mysqli’ not found in问题【更新23.12.12】

在使用php对mysql进行连接的过程中,出现了Fatal error: Uncaught Error: Class "mysqli" not found in的问题 解决方案 这个错误通常表示您的PHP代码中缺少MySQL扩展或者没有启用MySQL扩展。 我们首先确认一下PHP环境中已经安装了MySQL扩展。检查一下自己…

3分钟,掌握“曲面屏显示屏”

在3分钟内掌握“曲面屏显示屏”的概念和特点,可以按照以下步骤进行: 一、了解曲面屏显示屏的基本概念 曲面屏显示屏是一种采用柔性塑料的显示屏,主要通过OLED面板来实现。相比直面屏幕,曲面屏幕弹性更好,不易破碎。此外…

​Linux系列之yum安装​

yum是Linux系统的安装必备神器,简直不要太方便。但是新系统一般是不自带yum工具的,所以需要手动安装一下。 环境:Ubuntu sudo apt-get install yumsudo apt-get install rpm 环境:centos7 新建一个目录用来保存yum安装包 mk…

这个补丁摞补丁的RPC漏洞到底是怎么回事?

前段时间,微软Windows系统曝出的远程过程调用(RPC)漏洞可谓影响深远,Windows 7与后续的Windows客户端系统,以及Windows Server 2008与后续的Windows服务器系统均被波及。 但在微软发布补丁后,Akamai安全研…

uview1 的u-tabs组件在微信小程序中会出现横向滚动条

uview1 的u-tabs组件在微信小程序中会出现横向滚动条,真机才会生效,微信开发者工具没问题包括官方示例也会 原因:未屏蔽微信小程序的滚动条 解决办法:uview-ui中uview-ui/components/u-tabs/u-tabs.vue文件把h5屏蔽滚动条的条件编…

JVM虚拟机系统性学习-对象的创建流程及对象的访问定位

对象的创建流程与内存分配 对象创建流程如下: Java 中新创建的对象如何分配空间呢? new 的对象先放 Eden 区(如果是大对象,直接放入老年代)当 Eden 区满了之后,程序还需要创建对象,则垃圾回收…

处理获取当前日期---------------年月日//时分秒

当前时间,先分组匹配,以数组下标索引匹配定义的汉字进行替换 处理日期方法 /* 日期格式化 */ const formatTime function formatTime(time, template) {if (typeof time ! "string") {time new Date().toLocaleString(zh-CN, { hour12: fal…

TLF35584 ERR PIN监测功能_实测篇

1 硬件设计 2 配置 1)PMIC_ERR - P11.2:配置输出PWM。 2)GTM定时器通道、时钟频率。 TOM0_8。50M。2^12分频(FXCLK3)。3 软件逻辑 初始化MCU的PMIC_ERR默认输出40KHz占空比50%的PWM。TLF35584初始化时,关闭窗口看门狗并默认开始错误监测功能。计时30S,30S后输出PWM占…

【JavaScript】JavaScript中的GC算法

1、内存管理 内存:由可读写单元组成,标识一片可操作的空间 管理: 认为的去操作一篇空间的申请、使用和释放 内存管理:开发者主动申请空间、使用空间、释放空间 管理流程: 申请-使用-释放 // 申请 let obj {} //使…

【docker四】使用Docker-compose一键部署Wordpress平台

目录 一、YAML 文件格式及编写注意事项(重要) 1、yaml文件使用时注意事项: 2、yaml文件的基本数据结构: 2.1、声明变量(标量。是单个的不可再分的值,类型:字符串,整数&#xff0c…

安全算法(一):安全技术、加密的基础知识、哈希函数的简单介绍

安全算法(一):安全技术、加密的基础知识、哈希函数的简单介绍 通过互联网交换数据时,数据要经过各种各样的网络和设备才能传到对方那里。数据在传输过程中有可能会经过某些恶意用户的设备,从而导致内容被盗取。 因此…

概率的乘法公式

两个事件的情况 假设A、B为随机事件,并且事件A的概率,那么 三个事件的情况 假设A、B、C为随机事件,并且,那么 多个事件的情况 假设为随机事件,其中,并且,那么