当前位置: 首页 > news >正文

设计模式:命令模式

文章目录

  • 一、什么是命令模式
  • 二、命令模式结构
  • 三、命令模式实现步骤
  • 四、命令模式应用场景

一、什么是命令模式

它允许将请求封装为对象,一个请求对应于一个命令,将发出命令的责任和执行命令的责任分割开。每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行相应的操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求如何被接收、操作是否被执行、何时被执行,以及是怎么被执行的。命令模式使得请求可以排队、记录、日志、存储和重放。

命令模式的主要优点包括:

  • 降低系统的耦合度:由于请求者与接收者之间不存在直接引用,因此请求者与接收者之间实现完全解耦,相同的请求者可以对应不同的接收者,同样,相同的接收者也可以供不同的请求者使用,两者之间具有良好的独立性。
  • 新的命令可以很容易地添加到系统中:因为增加一个新的命令不会影响其他类,因此增加新的命令类很容易,无须修改原有系统类库的代码,甚至可以在不重新编译原有系统类库的情况下运行,即系统扩展性好。
  • 可以很容易地实现命令的撤销与恢复:只要把命令对象存储起来,在需要时调用执行即可实现命令的撤销与恢复,当然,这里的撤销与恢复并非撤销和重做命令所产生的结果,而是撤销与重放命令本身。
  • 在需要实现事务时,命令模式也有其独特的优点:当系统需要支持事务的时候,可以通过把命令对象放到一个事务队列中,等待系统处理事务的命令序列。

命令模式的主要缺点包括:

  • 可能导致某些系统有过多的具体命令类:因为针对每一个对请求接收者的调用操作都需要设计一个具体命令类,因此在某些系统中可能需要提供大量的具体命令类,这将影响命令模式的使用。

总的来说,命令模式是一种非常有用的设计模式,特别适用于需要将请求封装为对象、支持可撤销操作、或需要事务管理的场景。

二、命令模式结构

在这里插入图片描述
命令模式的主要参与者包括:

  • 命令(Command)接口:声明执行操作的接口。
  • 具体命令(ConcreteCommand)类:实现命令接口,将接收者的一个动作绑定其中。调用接收者相应的操作,以实现执行效果。
  • 请求者(Invoker):要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这是真正发号施令者。
  • 接收者(Receiver):执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
  • 客户端(Client):创建具体的命令对象,并且设置命令对象的接收者。在不是直接调用接收者的情况下,将命令对象传递给请求者来执行请求。

三、命令模式实现步骤

命令模式的实现步骤通常包括以下几个部分:

  • 定义命令接口
    首先,你需要定义一个命令接口,这个接口通常声明了一个执行方法(如execute())。例如,在Java中,你可以这样定义:
public interface Command {  void execute();  
}
  • 创建具体命令类
    然后,你需要创建具体的命令类,这些类实现了命令接口,并包含了接收者对象的引用。这些命令类将调用接收者的方法来完成实际的操作。
public class ConcreteCommand implements Command {  private Receiver receiver;  public ConcreteCommand(Receiver receiver) {  this.receiver = receiver;  }  @Override  public void execute() {  receiver.action(); // 调用接收者的方法  }  
}
  • 创建接收者
    接收者类通常包含实际要执行的操作。任何类都可以作为接收者,只要它能够执行命令所请求的操作。
public class Receiver {  public void action() {  // 执行操作  }  
}
  • 创建请求者
    请求者(Invoker)是发出命令请求的对象。它通常持有命令对象的引用,并可以通过调用命令对象的execute()方法来执行命令。
public class Invoker {  private Command command;  public Invoker(Command command) {  this.command = command;  }  public void call() {  command.execute(); // 调用命令的执行方法  }  
}
  • 在客户端中组装命令和接收者
    客户端负责创建具体的命令对象,并将接收者对象传递给命令对象。然后,客户端将命令对象传递给请求者,请求者通过调用命令对象的execute()方法来执行命令。
public class Client {  public static void main(String[] args) {  Receiver receiver = new Receiver();  Command command = new ConcreteCommand(receiver);  Invoker invoker = new Invoker(command);  invoker.call(); // 调用请求者的call方法,间接执行命令  }  
}

这就是命令模式的基本实现步骤。通过这种方式,你可以将请求者和接收者解耦,使得请求者不知道也不关心接收者的具体实现细节。同时,由于请求被封装为了命令对象,你可以很方便地对其进行存储、传递和组合等操作。

四、命令模式应用场景

http://www.lryc.cn/news/344158.html

相关文章:

  • setinterval和settimeout区别在于
  • shell_结束进程脚本
  • GDPU unity游戏开发 碰撞器与触发器
  • IP地址定位技术在网络安全中的作用
  • R语言中,查看经安装的包,查看已经加载的包,查看特定包是否已经安装,安装包,更新包,卸载包
  • spring boot3单模块项目工程搭建-下(个人开发模板)
  • 精准清理 MongoDB 数据:删除集合的正确姿势
  • java 执行修改语句
  • 【Linux系统化学习】网络套接字(编写简单的UDP服务端和客户端)
  • MFC 列表控件修改实例(源码下载)
  • QT设计模式:模板模式
  • 8.k8s中网络资源service
  • 51单片机keil编程中遇到的问题(持续更新)
  • C++类和对象详解(一)
  • SCI论文检索报告长什么样?怎么出具?一文了解!
  • UE4_Water插件_Buoyancy组件使用
  • OceanBase学习1:分布式数据库与集中式数据库的差异
  • 计算机网络技术主要学什么内容,有哪些课程
  • Mac下安装ffmpeg
  • 自制AI:Park_01修改bug
  • 解救应用启动危机:Spring Boot的FailureAnalyzer机制
  • win11个性化锁屏界面怎么关闭?
  • 白酒:白酒香型与品质消费的关系及影响
  • 智能BI(后端)-- 系统优化(安全性,数据存储,限流)
  • 探索数字社交的奇迹:解读Facebook的革命性影响
  • FileCodeBox-Lite:轻量级文件分享解决方案
  • 【ARM】ARM寄存器和异常处理
  • 数仓建模【埋点设计与管理】
  • Spring Clound介绍
  • Redhat Linux忘记密码解决方案