介绍

  1. 命令模式(Command Pattern):在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收 者是谁,也不知道被请求的操作是哪个, 我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计
  2. 命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。
  3. 在命名模式中,会将一个请求封装为一个对象,以便使用不同参数来表示不同的请求(即命名),同时命令模式 也支持可撤销的操作。
  4. 通俗易懂的理解:将军发布命令,士兵去执行。其中有几个角色:将军(命令发布者)、士兵(命令的具体执 行者)、命令(连接将军和士兵)。 Invoker 是调用者(将军),Receiver 是被调用者(士兵),MyCommand 是命令,实现了 Command 接口,持 有接收对象

原理类图

  1. Invoker 是调用者角色
  2. Command: 是命令角色,需要执行的所有命令都在这里,可以是接口或抽象类
  3. Receiver: 接受者角色,知道如何实施和执行一个请求相关的操作
  4. ConcreteCommand: 将一个接受者对象与一个动作绑定,调用接受者相应的操作,实现 execute

实战案例

假设我们要开发一个文本文件应用程序。在这种情况下,我们应该实现执行某些与文本文件相关的操作所需的所有功能,例如打开写入保存文本文件等。

因此,我们应该将应用程序分解为上述四个组件。

命令类

命令是一个对象,其作用是存储执行操作所需的所有信息,包括要调用的方法、方法参数和实现该方法的对象(称为接收器)。

为了更准确地了解命令对象的工作原理,让我们开始开发一个简单的命令层,它只包含一个接口和两个实现:

@FunctionalInterface
public interface TextFileOperation {
String execute();
} public class OpenTextFileOperation implements TextFileOperation{
private final TextFile textFile; public OpenTextFileOperation(TextFile textFile) {
this.textFile = textFile;
} @Override
public String execute() {
return textFile.open();
}
} public class SaveTextFileOperation implements TextFileOperation {
private final TextFile textFile; public SaveTextFileOperation(TextFile textFile) {
this.textFile = textFile;
} @Override
public String execute() {
return textFile.save();
}
}

在这种情况下,TextFileOperation接口定义了命令对象的API,两个实现OpenTextFileOperation和SaveTextFileOperation执行具体操作。 前者打开文本文件,后者保存文本文件。

可以清楚地看到命令对象的功能:TextFileOperation 命令封装了打开和保存文本文件所需的所有信息,包括接收器对象、要调用的方法和参数(在这种情况下,不需要参数,但可以)。

值得强调的是,执行文件操作的组件是接收器(TextFile 实例)。

接收器类

接收方是执行一组内聚操作的对象。它是在调用命令的 execute() 方法时执行实际操作的组件。

在这种情况下,我们需要定义一个接收器类,其作用是建模 TextFile 对象:

public class TextFile {
private final String name; public TextFile(String name) {
this.name = name;
} public String open() {
return "Opening file " + name;
} public String read() {
return "Reading file " + name;
} public String write() {
return "Writing to file " + name;
} public String save() {
return "Saving file " + name;
} public String copy() {
return "Copying file " + name;
} public String paste() {
return "Pasting file " + name;
}
}

调用程序类

调用程序是一个对象,它知道如何执行给定的命令,但不知道命令是如何实现的。它只知道命令的界面。

在某些情况下,除了执行命令之外,调用程序还会存储和排队命令。这对于实现一些附加功能非常有用,例如宏录制或撤消和重做功能。

在我们的示例中,很明显,必须有一个额外的组件负责调用命令对象并通过命令的 execute() 方法执行它们。这正是调用程序类发挥作用的地方。

让我们看一下调用程序的基本实现:

public class TextFileOperationExecutor {

    private final List<TextFileOperation> textFileOperations
= new ArrayList<>(); public String executeOperation(TextFileOperation textFileOperation) {
textFileOperations.add(textFileOperation);
return textFileOperation.execute();
}
}

类只是一个薄的抽象层,它将命令对象与其使用者分离,并调用封装在 TextFileOperation 命令对象中的方法。

在这种情况下,该类还将命令对象存储在列表中。当然,这在模式实现中不是强制性的,除非我们需要为操作的执行过程添加一些进一步的控制。

客户端类

客户端是一个对象,它通过指定要执行的命令以及在进程的哪些阶段执行命令来控制命令执行过程。

因此,如果我们想与模式的正式定义正统,我们必须使用典型的 main 方法创建一个客户端类:

public static void main(String[] args) {
TextFileOperationExecutor textFileOperationExecutor
= new TextFileOperationExecutor();
textFileOperationExecutor.executeOperation(
new OpenTextFileOperation(new TextFile("file1.txt"))));
textFileOperationExecutor.executeOperation(
new SaveTextFileOperation(new TextFile("file2.txt"))));
}
  • 输出结果:

Java设计模式-命令模式Command的更多相关文章

  1. 【设计模式】Java设计模式 - 命令模式

    Java设计模式 - 命令模式 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目录 Ja ...

  2. JAVA 设计模式 命令模式

    用途 命令模式 (Command) 将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化:对请求排队或请求日志,以及支持可撤销的操作. 命令模式是一种行为型模式. 结构

  3. 设计模式 - 命令模式(command pattern) 多命令 具体解释

    命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...

  4. 设计模式 - 命令模式(command pattern) 具体解释

    命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对 ...

  5. 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释

    命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...

  6. 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

    命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...

  7. Java设计模式-命令模式(Command)

    命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不用去依赖其 ...

  8. 设计模式-命令模式(Command)

    关注公众号 JavaStorm 获取更多成长. 大约需要6分钟读完.建议收藏后阅读. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日 ...

  9. 设计模式--命令模式Command(对象行为型)

    一.命令模式 将一个请求封装为一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. (1)Command类:是一个抽象类,类中对需要执行的命令进行 ...

  10. C#设计模式——命令模式(Command Pattern)

    一.概述通常来说,“行为请求者”与“行为实现者”是紧耦合的.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这些情况下,将“行为请求者”与“行为实 ...

随机推荐

  1. .net core 3.0 获取 IServiceProvider 实例

    .net core 3.0后,获取IServiceProvider需要绕点弯路 首先,新建一个类: public class MyServiceProviderFactory : IServicePr ...

  2. (保姆级)服务器-Zabbix6.0使用Python脚本实现带图片的邮箱的报警

    前言 近期在琢磨Zabbix邮箱报警的功能,但是网上的教程通常是4.0或5.0版本Zabbix,并使用Python2.7环境,运行在新版本Zabbix6.0上有颇多问题,为此我基于原先教程修改基于Za ...

  3. 【Kafka系列】(一)Kafka入门

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 Kafka是什么? 一句话概括:Apache K ...

  4. [转帖]如何在Linux系统中使用命令发送邮件

    https://zhuanlan.zhihu.com/p/96897532 Linux系统更多的被用来做服务器系统,在运维的过程中难免我们需要编写脚本监控一些指标并定期发送邮件. 本教程将介绍如何在L ...

  5. [转帖]ssd/san/sas/磁盘/光纤/RAID性能比较

    https://plantegg.github.io/2022/01/25/ssd_san%E5%92%8Csas%E7%A3%81%E7%9B%98%E6%80%A7%E8%83%BD%E6%AF% ...

  6. ltp的简单学习

    ltp的简单学习 简介 下载地址为: https://github.com/linux-test-project/ltp Linux Test Project is a joint project s ...

  7. [转帖]Windows自带硬盘测试工具使用教程

    本教程主要讲解Windows自带的硬盘测试工具的使用,不用再安装第三方软件了.到底准不准就不知道啦,下面我们来看看如何使用吧~ 1. 进入cmd 快速进入cmd 主要如果进入后,使用命令直接闪退,就是 ...

  8. Linux与Windows系统字符集的简要学习

    背景 最近同事反馈公司的产品再更新了mysql-8.0.31的驱动jar包后部分功能报错. 问题核心原因 研发这边石磊老师已经找到了. 结论是Mysql8.0.26之后的数据库驱动好像会识别操作系统的 ...

  9. PG数据库异步流复制

    PG数据库异步流复制 背景说明 最近想进行一个数据库高可用课题的研究. 因为之前某种原因,这次选择的是PG数据库. 为了简单起见, 暂时采用PG异步流复制的场景. 这次仅是为了测试, 不考虑高可用绿色 ...

  10. React数据通信父传子和子传父的使用

    组件中的props 在react中,props的特点是: 1.可以给组件传递任意类型的数据 2.props是只读的对象,只能够读取属性的值,无法修改对象 如过我们强行修改数据,会报错,告诉我们该属性是 ...