【问题标题】:Any pattern name for commands that are handled instead of executed处理而不是执行的命令的任何模式名称
【发布时间】:2015-05-07 21:52:23
【问题描述】:

Gof 的命令模式描述了一个带有执行方法的命令。这是在 Wpf 和 Silverlight 中,例如在 ICommand 接口中定义的,并通过 CanExecute 方法进行了丰富。这种类型的命令封装了要执行的动作的参数,以及调用执行的逻辑。为此,它必须知道执行上下文(execute 方法可以在哪里调用所需的方法以及 canexecute 方法可以在哪里验证是否可能)。这种类型的命令负责自己的执行。

例如,在 CQRS 中,使用了其他类型的“命令”。它自己没有执行方法,也不对自己的执行负责。它只是封装了所需的参数并由进行调用的命令处理程序处理。这种类型的命令的优点是它不需要知道执行上下文,因此更容易序列化,并且具有更多的关注点分离。

我的问题是:Gof“命令模式”涵盖了第一种命令。第二种命令有模式名称吗?

我有一个应用程序,我想同时使用这两种类型的命令,我必须为它们选择不同的名称。我倾向于“Command”和“HandledCommand”之类的东西,但如果有的话,我想选择一个众所周知的模式名称。

【问题讨论】:

  • 因为第二种模式只存储值,它可能是数据传输对象(DTO)。 GoF 描述了一个非常相似的模式 Memento。
  • 是的。从技术上讲,它是一个 DTO 或“参数对象”。但在 CQRS 中,它被称为命令,我想抓住语义,它不仅仅是一堆参数,而是做某事的顺序。此外,参数对象不绑定到特定的方法或操作。但是一个命令(在 cqrs 意义上)是。我认为 memento 在语义上更多是存储对象的内部状态(如序列化)。
  • 命令的命名空间分离不够吗?
  • 是的。命名空间分离就可以了。但我说的是一个通用库,它具有两种命令的接口。我将它们都称为命令,但是我应该在命名空间中使用什么名称? :-) CommandDescriptor 会和我的 HandledCommand 一样好,但我正在寻找一个众所周知的模式名称。我将把它打开几天然后关闭它,结论是没有标准的模式名称,这样可以吗?
  • 也许您的答案是命令处理器,如本视频所示:youtube.com/watch?v=PJvnMP94Kqw

标签: design-patterns


【解决方案1】:

也许答案可以在Command Processor 模式中找到,正如 POSA Vol. 中所定义的那样。 1 并在此处描述:http://www.dre.vanderbilt.edu/~schmidt/cs282/PDFs/8-Services-and-IPC-parts-7-8-and-9.pdf 并在视频中https://www.youtube.com/watch?v=PJvnMP94Kqw

意图

  • 封装了一个应用程序功能——以及它的 对象中的参数化——使其在另一个上下文中可用,例如 稍后或在不同的线程中

适用性

  • 当需要解耦决定哪一段代码时 应该从何时发生的决定开始执行

  • 例如,在不同时间指定、排队和执行服务请求

  • 当需要确保服务增强不会中断时 现有代码

我使用 PlantUML 重现了类图:


Command Bus 模式 http://php-and-symfony.matthiasnoback.nl/2015/01/responsibilities-of-the-command-bus/ 是一个适用于 Web 开发的相关思想。

【讨论】:

    猜你喜欢
    • 2012-04-25
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2015-01-11
    • 2022-01-03
    • 2018-11-07
    • 1970-01-01
    相关资源
    最近更新 更多