小谈设计模式(24)—命令模式 心已赠人 2024-02-23 02:27 19阅读 0赞 #### 小谈设计模式(24)—命令模式 #### * 专栏介绍 * * 专栏地址 * 专栏介绍 * 命令模式 * * 角色分析 * * 命令(Command) * 具体命令(ConcreteCommand) * 接收者(Receiver) * 调用者(Invoker) * 客户端(Client) * 工作流程 * * 1 * 2 * 3 * Java程序实现 * * 分析 * 输出结果 * 优缺点分析 * * 优点 * * 解耦调用者和接收者 * 支持请求的排队和记录 * 支持撤销操作 * 可扩展性强 * 缺点 * * 类的数量增加 * 命令的执行效率 * 可能引入额外的复杂性 * 总结 ## 专栏介绍 ## ### 专栏地址 ### http://t.csdnimg.cn/VpriY ### 专栏介绍 ### 主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。 ![在这里插入图片描述][b140c105d58b49b6ae3fdeea7d9a60cc.png] ## 命令模式 ## 命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使得可以用不同的请求对客户进行参数化,同时支持请求的排队、记录请求日志、撤销操作等 ![在这里插入图片描述][732740759c9c4942846329c31f7078b5.png] ### 角色分析 ### #### 命令(Command) #### 定义了执行操作的接口,通常包含一个execute()方法,用于执行相关操作。 #### 具体命令(ConcreteCommand) #### 实现了命令接口,具体定义了执行操作的具体逻辑。 #### 接收者(Receiver) #### 执行命令所要求的操作,是具体命令对象的业务处理对象。 #### 调用者(Invoker) #### 负责调用命令对象执行请求,通常会持有命令对象的引用。 #### 客户端(Client) #### 创建具体命令对象,并设置命令对象的接收者。 ![在这里插入图片描述][682fd1b142d4472da13b916e7d43eb87.png] ### 工作流程 ### #### 1 #### 客户端创建具体命令对象,并设置命令对象的接收者。 #### 2 #### 调用者持有具体命令对象的引用,并调用命令对象的execute()方法。 #### 3 #### 具体命令对象执行相关操作,并将请求传递给接收者进行处理。 ![在这里插入图片描述][39664ed3ee724fe9beacbb4c471e52dd.png] ### Java程序实现 ### // 定义命令接口 public interface Command { void execute(); } // 定义具体命令类 public class ConcreteCommand implements Command { private Receiver receiver; public ConcreteCommand(Receiver receiver) { this.receiver = receiver; } public void execute() { receiver.action(); } } // 定义接收者类 public class Receiver { public void action() { System.out.println("接收者执行操作"); } } // 定义调用者类 public class Invoker { private Command command; public void setCommand(Command command) { this.command = command; } public void executeCommand() { command.execute(); } } // 客户端代码 public class Client { public static void main(String[] args) { // 创建接收者对象 Receiver receiver = new Receiver(); // 创建具体命令对象,并传入接收者对象 Command command = new ConcreteCommand(receiver); // 创建调用者对象,并设置具体命令对象 Invoker invoker = new Invoker(); invoker.setCommand(command); // 调用者执行命令 invoker.executeCommand(); } } ![在这里插入图片描述][d7700fda369c4388a26020e0d8fc77dd.png] #### 分析 #### 在上面的示例中,定义了一个命令接口 Command,具体命令类 ConcreteCommand 实现了该接口,并在 execute() 方法中调用接收者对象的操作方法。 接收者类 Receiver 定义了具体的操作方法 action()。 调用者类 Invoker 持有一个命令对象,并提供了 setCommand() 方法来设置具体的命令对象,以及 executeCommand() 方法来执行命令。 在客户端代码中,创建了接收者对象、具体命令对象和调用者对象,并设置具体命令对象到调用者对象中,最后调用调用者对象的 executeCommand() 方法来执行命令。 #### 输出结果 #### ··· 接收者执行操作 ··· ### 优缺点分析 ### #### 优点 #### ##### 解耦调用者和接收者 ##### 命令模式将请求封装成一个对象,使得调用者不需要知道接收者的具体实现,只需要通过命令对象来执行请求。这样可以降低调用者和接收者之间的耦合度,提高系统的灵活性和可维护性。 ##### 支持请求的排队和记录 ##### 命令模式可以将多个命令对象放入队列中,按照一定的顺序执行。这样可以实现请求的排队和调度,也可以记录请求日志,方便后续操作和追踪。 ##### 支持撤销操作 ##### 命令模式可以保存命令对象的状态,从而支持撤销操作。通过保存命令对象的历史状态,可以实现撤销和恢复操作,提供更好的用户体验。 ##### 可扩展性强 ##### 命令模式可以通过新增具体命令类来扩展系统的功能,而不需要修改现有的代码。这样可以保持系统的稳定性,同时也方便了系统的维护和升级。 #### 缺点 #### ##### 类的数量增加 ##### 引入命令模式会增加系统中的类的数量,每个具体命令类都需要实现命令接口。这样可能会增加系统的复杂性,降低代码的可读性。 ##### 命令的执行效率 ##### 由于命令模式需要将请求封装成对象,并通过调用者来执行,因此相比直接调用接收者的方法,命令模式的执行效率可能会稍低。 ##### 可能引入额外的复杂性 ##### 命令模式需要设计和管理命令对象、调用者、接收者等多个角色,可能会引入额外的复杂性。尤其是在处理多个命令对象之间的协作和交互时,需要仔细设计和管理。 #### 总结 #### 命令模式在需要将请求封装成对象、支持请求的排队、记录请求日志、撤销操作等场景下非常有用。但在一些简单的场景下,引入命令模式可能会增加系统的复杂性,需要权衡使用。 ![在这里插入图片描述][cb21d4a2491b47afade53d6115f78970.png] 我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite\_code=23dxmu32qt8gs [b140c105d58b49b6ae3fdeea7d9a60cc.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/02/23/e63597db78e14f36a46b6e15db68ee4b.png [732740759c9c4942846329c31f7078b5.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/02/23/259aad7e08f1405485ede1be90863566.png [682fd1b142d4472da13b916e7d43eb87.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/02/23/2a71600564e44c5bb1d81d545d5ec414.png [39664ed3ee724fe9beacbb4c471e52dd.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/02/23/ea439bea62d44735b302036c0ec1b075.png [d7700fda369c4388a26020e0d8fc77dd.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/02/23/8a0e711120284f64a19c28f3e01765e8.png [cb21d4a2491b47afade53d6115f78970.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/02/23/ebef6daeeb164dd3b265197c8a5cbf2a.png
相关 小谈设计模式(24)—命令模式 小谈设计模式(24)—命令模式 专栏介绍 专栏地址 专栏介绍 命令模式 角色分析 命令(Comman 心已赠人/ 2024年02月23日 02:27/ 0 赞/ 20 阅读
相关 小谈设计模式(20)—组合模式 小谈设计模式(20)—组合模式 专栏介绍 专栏地址 专栏介绍 组合模式 对象类型 叶节点 ╰半夏微凉°/ 2023年10月16日 17:57/ 0 赞/ 21 阅读
相关 小谈设计模式(19)—备忘录模式 小谈设计模式(19)—备忘录模式 专栏介绍 专栏地址 专栏介绍 备忘录模式 主要角色 发起人(Ori 「爱情、让人受尽委屈。」/ 2023年10月16日 17:47/ 0 赞/ 26 阅读
相关 小谈设计模式(17)—状态模式 小谈设计模式(17)—状态模式 专栏介绍 专栏地址 专栏介绍 状态模式 关键角色 上下文(Conte 青旅半醒/ 2023年10月16日 17:40/ 0 赞/ 22 阅读
相关 小谈设计模式(13)—外观模式 小谈设计模式(13)—外观模式 专栏介绍 专栏地址 专栏介绍 外观模式 主要目的 角色分析 逃离我推掉我的手/ 2023年10月16日 17:12/ 0 赞/ 26 阅读
相关 小谈设计模式(10)—原型模式 小谈设计模式(10)—原型模式 专栏介绍 专栏地址 专栏介绍 原型模式 角色分类 抽象原型(Prot 亦凉/ 2023年10月16日 16:54/ 0 赞/ 23 阅读
相关 小谈设计模式(8)—代理模式 小谈设计模式(8)—代理模式 专栏介绍 专栏地址 专栏介绍 代理模式 代理模式角色分析 抽象主题(S た 入场券/ 2023年10月16日 16:47/ 0 赞/ 17 阅读
相关 小谈设计模式(7)—装饰模式 小谈设计模式(7)—装饰模式 专栏介绍 专栏地址 专栏介绍 装饰模式 装饰模式角色 Componen 以你之姓@/ 2023年10月16日 16:41/ 0 赞/ 13 阅读
相关 小谈设计模式(3)—策略模式 小谈设计模式(3)—策略模式 专栏介绍 专栏地址 专栏介绍 策略模式 主要角色 环境(Context ゞ 浴缸里的玫瑰/ 2023年10月16日 07:26/ 0 赞/ 26 阅读
相关 【浅谈设计模式】(15): 命令模式--小妖怪的夏天 前言 > ⛱ 小猪妖有个梦想,那就是离开浪浪山,出去闯荡, > > 但是在短篇当中小猪妖并没有走出浪浪山,和我们普通人一样,都走不出自己的浪浪山。 > > 我知道浪浪 傷城~/ 2023年10月04日 22:26/ 0 赞/ 29 阅读
还没有评论,来说两句吧...