模式命令

命令模式是指行为设计模式。

这是我坚持了最长的时间的模式,它是如此简单,却又非常复杂。但就我个人而言,我发现自学的美妙之处在于你有足够的时间从各个角度研究某个主题。

因此,GoF 中的适用性描述得非常简洁明了:
将请求封装为对象,允许您使用不同的请求参数化客户端、使用队列、记录请求以及执行取消操作。

现在让我们根据描述实现该命令的简单版本:

string fakeTrumpsRequest = “SELECT * from Users where name beginsWith DonaldTrump”

我们将请求封装在一个字符串类对象中,它可以用于配置客户端、向队列添加命令、记录、取消(使用“快照”模式)

在我看来,这足以执行 SQL 查询等操作,但是实现细节、不同的应用程序选项、模式的代码库、客户端角色和辅助类也有很大不同。

材料部分

命令模式以命令协议开始,其中包含单个execute()方法。接下来是具体的命令和接收器,CC实现了对接收器的操作,描述了接收器和动作之间的联系。有什么不清楚的吗?我也是,但我们继续吧。 客户端创建特定命令的实例,并将其与接收器关联。 祈求者 –执行启动命令过程的对象。

现在让我们尝试用一个例子来说明这一点,假设我们要更新 myPhone 上的 myOS,为此我们启动 myOS_Update! 应用程序,在其中按下“立即更新”按钮,10 秒后系统将执行此操作。报告更新成功。

上面示例中的客户端是 myOS_Update! 应用程序,Invoker 是“立即更新!”按钮,它启动特定命令使用execute()方法更新系统,该方法访问接收器–操作系统更新守护进程。

使用示例

让我们接受 myOS_Update 应用程序的 UI!太好了,他们决定将其作为单独的产品出售,以提供更新其他操作系统的界面。在这种情况下,我们将实现一个支持通过库扩展的应用程序,在库中将有特定命令、接收器的实现,我们将保留静态/不可变Invoker客户端,协议命令

因此,不需要支持可变代码,因为我们的代码将保持不变,只有在客户端实现时才会出现问题,因为它们的特定命令接收器。而且,在这个实现中,不需要传输主应用的源代码,即我们使用 Command 模式封装了命令和 UI 交互。

来源

https://refactoring.guru/ru/design-patterns/command
https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612