Java 中的命令模式

10 Sept 2024 | 4 分钟阅读

命令模式将一个请求封装为一个对象,从而使你可以用不同的请求来参数化客户机,或将请求排队、记录请求,以及支持可撤销的操作。

这个定义一开始可能有点令人费解,但让我们一步一步来理解。在我们上面的类比中,遥控器是客户端,而立体声音响、灯等是接收者。在命令模式中,有一个命令对象,它通过将一组在特定接收者上的操作绑定起来,来封装一个请求。它通过只公开一个 `execute()` 方法来实现这一点,该方法会触发在接收者上的一些操作。

在我们类比中,用不同的请求来参数化其他对象意味着,用于打开灯的按钮以后也可以用于打开立体声音响,或者打开车库门。

排队或记录请求,以及支持可撤销的操作,意味着命令的 `Execute` 操作可以存储用于撤销其效果的状态,这些状态存储在命令本身中。命令可以增加一个 `unExecute` 操作,用于撤销之前 `execute` 调用所产生的影响。它还可以支持记录更改,以便在系统崩溃时可以重新应用这些更改。

RemoteControlTest.java

输出

Light is on
Stereo is on
Stereo is set for CD input
Stereo volume set to 11
Stereo is off

命令模式要点

  • Command 是命令设计模式的核心,它定义了实现的契约。
  • Receiver 的实现与 Command 的实现是分开的。
  • Command 的实现类选择在 Receiver 对象上调用哪个方法,Receiver 中的每个方法都会有一个 Command 实现。它充当 Receiver 和 Action 方法之间的桥梁。
  • Invoker 类只是将来自客户端的请求转发给命令对象。
  • 客户端负责实例化适当的 Command 和 Receiver 实现,然后将它们关联起来。
  • 客户端还负责实例化 Invoker 对象,将其与 Command 对象关联,并执行 Action 方法。
  • 命令设计模式易于扩展,我们可以向 Receiver 添加新的 Action 方法,并创建新的 Command 实现,而无需更改客户端代码。
  • 命令设计模式的缺点是,由于大量的 Action 方法和众多的关联,代码会变得庞大而混乱。

命令模式的优点

  • 解耦:命令模式将客户端与接收者解耦。它使代码更灵活、更易于重用。
  • 撤销/重做:命令模式可用于实现撤销/重做功能。对于文本编辑器和图像编辑器等应用程序可能很有用。
  • 排队:命令模式可用于实现排队功能。对于作业调度器和消息队列等应用程序可能很有用。

命令模式是一种强大而通用的设计模式,可用于解决各种问题。对于需要将客户端与接收者解耦、实现撤销/重做功能或实现排队功能的应用程序来说,它是一个不错的选择。


下一个主题CSV 转 List Java