问题标签 [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 投票
1 回答
624 浏览

delphi - 实现一堆命令以获得事务行为-Delphi

我需要创建一个工具来针对数据库执行复杂的脚本。

出于几个原因,我不能依赖数据库事务行为,但我需要实现自己的事务系统。

我正在尝试的方法是借助命令模式(我的情况比较复杂,这里我放一个简化版本供讨论):

我创建了一组动作,对于每个动作,我都会传递一个“执行”和“撤消”的 sql 语句,示例:

对 Prepare 的调用可能是:

所以不知何故我做了非常小的改变(比如插入一个简单的行,更新一个行,......),对于每一个改变,“撤消”都是非常明显的。

我将准备一堆命令对象(可能使用 TObjectStack 集合),并一次调用一个命令的 Execute 方法,并在执行一个命令时将 FExecuted 设置为 True,并将组件保存到磁盘。

所以我想做的是运行所有脚本,但我想管理出现问题的情况。

如果出现问题,我想执行从最后到第一个调用 Undo 方法的所有命令。当然,在这样做之前,我需要能够从磁盘恢复组件(如果故障是硬件故障,如果故障是另一个原因,我已经在内存中拥有堆栈,我可以轻松地调用撤消一个命令时间)。

注意:我不能依赖数据库事务行为的主要原因是我还需要插入大 blob,每个 blob 都是从 Internet 下载然后插入的,所以我不能永远打开事务,因为我想提交每个对分贝的小改动。我对 blob 所做的是下载一个,插入它,下载下一个,插入它,...

所以我的问题是:你能建议一种方法来持久存储我的对象吗?我有 Delphi 2009,所以一个选择是制作一个 TInterdacedPersistent 并将组件保存到流然后保存到文件,无论如何,这样我会有很多文件,有额外的复杂性,而我更喜欢单个文件。你能建议吗?

编辑:我意识到 TObjectStack 在 Delphi 2009 中有错误(Pop 没有返回正确的类型),所以 TObjectStack 也可以这样做。

0 投票
1 回答
1514 浏览

java - CGLib 和序列化

我想要做的是序列化一个实现命令模式的类,以便我以后可以运行它。最重要的是,我想序列化一个匿名类(我知道这个问题)

让它有点复杂的是我在一个春天的环境中,我希望序列化的匿名类是在一个将由 CGLib 代理的类中定义的。

我最初的尝试:

例如,storeJob 将序列化对象并将其存储以备后用,而这部分失败了。我没有包含此代码,但只是一个 ObjectOutputStream 调用

我知道整个 TestService 类需要序列化。问题是它被包装了一个 CGLib 代理并且这个代理没有实现可序列化(我的猜测是这个不能被序列化)。

非常感谢任何帮助。

0 投票
1 回答
750 浏览

oop - 命令模式撤消/重做:我的方法有什么问题吗?

我正在寻找实现一个命令模式来支持我的应用程序中的撤消/重做。数据非常紧密地联系在一起,因此修改我的一些对象会产生一些下游后果,我也希望能够撤消这些结果。我主要关心的是我应该将执行下游命令的代码放在哪里。例如:

据我所知,这样的事情会很好,但我无法理解大部分执行代码实际应该去的地方。hierarchyObject 是否应该有一个 .changeLocation() 方法来添加所有后续命令,还是应该像上面一样在命令本身中?我能想到的唯一区别是,在上面的示例中,必须调用 MoveObjectCommand 才能对流程进行后续更改,而另一种方式可以在不需要命令的情况下调用它并且仍然以相同的方式处理(可能会产生负面影响用于跟踪撤消/重做步骤)。这是我想太多了吗?你会把它放在哪里以及为什么(显然这个例子并没有涉及所有角度,但是命令模式的任何一般最佳实践?)。

0 投票
1 回答
46 浏览

algorithm - 在不修改集合的情况下获取更改命令

可能是一个非常糟糕的标题,但无论如何......

我在分层数据集上使用命令模式。所以基本上我需要一个方法来返回一个对象,该对象描述将在不实际更改数据的情况下进行的更改。例如:

对象 1 -> 对象 2 -> 对象 3

如果我移动对象 1,它将导致对象 2 发生变化,这将导致对象 3 发生变化,因为它们相互依赖。所以......我需要一种方法来递归地遍历分层集合并收集移动对象 1 所需的更改,而无需实际修改集合。在递归进行到一半时,如果能够使用 Object1.Location 之类的东西会很好,但它可能已经计划进行更改,因此我无法可靠地使用它。

我觉得有很多算法需要进行这种“就地”修改。作为一名非 CS 专业的学生,​​我并没有学到太多这类东西,所以我什至不知道要寻找什么搜索词来找到“解决方案”。我将解决方案放在引号中,因为我意识到我的问题可能没有直接的解决方案,但我只是在寻找一些好的指导方针/例子来让我的大脑运转起来。

任何人都可以提供一些正在做的这类事情的真实例子吗?提前致谢。

0 投票
1 回答
431 浏览

undo - 撤消-重做重复的命令

所以,我知道撤消/重做通常是通过命令模式实现的。但是,当一个命令要重复x次时,撤消x次对用户来说会很麻烦。

例如,我有一个“int num”,当我在键盘上按“+”时,程序会执行“++num”。如果用户通过按“+”将num从0增加到50,那么用户想要撤消,我如何允许用户撤消一次,并且num会回到0。

如何实现撤消,使其可以处理一系列重复的命令?

提前致谢!

0 投票
6 回答
39758 浏览

java - 策略模式和命令模式的区别

策略模式命令模式有什么区别?我也在寻找 Java 中的一些示例。

0 投票
2 回答
3193 浏览

testing - 导致类爆炸的命令模式

似乎每当我使用命令模式时,它总是会导致比我不使用它时要多得多的类。这看起来很自然,因为我们在不同的类中一起执行相关代码块。如果我没有完成 10 或 12 个 Command 子类,我可能会认为这是一个仅使用 6 或 7 个类的小项目,这不会让我感到那么困扰。一个普通的 7 节课项目有 19 节左右的课似乎几乎是错误的。

真正困扰我的另一件事是测试所有这些 Command 子类是一件痛苦的事情。执行完最后几个命令后,我感觉迟钝,好像我的动作变慢了,不再敏捷。

这听起来很熟悉吗?我做错了吗?只是觉得在这个项目后期失去了敏捷性,真不知道如何以前几天的速度不断的实施和测试。

0 投票
1 回答
794 浏览

java - 什么面向对象的 GUI 设计可以正确结合命令模式和观察者模式?

是否存在一种将命令模式和观察者模式合理组合的面向对象的 GUI 设计?

我的 Java GUI 尝试组合命令模式和观察者模式,如下所示:

  • 客户端是命令接收器的观察者(例如输入 GUI 屏幕或对话框)
  • 调用者是客户端的实例变量
  • 客户端的 update() 方法接收命令接收者的输入并使用适当的命令更新调用者

让我对这种实现感到不舒服的是 update() 方法包含大量条件 if 语句。

例如

使用命令模式来有效和高效地处理 GUI 事件的正确方法目前正在躲避我。观察者模式对它有用吗?

0 投票
1 回答
4888 浏览

java - 命令模式 - 参数

我希望在分布式客户端/服务器环境中使用命令模式。本质上,接收器的“执行”方法需要采用各种参数,但是我读到每个命令类都应该有一个统一的“执行”方法,该方法不应该透露任何关于接收器的底层功能。

我的问题是,如何通过命令类将调用参数从开关传递到不同的接收器?有没有人有一个简单的Java示例?我似乎找不到任何

确实感谢您的帮助。

0 投票
1 回答
1664 浏览

java - 这种情况的命令模式?建议

大家晚上好。我一直在阅读命令模式,我想知道它是否适合我想要构建的东西。

本质上,我有一个与服务器形成套接字连接的客户端。我的服务器上有 1 个类“foo”,客户端需要针对这些类调用方法。

假设 foo 有 5 个我的客户将调用的方法。我过去曾犯过编组在服务器上解组的对象的错误。然后我检查对象中的变量并使用 switch 语句,服务器逻辑可以确定应该调用什么操作。

我想避免这种情况,所以我相信命令模式可以帮助我。但是,对于我在服务器上的示例“foo”类,我是否需要为要在 foo 中调用的每个方法创建一个命令类?从客户端发送到服务器的类应该是命令类吗?在这种情况下我只需要 1 个接收器吗?- foo 类?

非常感谢您的帮助,并对这里的“foo”类名感到抱歉。我还没有任何具体的类名!

最好的祝福