Java最高

开始使用Spring 5和Spring Boot 2,通过学习的春天课程:

>>看看这个课程

1.概述

命令模式是一种行为设计模式,是GoF的正式设计模式列表。简单地说,该模式打算将执行给定操作(命令)所需的所有数据封装在一个对象中,包括要调用的方法、方法的参数和方法所属的对象。

这种模式允许我们将产生命令的对象与它们的使用者解耦,这就是为什么这种模式通常被称为生产者-消费者模式。

在本教程中,我们将学习如何使用面向对象和对象函数方法在Java中实现命令模式,并将了解在哪些用例中它会很有用。

2.面向对象的实现

在经典的实现中,命令模式需要实现四个组件:命令、接收方、调用方和客户端

为了理解模式如何工作以及每个组件扮演的角色,让我们创建一个基本示例。

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

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

2.1。命令类

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

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

@FunctionalInterface公共接口TextFileOperation {String execute();}
public class OpenTextFileOperation implements TextFileOperation {private TextFile TextFile;//构造函数@Override public String execute() {return textFile.open();}}
public class SaveTextFileOperation implements TextFileOperation{//与上面相同的字段和构造函数@Override public String execute(){返回textFile.save();}}

在这种情况下TextFileOperation接口定义了命令对象的API,以及两个实现,OpenTextFileOperationSaveTextFileOperation,执行具体的行动。前者打开一个文本文件,而后者保存一个文本文件。

可以清楚地看到命令对象的功能:TextFileOperation命令封装所需的所有信息用于打开和保存文本文件,包括接收方对象、要调用的方法和参数(在本例中,不需要参数,但它们可能是)。

这一点值得强调执行文件操作的组件是接收者(文本文件实例)

2.2。接收器类

接收者是一个对象执行一组有凝聚力的动作。当命令发出时,组件执行实际操作execute ()方法被调用。

在这种情况下,我们需要定义一个接收器类,它的角色是建模文本文件对象:

public class TextFile {private String name;//构造函数public String open() {return " open file " + name;} public String save() {return " save file " + name;} //附加的文本文件方法(编辑,写入,复制,粘贴)}

2.3。调用程序类

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

在某些情况下,调用者除了执行命令外,还存储和队列命令。这对于实现一些附加特性很有用,比如宏记录或撤销和重做功能。

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

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

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

TextFileOperationExecutor类只是一个将命令对象与它们的使用者解耦的薄抽象层控件中封装的方法TextFileOperation命令对象。

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

2.4。客户端类

客户端是一个对象控制命令执行过程通过指定要执行什么命令以及在流程的哪个阶段执行它们。

因此,如果我们想正统地使用模式的正式定义,我们必须使用typical来创建一个客户端类主要方法:

public static void main(String[] args) {TextFileOperationExecutor TextFileOperationExecutor = new TextFileOperationExecutor();textFileOperationExecutor。new OpenTextFileOperation(new TextFile("file1.txt"))));textFileOperationExecutor。new SaveTextFileOperation(new TextFile("file2.txt"))));}

3.Object-Functional实现

到目前为止,我们已经使用了面向对象的方法来实现命令模式,这一切都很好。

从Java 8开始,我们可以使用基于lambda表达式和方法引用的对象函数方法让代码更紧凑一点,更简洁一点

3.1。使用Lambda表达式

随着TextFileOperation接口是一个功能界面,我们可以将命令对象以lambda表达式的形式传递给调用者,无需创建TextFileOperation显式实例:

TextFileOperationExecutor TextFileOperationExecutor = new TextFileOperationExecutor();textfileoperationexecuter . executeoperation(() ->“打开文件file1.txt”);textfileoperationexecuter . executeoperation(() ->“保存文件file1.txt”);

实现现在看起来更加精简和简洁,正如我们所做的那样减少样板代码的数量

即便如此,问题仍然存在:与面向对象的方法相比,这种方法更好吗?

这是棘手的。如果我们假设在大多数情况下,更紧凑的代码意味着更好的代码,那么事实确实如此。

根据经验,当使用lambda表达式时,我们应该根据每个用例计算

3.2。使用方法引用

类似地,我们可以使用方法引用向调用者传递命令对象:

TextFileOperationExecutor TextFileOperationExecutor = new TextFileOperationExecutor();TextFile = new TextFile("file1.txt");textFileOperationExecutor.executeOperation(文本文件:打开);textFileOperationExecutor.executeOperation(文本文件:保存);

在本例中,实现是比使用lambdas的更冗长,因为我们仍然需要创建文本文件实例。

4.结论

在本文中,我们学习了命令模式的关键概念,以及如何通过使用面向对象的方法以及lambda表达式和方法引用的组合来在Java中实现该模式。

和往常一样,本教程中显示的所有代码示例都是可用的在GitHub

Java底部

开始使用Spring 5和Spring Boot 2,通过学习的春天课程:

>>看看这个课程
对这篇文章的评论关闭!