聊聊设计模式——命令模式

news/2025/1/3 7:02:28/

目录

命令模式定义

优点

缺点

命令模式结构说明

工作流程

代码练习

应用场景

本质

涉及的设计原则

相关设计模式

开源框架中的应用


命令模式定义

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

                                                                                                                       `

优点

  1. 解耦:命令模式将命令的发起者和执行者解耦,使得命令对象充当中间人角色。

  2. 可扩展性:您可以轻松添加新的命令类,以实现新的操作,而无需修改现有的客户端代码。

  3. 支持撤销和重做:通过保存命令的历史记录,可以支持撤销和重做操作。

  4. 支持事务:命令模式可以用于支持事务,将一系列操作封装成一个命令对象,然后一次性执行或回滚。

缺点

  1. 类膨胀:命令模式可能会导致类的数量增加,因为每个具体命令类都需要一个对应的类。

  2. 复杂性:对于简单的命令,实现命令模式可能会引入不必要的复杂性。

命令模式结构说明

  1. 命令接口(Command Interface):定义了执行命令的方法。

  2. 具体命令类(Concrete Command):实现了命令接口,它包含了对接收者的引用,以及实际执行命令的逻辑。

  3. 接收者类(Receiver):负责执行命令所指定的操作。

  4. 调用者类(Invoker):负责存储命令对象并调用命令对象的执行方法。

工作流程

  1. 客户端创建一个具体命令对象,并设置其接收者。

  2. 客户端将命令对象传递给调用者(Invoker)。

  3. 调用者将命令对象存储起来。

  4. 在需要执行命令的时候,调用者调用命令对象的执行方法。

  5. 命令对象执行实际的操作,将请求传递给接收者执行。

代码练习

命令模式是行为型设计模式,和结构型设计模式中的组合模式类似,都有很强的特定场景要求。命令模式的应用场景,是用来控制 命令的执行,比如,异步、延迟、排队执行命令、撤销重做命令、存储命令、给命令记录日志等等,这才是命令模式能发挥独一无二作用的地方。

1.创建命令接口,定义了执行命令的方法execute()。

public interface Command {void execute();
}

2.创建具体的命令类,包含接收者的引用,以及实际执行命令的逻辑。

/*
具体的命令类包含了接收者,调用接收者具体的操作方法*/
public class ConcreteCommand implements Command{
​private Receiver receiver;
​public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}
​@Overridepublic void execute() {receiver.action();}
}

3.创建接收者,负责执行命令。

public class Receiver {public void action(){System.out.println("达成命令...");}
}

4.创建调用者,负责发起调用,传达命令。

public class Invoker {private Command command;
​public void setCommand(Command command) {this.command = command;}
​public void executeCommand(){command.execute();}
}

5.客户端实现:

public class CommandClient {public static void main(String[] args) {Receiver receiver = new Receiver();Command command = new ConcreteCommand(receiver);
​Invoker invoker = new Invoker();invoker.setCommand(command);invoker.executeCommand();}
}

应用场景

  1. 当需要将请求的发送者和接收者解耦时,命令模式非常有用。它允许您将请求封装成独立的命令对象,从而可以方便地添加、修改或撤销命令。

  2. 当需要支持事务(Transaction)或撤销(Undo)操作时,命令模式可以有效地管理操作历史。

  3. 当需要实现任务调度或队列执行操作时,命令模式可以用于构建命令队列。

本质

命令模式的本质是将请求封装成对象,从而允许您参数化客户端以及将请求排队、记录请求和支持撤销操作。

涉及的设计原则

  1. 开闭原则(Open-Closed Principle):命令模式遵循开闭原则,因为它允许您添加新的命令类而不需要修改现有的客户端代码。

相关设计模式

  • 命令模式通常与其他模式结合使用。例如,可以将命令模式与责任链模式结合使用来构建命令处理链,或者与备忘录模式结合使用以支持撤销和重做操作。

开源框架中的应用

Java中的Swing框架**:Swing是Java图形用户界面(GUI)工具包,其中的事件处理机制使用了命令模式。事件源(如按钮)会生成相应的命令对象(如ActionEvent),然后通过注册的命令监听器来执行相应的操作。


http://www.ppmy.cn/news/1123487.html

相关文章

钉钉stream机器人-实操详细教程

支持事件订阅、机器人收消息、卡片回调等功能 优点: 配置简单,不依赖也不需要暴露公网IP,无需向公网开放端口 github官方链接:GitHub - open-dingtalk/dingtalk-stream-sdk-python: Python SDK for DingTalk Stream Mode API, Co…

贴片电容耐压值选取和特性(包含实际电路和PCB)

一、一般电容的特性 ①容值大的电容,一般通低频率;  ②容值小的电容,一般通高频率。   注:详细请看这位博主的篇文章: 大电容为什么虑低频小电容为什么又虑高频?(个人整理) 二、贴片电容的耐压选取 ①贴片电容有2…

服务注册发现_服务自保和服务剔除机制

服务剔除,服务自保,这两套功法一邪一正,俨然就是失传多年的上乘心法的上卷和下卷。但是往往你施展了服务剔除便无法施展服务自保,而施展了服务自保,便无法施展服务剔除。也就是说,注册中心在同一时刻&#…

Android回收视图

本文所有代码均存放于https://github.com/MADMAX110/BitsandPizzas 回收视图是列表视图的一个更高级也更灵活的版本。 回收视图比列表视图更加灵活,所以需要更多设置,回收视图使用一个适配器访问它的数据,不过与列表视图不同,回收…

医药行业安全生产信息化建设分享

随着科技的快速发展和全球化进程的推进,医药行业作为人类健康和安全的重要组成部分,面临着日益严峻的安全生产挑战。近年来,医药企业对于安全生产的需求越来越强烈,安全生产信息化建设成为了医药行业发展的重要趋势。本文将探讨医…

2018 国际AIOps挑战赛单指标数据集分析

关于数据集 2018年国际AIOps 由中国建设银行、清华大学以及必示科技公司联合举办,尽管已经过去了这么长时间,其提供的比赛数据依然被用于智能运维相关算法的研究。这里我们对此数据集做简单的分析,把一些常用的数据分析方法在这里进行略微地…

Prompt-To-Prompt——仅通过文本进行图像编辑

文章目录 1.摘要2.算法2.1 Cross-attention in text-conditioned Diffusion Models2.2 Controlling the Cross-attentionWord SwapAdding a New PhraseAttention Re–weighting 3.应用Text-Only Localized EditingGlobal editingFader Control using Attention Re-weightingRea…

VMware云数据中心中常用的术语清单

网卡组合(NIC Teaming): 链路聚合协议(Link Aggregation Control Protocol): 端口聚合协议(Port Aggregation Protocol): 主机总线适配器(Host Bus Adapter&#xff0…