前端开发设计模式——命令模式

目录

一、命令模式的定义和特点

1.定义:                

2. 特点:

二、命令模式的结构与原理

1.结构:

2.原理:

三、命令模式的实现方式

1.定义接口命令:

2.创建具体的命令类:

3.定义接收者:

4.创建调用者:

四、命令模式的使用场景

1.界面按钮的点击操作:

        1.1  定义命令接口和接收者

        1.2 创建具体命令类:

        1.3 创建调用者:

        1.4 使用示例:

2.表单提交:

3.可撤销的操作:

五、命令模式的优点

六、命令模式的缺点

七、命令模式的注意事项

1.合理设计命令对象:

2.考虑命令的撤销和重做:

3.注意命令的性能:


一、命令模式的定义和特点

1.定义:                

        在前端开发中,命令模式是一种行为设计模式,它将请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

2. 特点:

        解耦请求的发送者和接收者。发送者无需了解接收者的具体实现,只需要知道如何发送一个命令对象。

                易于实现可撤销的操作。可以通过保存命令对象的历史记录,实现撤销和重做功能。

                支持命令的排队和执行。可以将多个命令对象放入队列中,依次执行。

二、命令模式的结构与原理

1.结构:

        命令接口:定义了执行命令的方法。

        具体命令类:实现命令接口,封装了具体的请求操作。

        调用者:负责接收请求并执行相应的命令。

        接收者:执行具体的操作。

2.原理:

        调用者接收命令对象,并调用命令对象的执行方法。命令对象持有接收者的引用,并在执行方法中调用接收者的具体操作。

三、命令模式的实现方式

1.定义接口命令:

interface Command {
  execute(): void;
}

2.创建具体的命令类:

class ConcreteCommand implements Command {
  private receiver: Receiver;

  constructor(receiver: Receiver) {
    this.receiver = receiver;
  }

  execute() {
    this.receiver.action();
  }
}

3.定义接收者:

class Receiver {
  action() {
    console.log('Receiver is performing an action.');
  }
}

4.创建调用者:

class Invoker {
  private command: Command;

  setCommand(command: Command) {
    this.command = command;
  }

  executeCommand() {
    this.command.execute();
  }
}

四、命令模式的使用场景

1.界面按钮的点击操作:

        可以将按钮的点击事件封装成命令对象,当按钮被点击时,调用者执行相应的命令对象,从而实现具体的操作。

        示例:网页按钮的点击操作

        1.1  定义命令接口和接收者

                (1)命令接口:

interface Command {
  execute(): void;
}

                 这个接口定义了一个execute方法,用于执行命令。

                (2)接收者(处理具体操作的对象):

class ButtonHandler {
  clickAction() {
    console.log('Button was clicked!');
  }
}

                 这个接收者类有一个方法clickAction,用于处理按钮点击后的具体操作。

        1.2 创建具体命令类:
class ButtonClickCommand implements Command {
  private handler: ButtonHandler;

  constructor(handler: ButtonHandler) {
    this.handler = handler;
  }

  execute() {
    this.handler.clickAction();
  }
}

                这个命令类在execute方法中调用接收者的clickAction方法 。

        1.3 创建调用者:
class Invoker {
  private command: Command;

  setCommand(command: Command) {
    this.command = command;
  }

  triggerCommand() {
    this.command.execute();
  }
}

                调用者有设置命令和触发命令执行的方法。 

        1.4 使用示例:
const handler = new ButtonHandler();
const command = new ButtonClickCommand(handler);
const invoker = new Invoker();

invoker.setCommand(command);
invoker.triggerCommand();

        在这个示例中,当点击按钮时(这里模拟通过调用者触发),调用者Invoker执行命令对象ButtonClickCommand,命令对象再调用接收者ButtonHandler的方法来完成具体的操作。这样就实现了命令模式,将按钮点击操作与具体的处理逻辑解耦 

2.表单提交:

        将表单提交的操作封装成命令对象,在提交表单时,调用者执行命令对象,进行数据验证、提交等操作。

3.可撤销的操作:

        通过保存命令对象的历史记录,可以实现撤销和重做功能。

五、命令模式的优点

        1.解耦了请求的发送者和接收者,使得代码更加灵活和可维护。

        2.易于实现可撤销的操作,提高了用户体验。

        3.支持命令的排队和执行,方便进行复杂的操作控制。

六、命令模式的缺点

        1.可能会增加系统的复杂性,特别是当命令对象的数量较多时。

        2.需要额外的代码来实现命令模式,增加了开发成本。

七、命令模式的注意事项

1.合理设计命令对象:

        命令对象应该尽可能地独立和可复用,避免与特定的调用者或接收者紧密耦合。

2.考虑命令的撤销和重做:

        如果需要实现可撤销的操作,需要在命令对象中保存足够的信息,以便能够撤销和重做操作。

3.注意命令的性能:

        如果命令对象的执行时间较长,可能会影响系统的性能。可以考虑使用异步执行或者优化命令的实现

关于设计模式中的命令模式就介绍到这了,如果对于其他模式感兴趣的话,可以点击右下角的“专栏目录”查看更多设计模式。码字不易,点个赞再走吧

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL 保姆级教学】数据库的操作(3)

数据库的操作 1. 创建数据库2. 创建数据库的案例3. 字符集和校验规则3.1 查看系统默认字符集以及校验规则3.2 查看数据库支持的字符集3.3 查看数据库支持的字符集校验规则3.4 校验规则对数据库的影响 4. 操纵数据库4.1 查看数据库4.2 显示创建语句4.3 修改数据库4.4 删除数据库…

OpenCV打开摄像头或视频

文章目录 1. 视频读取流程创建视频对象设置摄像头参数循环检查是否初始化成功并读取读取视频释放摄像头删除建立的全部窗口cv2.CAP_DSHOW设置后帧率变慢的问题 2.所有python实现代码参考文献 1. 视频读取流程 创建视频对象 cap cv2.VideoCapture(videoPath) #加载视频 cap …

【风控安全产品系统架构设计的一些思考】

随着互联网的不断发展和普及,信息安全和风险控制成为了各行各业关注的焦点之一。在这样的背景下,风控安全产品成为了保障企业信息资产安全的重要手段之一。本文将探讨风控安全产品系统架构设计的一些关键思考和实践经验。 1. 深度了解业务需求 在设计…

FFmpeg的简单使用【Windows】

目录 一、视频生成图片 静态图片 转码过程 动态图片gif 二、图片生成视频 三、FFmpeg常用参数命令 3.1 主要参数 3.1.1、-i 3.1.2、-f 3.1.3、-ss 3.1.4、-t 3.2 音频参数 3.2.1、-aframes 3.2.2、 -b:a 3.2.3、-ar 3.2.4、-ac 3.2.5、-acodec 3.2.6、-an 3…

未来汽车究竟该是什么样子?

24年10月14日,在中国(深圳)机器视觉展暨机器视觉技术及工业应用研讨会上,同行者分享了未来智能座舱应该长什么样子。 受此启发,个人觉得当前大多数新能源车都极力想做出电动感,但是布局传统没跳出来&#…

【Golang】Go 语言中的 time 包详解:全面掌握时间处理与应用

在 Go 语言中,time 包提供了强大的时间处理功能,适用于各种场景:获取当前时间、格式化和解析时间、计算时间间隔、设置定时器、处理超时等。在开发过程中,熟练掌握 time 包能够帮助我们轻松处理时间相关的操作,尤其是定…

【大模型理论篇】大模型中的强化学习RLHF(PPO)、DPO(Direct Preference Optimization)等概念的理解与解析

1. “人类对齐(Human Alignment)”背景介绍 本文主要针对大模型训练过程中的PPO(Proximal Policy Optimization)、DPO(Direct Preference Optimization)等概念进行解释和分析,更确切的说是在“人类对齐(Human Alignment&#xff0…

aosp14分屏分割线区域部分深入剖析-framework实战干货

背景: 原来在学习分屏课程期间,当时没有对分屏分割线的区域部分进行详细介绍。 本篇文章就针对这个块的知识进行详细的补充讲解,首先可以通过下图所示分割线情况,这样有一个初步的认识 简单说分屏情况下分割线是可以拖拉到不同…

社交媒体对人际关系的影响:Facebook的案例分析

随着社交媒体的快速发展,人们的沟通方式和人际关系发生了深刻变化。作为全球最大的社交网络之一,Facebook在这一进程中扮演了重要角色。本文将分析Facebook如何影响人际关系,包括沟通方式的转变、情感连接的变化以及社交互动的质量。 1. 沟通…

无极低码课程【redis windows下服务注册密码修改】

下载Windows版本的Redis linux环境 (自行下载) 1.打开官网https://redis.io/downloads/ windows环境 1.打开github https://github.com/microsoftarchive/redis/releases 然后选择你喜欢的版本zip或msi下载 2.这里下载zip版,解压后后,打开安装目录 3.双击redis-server…

Xcode使用Instruments的dsym还原符号堆栈问题

文章目录 设置符号表的步骤参考资料 设置符号表的步骤 instruments 的 Settings 中,可以设置符号表的搜索路径 没有生效的话,继续看 File 里面的 Symbols - 出现弹窗后点击 Add Symbols - 然后再点击 Apply。 参考资料 https://xjkstar.github.i…

初级网络工程师之从入门到入狱(四)

本文是我在学习过程中记录学习的点点滴滴,目的是为了学完之后巩固一下顺便也和大家分享一下,日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、Wlan应用实战1.1、拓扑图详解1.2、LSW11.3、AC11.4、抓包1.5、Tunnel隧道模式解析1.6、AP、…

Flink 06 聚合操作入门学习,真不难

抛砖引玉 让你统计1小时内每种商品的销售额,用Flink 该怎么实现。 还是让你统计1小时内每种商品的销售额,但是要过滤掉退款的订单,用Flink 该怎么实现。 学了本文两个操作,不信你还不会。 AggregateFunction ❝ 通常用于对数据…

React国际化中英文切换实现

目录 概况 安装 文件结构 引入 使用 正常使用 传参使用 概况 react-intl-universal 是一个国际化库,专门为 React 应用提供多语言支持。与 React 原生的 react-intl 相比,react-intl-universal 支持从远程服务器加载语言包,动态切换语…

【Python】selenium遇到“InvalidArgumentException”的解决方法

在使用try……except 的时候捕获到这个错误: InvalidArgumentException: invalid argument (Session info: chrome112.0.5614.0) 这个错误代表的是,当传入的参数不符合期望时,就会抛出这个异常: InvalidArgumentException: invali…

【MySQL 保姆级教学】在Linux(CentoS 7)中安装MySQL(1)

目录 1. 卸载linux(Centos7) 中不要的环境2. 获取MySQL官方yum源2.1 获取yum源前先查看自己 linux(Centos)的版本2.2 获取官方yum源 3. 安装xftp和连接4. 开放连接端口5. 上传文件到Centos76. 安装MySQL6.1 顺利安装6.2 查询是否安…

QGraphics类型学习使用【Qt】【C++】

QGraphics类型学习使用 需求过程全部完整代码 首先已知,QGraphicsView,QGraphicsScene, QGraphicsItem,分别称为:视图,场景,图元,图表就是各种各样的元素,图片元素,线条元…

Unity Apple Vision Pro 开发:Metal 渲染模式开启透视遇到背景黑屏的解决方法

XR 开发者社区链接: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 以下步骤适用于 PolySpatial 2.0 及以上的版本。 我们可以在 Project Settings 中的 Apple visionOS 里将 App Mode 设为 Metal Rendering with Composit…

【C语言】分支结构switch

switch分支语句 多适用于明确表达式结果的情况&#xff0c;多个分支&#xff0c;用if过于繁琐。 case后跟具体的表达式值&#xff0c;break&#xff1b;跳出分支语句。 #include <stdio.h> #include <math.h> /* 功能&#xff1a;选择结构&#xff08;switch&…

Flink CDC同步mysql数据到doris

前置参考 flink快速安装&#xff1a;Flink入门-CSDN博客 doris快速安装&#xff1a;Apache Doris快速安装-CSDN博客 Flink CDC简介 Flink CDC 是一个基于流的数据集成工具&#xff0c;旨在为用户提供一套功能更加全面的编程接口&#xff08;API&#xff09;。 该工具使得用户能…