问题标签 [command-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2843 浏览

java - 油漆应用程序中撤消/重做的命令模式

我想在一个小型绘画应用程序中实现撤消/重做。似乎命令模式非常适合使用,但我不确定如何最好地实现它。

据我了解该模式,有必要在每个命令中包含:

  1. 用于重做的绘制操作的详细信息(例如 Line -> start & end points, free form line -> GeneralPath
  2. 撤消更改之前组件的状态。在这种情况下,这将是受命令影响的区域的小快照图像。

我基于此的理解是,每个命令都需要是“原子的”或自包含的,以及撤消/重做该操作所需的所有信息。

不幸的是,这需要存储比我最初预期的更多的信息。对于一条线,我们还必须考虑Color,StrokeRenderingHints最初用来绘制它的东西。这将我的“简单的小命令”变成了……在内存中更庞大的东西,并产生了更多的样板代码(每个都是可序列化的 bean 1)。

出于节省内存的原因(主要是),我想在命令规范上“作弊”。可能每 100 次更新备份整个绘图区域,否则不存储更改的图像的任何部分,并且只需为每个新的绘制操作重建最后(最多)100 个命令。但是,在绘制每个部分之前确保Graphics对象的状态正确似乎是有问题的 - 这部分可能需要一行,但是RenderingHints4 个命令前已Color更改, 98 个命令前已更改,而Stroke最后一个保持不变227 个命令。

就“原子”而言,追求更高效的内存命令似乎会将模式扔出窗外。这反过来又导致难以确定可能影响渲染的最早命令。

我是不是该:

  • 寻找新模式?
  • 尝试通过调整模式来实现我的特殊需求?
  • 将所有这些作为过早的优化扔进垃圾箱,并以最简单(也是最消耗内存)的方式进行编码,并按照定义的命令模式进行编码?

更新

  1. “每个都将是一个可序列化的bean” 第二个想法,不。我做了圆顶检查,发现 a Graphics2D(它巧妙地封装了绘图时使用的许多参数)不可序列化。此外,aBasicStroke 是可序列化的,但笔画的粗细不被存储。我可以创建许多属性的可序列化版本,但它似乎需要更多代码,所以我将放弃该规范。也是。我只会尝试BufferedImage在运行时存储对 a 的引用。
0 投票
2 回答
2761 浏览

design-patterns - 命令设计模式 - Invoker 是可选的吗?

命令设计模式中的调用者类是可选的吗?客户端需要为命令实例化具体命令和接收器。客户端是否总是需要实例化 Invoker 并将命令对象传递给 Invoker 对象。稍后,每当客户端需要执行命令时,客户端只需询问 Invoker 对象,Invoker 就会执行命令(可能立即执行,也可能将命令排队等待稍后执行)。

或者这是相反的方式?如果客户端需要同步执行命令,客户端将使用基类接口引用命令,但会实例化具体的命令和接收器。每当客户端需要执行命令时,客户端只会调用基类命令变量的执行方法?当需要一些额外的逻辑来执行命令时,Invoker 类将用于保留该额外的逻辑,并且客户端将与 Invoker 对象交互以执行命令?

0 投票
1 回答
443 浏览

java - 命令设计模式简单 GUI 空指针

我有这些类:一个 JPanel 扩展、一个接口和 3 个 JmenuItem 类。

我希望根据选择了 Menu 中的哪个 jMenuItem 来调用在 3 个 JMenuItems 中实现的 Execute 方法。我怎样才能正确地做到这一点?我需要 3 个 jMenuItems 的包装类吗?

0 投票
1 回答
2573 浏览

c# - 使用 MVC 3 控制器的依赖注入的命令模式

我阅读了以下文章.NET Junkie - 同时...在我的架构的命令方面,这是由另一个 stackoverflow 用户提出的,该用户概述了命令模式并在文章末尾提供了如何将其与 DI 一起使用的策略。

这有很大帮助,但我缺少的一件事,假设我创建了一个名为CheckoutCustomerCommandHandler.

现在,假设MoveCustomerCommandHandler无论出于何种原因,我都需要通过构造函数将此命令和 注入控制器。这对 DI 容器设置和构造函数有何影响?

在核心,它们都实现了相同的接口。这似乎会导致 DI 容器的查找问题。在文章示例中,这是他们的样品注射器设置:

0 投票
1 回答
148 浏览

c# - 命令模式中的 2 种命令

我正在使用命令模式开发应用程序。我的程序中有两种操作:1.长时间操作(复制/删除文件),应该异步运行 2.简单操作(刷新面板)

我的问题是:我可以在这个模式中实现 2 种命令(AsyncCmd 和 SimpleCmd)吗?在命令管理器中执行之前检查命令类型:

0 投票
2 回答
4614 浏览

wpf - WPF:MVVM:命令与 CallMethodAction?

我正在用一个新的(小)项目学习 MVVM 模式,我对在我们的控制器上调用操作的方式有一个疑问:

我看到很多教程,他们告诉我们使用命令,暗示要声明一个 RelayCommand,初始化它并创建由 RelayCommand 调用的动作。

另一方面,我有一位同事说我可以使用CallMethodAction触发器:

对我来说,他的方法的优点是我不必为命令创建一些 inits 方法(可能永远不会使用)。

那么我错过了什么?为什么每个人都使用命令?

0 投票
2 回答
1625 浏览

dependency-injection - 我可以根据 Open Generic 的类型为 AutoFac 提供密钥服务吗

我想为我的 Open Generic ICommandHandler 创建一个基于 T 的 keyedService。当 ICommandHandler 有一个继承自 ConsultantCommand 的 T 时,我想注册一个 ConsultatCommandHanlder 键控服务

知道怎么做吗?或者如果它甚至可能?我是 AutoFac 的新手并且正在苦苦挣扎。

我目前正在像这样注册 CommandHandler:

如果可能的话,我猜我必须在获得 Closed Type 时识别 CommandHandlers,并以某种方式识别 Command 实现 ConsultantCommand 的那些。

我试过了:

但不是喜悦似乎不起作用。它可以编译,但现在没有注册 CommandHandlers,即使是那些继承自 ConsultantCommand 的。我认为我的语法都是错误的

0 投票
2 回答
4535 浏览

design-patterns - 命令模式和责任链

在我的应用程序中,我需要按一定顺序从数据库加载数据,例如加载所有客户,然后加载所有订单并加载产品等。但是,在一两种情况下,订单不同,也需要加载附加数据。

我最初的想法是我是否可以使用命令模式(使用加载命令方法)来实际加载客户、订单或产品,并使用责任链来捆绑命令。这是一个好方法还是我在这里过度工程?

任何示例代码都会非常有帮助。感谢您的任何建议

0 投票
4 回答
25976 浏览

c# - 精心设计的查询命令和/或规范

我一直在寻找一个很好的解决方案来解决典型存储库模式所带来的问题(不断增长的专用查询方法列表等。请参阅:http ://ayende.com/blog/3955/repository-是新的单例)。

我真的很喜欢使用命令查询的想法,特别是通过使用规范模式。但是,我对规范的问题是它只涉及简单选择的标准(基本上是 where 子句),而不涉及查询的其他问题,例如连接、分组、子集选择或投影等。基本上,许多查询必须经过所有额外的循环才能获得正确的数据集。

(注意:我在命令模式中使用术语“命令”,也称为查询对象。我不是在谈论命令/查询分离中的命令,其中查询和命令(更新、删除、插入))

所以我正在寻找封装整个查询的替代方案,但仍然足够灵活,以至于您不只是将意大利面条存储库换成命令类的爆炸式增长。

例如,我使用过 Linqspecs,虽然我发现能够为选择标准分配有意义的名称有一些价值,但这还不够。也许我正在寻找一种结合多种方法的混合解决方案。

我正在寻找其他人可能已经开发的解决方案来解决这个问题,或者解决一个不同的问题,但仍然满足这些要求。在链接的文章中,Ayende 建议直接使用 nHibernate 上下文,但我觉得这在很大程度上使您的业务层复杂化,因为它现在还必须包含查询信息。

等待期结束后,我将为此提供赏金。因此,请让您的解决方案有价值,并提供良好的解释,我将选择最佳解决方案,并为亚军投票。

注意:我正在寻找基于 ORM 的东西。不必明确地是 EF 或 nHibernate,但这些是最常见的并且最适合。如果它可以很容易地适应其他 ORM,那将是一个奖励。Linq 兼容也不错。

更新:我真的很惊讶这里没有很多好的建议。似乎人们要么完全是 CQRS,要么完全属于 Repository 阵营。我的大多数应用程序都不够复杂,不足以保证 CQRS(大多数 CQRS 倡导者很容易说你不应该使用它)。

更新:这里似乎有点混乱。我不是在寻找新的数据访问技术,而是在业务和数据之间设计合理的接口。

理想情况下,我正在寻找的是查询对象、规范模式和存储库之间的某种交叉。正如我上面所说,规范模式只处理 where 子句方面,而不是查询的其他方面,例如连接、子选择等。存储库处理整个查询,但一段时间后就会失控. 查询对象也处理整个查询,但我不想简单地用大量查询对象替换存储库。

0 投票
0 回答
267 浏览

actionscript-3 - 使用命令模式切换帧

我正在尝试为我的 Flash 游戏创建介绍动画,但是当它应该转到动画的第二帧时出现问题。

这是菜单中的开始游戏按钮应该执行的代码(位于文档类中):

如您所见,我正在使用命令模式。changeFrameCommand 将“this”设置为第 4 帧。但是,当我在下一个命令中跟踪 currentFrame 时,输出为“3”。这没有任何意义,因为当我运行程序时帧确实会更改为第 4 帧。以下现在已注释掉的命令随后会抛出“无法访问空对象引用的属性或方法”,因为 animationHero2 位于第 4 帧中。

我认为问题最可能的地方是changeFrameCommand,所以这是该类的代码:

如果有人能对这种情况有所了解,我将永远感激不尽,因为我的截止日期是 2 天。

根据要求,附加代码。

串行命令类:

命令类: