设计模式: 行为型之命令模式(17)

C++设计模式14:命令模式 命令模式(Command)是一种行为型设计模式,它将请求封装成一个对象,从而允许您将不同的请求参数化,并将客户端代码与具体的请求解耦。这种模式的核心思想是将请求的发送者和接收者分离,从而使它们可以独立地变化。在命令模式中,有四个主要的角色:命令接口、具体命令、调用者和接收者。命令接口定义了所有具体命令都必须实现的方法,而具体命令则实现了这些方法,并将一个接收者对象绑定到了自己身上。调用者对象负责将具体命令对象传递给接收者对象,并在需要的时候调用具体命令对象的方法。接收者对象则执行具体命令对象所定义的操作。 阅读详情

命令模式

  • 命令模式(Command Pattern)是一种行为设计模式,它将一个请求封装为一个对象,从而使你可用不同的请求把客户端与接受请求的对象解耦
  • 命令模式允许你将请求排队,记录请求的历史,并可撤销和重做请求
  • 实现命令模式通常涉及以下几个组件:
    • 命令接口 (Command): 定义一个执行操作的接口
    • 具体命令类 (ConcreteCommand): 实现命令接口,绑定一个接收者对象,并定义了一个执行操作的 execute 方法
    • 接收者 (Receiver): 知道如何执行与请求相关的操作。任何类都可能作为一个接收者
    • 调用者 (Invoker): 要求命令执行请求,持有命令对象。这个对象知道如何执行命令,但不知道具体命令是什么
    • 客户端 (Client): 创建具体的命令对象,并设置其接收者

命令模式应用

// 1. 定义命令接口
interface Command {
  execute(): void;
  undo(): void;
}

// 2. 定义接收者接口或类,即命令执行的目标
interface Receiver {
  action(): void;
}

// 3. 创建具体的接收者类
class ConcreteReceiver implements Receiver {
  action(): void {
    console.log("Action performed by ConcreteReceiver");
  }
}

// 4. 创建具体的命令类,该类持有接收者并对接收者的方法进行调用
class ConcreteCommand implements Command {
  private receiver: Receiver;

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

  execute(): void {
    this.receiver.action();
    console.log("ConcreteCommand executed.");
  }

  undo(): void {
    console.log("ConcreteCommand undone.");
    // 在实际情况中,这里应该实现回滚操作
  }
}

// 5. 创建Invoker类,负责调用命令对象的execute和undo方法
class Invoker {
  private commands: Command[] = [];

  public takeCommand(command: Command): void {
    this.commands.push(command);
  }

  public placeCommands(): void {
    this.commands.forEach(command => command.execute());
  }

  public undoCommands(): void {
    this.commands.reverse().forEach(command => command.undo());
  }
}

// 使用示例
function main() {
  const receiver = new ConcreteReceiver();
  const command = new ConcreteCommand(receiver);

  const invoker = new Invoker();
  invoker.takeCommand(command);

  invoker.placeCommands(); // 输出:"Action performed by ConcreteReceiver" 和 "ConcreteCommand executed."
  invoker.undoCommands(); // 输出:"ConcreteCommand undone."
}

main();
  • 在这个例子中:Command 接口定义了所有命令必须实现的 execute 和 undo 方法
  • Receiver 接口定义了接收者对象应具有的动作方法
  • ConcreteCommand 类实现了 Command 接口,并持有一个 Receiver 对象
  • 当 execute 方法被调用时,它会调用接收者的 action 方法
  • Invoker 类负责持有命令列表,并提供了执行命令(placeCommands)和撤销命令(undoCommands)的方法
  • 在 main 函数中,创建了一个具体的接收者、命令和调用者,并将命令交给调用者,随后执行和撤销命令

命令模式优缺点


1 )优点

  • 降低耦合度:命令模式使得请求发送者与请求接收者解耦,请求发送者只需知道如何发送请求,而无需了解请求的具体实现。这降低了两者之间的耦合度,使得系统更加灵活和可维护

  • 支持扩展:由于命令对象相对独立,增加新的命令比较容易,只需实现新的命令类即可,符合开闭原则

  • 支持撤销和重做:命令模式可以方便地实现请求的撤销与重做,只需将命令对象保存到历史记录中,然后按需执行撤销或重做操作

  • 实现请求排队和日志记录:可以将命令对象放入队列中,以实现请求的排队执行;同时,命令对象也可以方便地用于记录日志信息

  • 简化客户端操作:客户端无需了解复杂的业务逻辑,只需调用命令对象的执行方法即可,降低了客户端的复杂性

  • 方便实现宏命令:命令模式支持命令的组合,即多个命令可以组合成一个复合命令,从而一次性执行多个操作

  • 易于单元测试:每个命令可以独立进行单元测试,因为它们有自己的接口和实现

2 ) 缺点

  • 可能导致系统有过多的具体命令类:如果系统中存在大量的请求类型,那么就需要创建大量的具体命令类,这可能会导致系统变得庞大和复杂

  • 可能会增加系统复杂性:引入命令模式可能会增加系统的类和对象的数量,使得系统变得更加复杂。这需要在设计时权衡命令模式带来的好处和增加的复杂性

  • 可能导致请求处理时间变长:由于命令模式引入了额外的命令对象,可能会导致请求处理的时间变长。尤其是在处理大量请求时,这可能会成为性能瓶颈

  • 过度设计:对于简单的操作,使用命令模式可能会显得过于复杂,不必要地增加了系统的复杂性和设计难度

  • 资源消耗:如果命令对象需要持久化以便撤销或重新执行,可能占用额外的存储空间

  • 命令间的通信和协调:当命令之间存在复杂的依赖关系或需要进行通信时,设计和实现会变得更加复杂

  • 不适合实时系统:如果命令的执行速度至关重要,命令模式的间接调用机制可能会引入额外的性能开销

3 ) 总结

  • 综上所述,命令模式在降低耦合度、支持扩展、实现撤销和重做等方面具有显著优点,但也需要注意其可能带来的系统复杂性和性能问题
  • 在使用时,应根据具体场景和需求进行权衡和选择
【软工方法论17】行为型设计模式命令模式全解析 摘要 命令模式是一种行为型设计模式,用于解耦请求发送者和执行者。它将请求封装为独立的对象,支持参数化、队列化、日志记录和撤销操作。以遥控器控制电视为例,传统紧耦合方式存在扩展性差的问题。命令模式通过定义Command接口、具体命令类(如TVOnCommand)和调用者(RemoteController)实现解耦,还能通过命令历史栈支持撤销/重做功能。该模式包含客户端、命令接口、具体命令、调用者和接收者五个角色,适用于需要支持事务、任务队列或操作回滚的场景。进阶应用可结合备忘录模式实现更复杂的撤销机制。 阅读详情

相关推荐

【简易设计模式17】命令模式

总第69篇我们在饭店点餐时,只要想好自己要吃什么,直接告诉服务员,过一会儿就可以吃饭了,不用管厨师是如何做的,这种我们只要发送指令就能完成想要的任务的模式,在程序中称为命令模式。本篇将详细梳理设计模式中的命令模式。1.命令模式的概念命令模式是一个高内聚的模式,它是将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或记录请求日志,可以提供命令的撤销和恢复功能。命令模式最大的特...

实战开发者Airex 187

设计模式:命令模式

命令模式(Command Pattern)是一种行为设计模式,它将请求封装成对象,以便参数化对象、延迟执行、记录请求日志、支持可撤销操作等。此模式基于“行动请求者”与“行动执行者”之间解耦的设计思想,使得请求的发送者和接收者之间没有直接的联系,通过命令对象作为中介,这样两者可以独立变化,提高系统的灵活性和可扩展性。

K___End的博客 1065

从零构建:用Arduino和MCP2515模块搭建你的第一个CAN Bus网络

本文详细介绍了如何使用Arduino和MCP2515模块从零搭建CAN Bus网络,实现温湿度数据的传输与显示。涵盖硬件连接、软件配置、发送端与接收端代码实现,以及系统调试和进阶应用,帮助初学者快速掌握CAN总线通信技术。

d6e7f8的博客 834

命令模式,

命令模式和桥接模式虽然有一些相似之处(如解耦),但它们的设计目标和应用场景是不同的。命令模式关注请求的封装和解耦,而桥接模式关注抽象和实现的分离。因此,命令模式并不“用到了”桥接模式,而是各自解决不同的问题。

qq_41577703的博客 895

5分钟搞定阿里云千问大模型API申请:手把手教你获取API Key

本文提供了一份高效的阿里云通义千问大模型API Key获取实战指南。通过清晰的步骤,帮助开发者在五分钟内完成从账号准备、精准导航控制台到创建并验证API Key的全过程,并强调了密钥安全管理和基础调用测试的重要性,助力快速集成AI能力。

ol789012345的博客 1359

FPGA实战:手把手教你用Verilog驱动4.3寸RGB触摸屏(附完整代码)

本文详细介绍了如何使用Verilog语言在FPGA上驱动4.3寸RGB触摸屏,包括时序设计、信号交互原理及完整代码实现。通过双计数器引擎设计和参数化模块,开发者可以高效构建800*480分辨率的显示驱动,并解决工程实践中的信号完整性和时序收敛问题。

rice5的博客 706

设计模式之命令模式

什么是命令模式 命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。 使用场景 命令这个词很容易让我们想到计算机的命令,用户输入命令,交给计算机去执行,此时用户就是调用命令的人(调用者),计算机就是执行者。但是如果用户想输入一个命令就可以同时操控Windows和Linux都关机,应该怎么办呢?此

Attitude_do_it的博客 773

告别硬编码!用Aviator 5.3.3实现动态规则引擎,Spring Boot项目实战教程

本文详细介绍了如何使用Aviator 5.3.3在Spring Boot项目中实现动态规则引擎,告别硬编码。通过Maven依赖集成、规则模型设计、规则执行引擎实现及电商促销系统实战案例,展示了Aviator在动态规则配置中的高效应用,提升业务灵活性和开发效率。

weixin_30329623的博客 446

请求发送者与接收者解耦——命令模式(一)

装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关闭,例如电灯或者排气扇。在购买开关时,我们并不知道它将来到底用于控制什么电器,也就是说,开关与电灯、排气扇并无直接关系,一个开关在安装之后可能用来控制电灯,也可能用来控制排气扇或者其他电器设备。开关与电器之间通过电线建立连接,如果开关打开,则电线通电,电器工作;反之,开关关闭,电线断电,电器停止工作。相同的开关可以通过不

刘伟技术博客 3万+

Unity 实战项目 ☀️| 只用一个脚本做一个 刮刮乐 案例,一不小心刮出来一个女朋友!【学习娱乐一下】

只用一个脚本做一个刮刮乐,一不小心刮出来一个女朋友!【学习娱乐一下!】

努力前行,总会成为自己心中的那道光 23万+

【推荐100个unity插件】Animator 的替代品?—— Animancer Pro插件的使用介绍

Animancer与Unity Animator对比及使用指南 摘要: 本文对比了Animancer与Unity官方Animator的核心差异,分析了Animancer的优势特点。Animancer采用代码驱动模式,相比Animator的状态机系统更灵活高效,支持实时调试、动态混合和深度逻辑集成。文章详细介绍了Animancer的快速使用方法,包括动画播放、切换和触发机制,并区分了免费版与专业版的功能差异。适合需要高效动画开发、复杂交互逻辑的中小项目,为开发者提供了一种现代化的动画解决方案。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2435

请求发送者与接收者解耦——命令模式(二)

3 完整解决方案 为了降低功能键与功能处理类之间的耦合度,让用户可以自定义每一个功能键的功能,Sunny软件公司开发人员使用命令模式来设计“自定义功能键”模块,其核心结构如图4所示: 图4 自定义功能键核心结构图 在图4中,FBSettingWindow是“功能键设置”界面类,FunctionButton充当请求调用者,Command充当抽象命令类,MinimizeCommand和Help...

runfeel 330

Python库CloudScraper详细使用(绕过 Cloudflare 的反机器人页面的 Python 模块)

CloudScraper是一个专门用于绕过Cloudflare反机器人保护的Python库,它基于requests库构建,能够处理Cloudflare的5秒盾、WAF和人机验证等防护机制。

数据知道的博客 1万+

设计模式(17)行为型模式 - 命令模式

前言 行为型设计模式

key_768的博客 334

更新|芒果YOLOv8改进182:注意力机制MLLA:即插即用|融合 Mamba 设计精髓的线性注意力视觉Transformer

芒果YOLOv8改进:即插即用,最新注意力机制MLLA:融合 Mamba 设计精髓的线性注意力视觉Transformer

包括YOLOv5、YOLOv7、YOLOv8等模型改进 867

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

软件设计模式——命令模式

一、定义 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 二、作用 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行...

JingHaiRoad Coder 451

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【c++设计模式17】行为模式2:命令模式(Command Pattern)

命令模式定义了一个抽象命令(Command)接口和具体命令(Concrete Command)类,每个具体命令类都实现了抽象命令接口。命令对象包含了执行操作的方法,将请求的发送者(Invoker)和接收者(Receiver)解耦,使得请求的发送者不需要知道请求的处理细节。请求的发送者只需要通过调用命令对象的执行方法来触发请求的处理。

junxuezheng的博客 1075

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JAVA设计模式之命令模式

转自http://www.kongzid.com/archives/design17,命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。其别名为动作(Action)模式或事务(Transaction)模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。(将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。) 命令...

孔子说 3455

基于odoo17的设计模式详解---命令模式

Odoo框架巧妙运用命令模式实现用户交互与业务逻辑的解耦。在Odoo中,按钮点击(客户端)通过RPC调用(调用者)触发后端方法(接收者),形成一个完整的命令模式实现。服务器动作(ir.actions.server)则将命令对象化,实现操作的可配置与复用。这种设计使Odoo具备高度灵活性,支持UI与逻辑的分离,便于扩展和维护。命令模式是Odoo架构的重要支柱,开发者掌握这一模式能更好地设计模块化系统,充分利用框架的自动化能力。

weixin_44247470的博客 1201

C++ 设计模式之命令模式

命令模式同样有着很多现实场景的应用,⽐如Git中的很多操作,如提交(commit)、合并(merge)等,都可以看作是命令模式的应⽤,用户通过执⾏相应的命令来操作版本库。例如,每个按钮都有⼀个关联的 Action ,它代表⼀个命令,按钮的点击触发 Action 的执⾏。举个现实中的应⽤场景,遥控器可以控制不同的设备,在命令模式中,可以假定每个按钮都是⼀个命令对象,包含执⾏特定操作的命令,不同设备对同⼀命令的具体操作也不同,这样就可以⽅便的添加设备和命令对象。等情况下,都是⼀个有效的设计模式。

K1_uestc的博客 1957

设计模式15——行为型模式之命令模式

定义:命令模式(Command Pattern),将一个请求封闭成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排除或记录请求日志,以及支持可撤销的操作。 类型:行为型模式。 概述:           命令模式,被《Head First设计模式》列为常见的设计模式之一,而且光看类图,感觉很简单。可是真正要去运用的时候,往往会发现无从下手。因为你不知道什么时候该使用命令模式。任何关

飞鹤的程序员人生 1306

如何让孩子爱上设计模式 ——17.命令模式(Command Pattern)

如何让孩子爱上设计模式 ——17.命令模式(Command Pattern)标签: 设计模式初涉描述性文字本节讲解的是行为型设计模式种的:命令模式,该模式非常简单, 就是用于行为请求者与行为实现者的解耦,举个简单的例子, 摆地摊与开店的流程:(例子参考自大话设计模式)摆地摊: 顾客 –点餐-> 老板 –收到点餐指令-> 制作菜肴 写成代码的话:就是顾客中持有对老板的引用,然后执行指令的时候

Coder-Pig的猪栏 17万+

DesignPattern_命令模式_09

文章目录命令模式定义命令模式优点代码实现基础实现命令模式 命令模式 学习自 《设计模式之禅(第二版)》 定义 Encapsulate a request as an object,therebyletting you parameterize clients with different requests,queue or log requests,and support undoableoperations. 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以

qq_38438909的博客 136

【设计模式】17-命令模式

目录 什么是命令模式 为什么要用命令模式 命令模式组成 什么是命令模式 命令模式是解除‘行为请求者’和'行为执行者'之间紧耦合的一种设计模式。将请求包裹成对象执行调用,被调用对象根据具体命令寻找具体执行者执行相应命令,并返回执行结果。 为什么要用命令模式 在很多情况下执行的请求和执行对象直接存在紧耦合关系,执行请求者必须深入执行者内部,从而在应对需求的变更时显得更加困难。...

tingfeng6623的专栏 121

[设计模式笔记]快速小结(三)---行为型模式1

三. 行为行模式 14. Chain Of Responsibility(职责链模式) 意图: 使多个对象都有机会处理请求, 从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链, 并沿着这条链传递该请求, 直到有一个对象处理它为止. 结构: 图16 说明: 有多少开端, 就有多少条责任链. http://blog.youkuaiyun.com/bagboy_taob

cay22的专栏 1483

【十三】Java设计模式GOF23之命令模式(例子ThreadPoolExecutor类)

一、简介 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 JDK的java.util.concurrent包的ThreadPoolExecutor类就用到命令模式。 二、简易命令模式组成 1.Command(抽象命令类): ...

Sid小杰的博客 576
上一篇: 设计模式: 行为型之策略模式(16)
下一篇: 设计模式: 行为型之中介者模式(18)
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值