问题标签 [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 回答
384 浏览

c# - 命令模式的丑陋体验:OOP 有什么意义?

我在我的系统中实现了一个命令模式,主要是因为我有几个层,我需要远程“调用”逻辑。

如您所见,我基本上收到一条消息,将其转换为方法调用,然后将其转换回发送到另一层的消息。

我觉得这里有问题。

我最终重构了 MyObject 以删除所有方法,并用一个简单的 ProcessMessage 方法替换它们,该方法接收一条消息,翻译它,然后分派它。

这没关系,除了 MyObject 最终大部分只是转换代码,而不是“对象”......

为了进行单元测试,我必须继续调用 ProcessMessage() 而不是直接调用方法。

我正在寻找关于“消息传递和转换”与“消息 -> 方法 -> 消息”方法之间的这场战斗的想法。显然消息和方法是密切相关的。

0 投票
4 回答
1182 浏览

c# - C#中的命令模式和复杂操作

我正在用 C# 编写一个需要支持撤消/重做的程序。为此,我选择了命令模式;tldr,操作文档状态的每个操作都必须由一个 Command 对象执行,该对象知道文档的先前状态以及需要进行的更改,并且能够自行执行/撤消。

它适用于简单的操作,但我现在有一个操作会同时影响文档的多个部分。同样,Command 对象必须足够聪明,知道它需要保留的所有旧状态,以防它需要撤消。

问题是如果有人试图直接调用接口,使用公共接口暴露所有状态有可能被滥用,这可能导致状态损坏。我的直觉告诉我这样做的最面向对象的方法是公开专门的 Command 类——而不是让您直接操作文档的状态,您所能做的就是要求文档创建一个可以访问其的 Command 对象内部状态,并保证足够了解以正确支持撤消/重做。

不幸的是,C# 不支持朋友的概念,所以我无法创建一个可以访问文档内部的 Command 类。有没有办法将文档类的私有成员暴露给另一个类,或者有没有其他方法可以做我需要的事情而不必暴露很多文档内部?

0 投票
1 回答
346 浏览

wpf - WPF 中的独立命令对象

将 WPF 命令实现为独立对象是否可能/可行?如果是这样,这通常是如何完成的?我看到的大多数关于命令的示例通常涉及使用 RoutedCommand、RoutedUICommand 或 ICommand 的其他一些实现,例如 RelayCommand。这些命令在 MVVM 模式中的工作方式是通过属性公开这些命令类型之一的实例。在 ViewModel 内部,命令的逻辑被实现为 ViewModel 上的一个方法,然后作为委托传递给命令对象。

据我了解,“经典”命令模式是将每个命令实现为它自己的独立对象,例如 OpenCustomerViewCommand。由于逻辑将完全封装在它自己的对象中,因此它可能会在我的应用程序的其他部分中重用。例如,如果我可以从我的应用程序中的多个位置打开 CustomerView,那么能够简单地在可以访问 CustomerView 的每个 ViewModel 上创建 OpenCustomerViewCommand 的实例可能会有所帮助,而不是将该方法复制并粘贴到每个 ViewModel ,并将委托传递给 RelayCommand。如果我理解正确,预定义的应用程序命令(例如剪切和粘贴)会以这种方式运行。

对我来说,必须在 ViewModel 中提供逻辑似乎会降低命令模式的价值。我想我并不真正理解这样做与背后的代码实现 UI 事件的命令处理程序之间的主要区别。有什么理由我应该使用 RoutedCommand 模式而不是我上面描述的更经典的方法?

0 投票
1 回答
569 浏览

asp.net-mvc-3 - 执行前验证命令

在我目前正在构建的系统中,我使用命令模式来执行所有可能的操作。我选择了 CommandMessage 和 CommandHandler 方法,将逻辑与数据分开。这目前工作正常,但我遇到了一个问题 - 验证。

我如何实际验证命令是否可以执行?

现在我CanExecute(ICommandExecutionContext context)对每个命令都有一个,让它负责确定它是否可以执行。然后在每个命令中对AICommandExecutionContext进行类型检查,以查看它是否属于正确的上下文类型,然后检查信息是否使命令在该上下文中可执行。

一切都被包装在一个ICommandService可以根据它们的名称、上下文和消息验证和执行命令的容器中。除此之外,它还发布有关命令执行的事件,并执行权限检查。

问题源于 UI(一个 ASP.NET MVC 3 应用程序)。我只想在每个视图中显示有效的命令,但我没有想出一个我真正喜欢的解决方案。目前我的控制器询问命令服务,一个命令是否可以执行,给定一个具体的上下文,如下所示:

对于适用于具体域对象的其他类型的命令,我使用相同的命令服务方法,但在不同的上下文中传递域对象 ID,如下所示:

我想上面的内容现在还可以,虽然不是很干。但我想要完成的是根据 CanExecute 的结果禁用操作链接。

我怎样才能做到这一点?

我决定对每个视图上的所有命令链接进行“硬编码”,因此我不必传递命令名称的集合等 - 这条路径太难了(除非有人有一个聪明的主意;)

我当前的堆栈包括 NHibernate、Castle Windsor、ASP.NET MVC 3、AutoMapper。

0 投票
3 回答
19891 浏览

c# - 使用命令和工厂设计模式执行排队作业

我有一个在数据库中排队的作业列表,我需要从数据库中读取并使用线程并行执行它们,并且我有一个命令类列表来执行所有这些作业,这些作业都实现了一个通用接口(命令模式)。但是当我从数据库中检索待处理的作业时,我需要为每个作业实例化正确的命令对象,就像这样(在工厂类中)

有没有更好的方法来创建正确的命令对象而不使用像上面这样的大 switch 语句?或者是否有任何其他模式可以执行排队的作业?

解决方案:像这样解决(基于选择的答案)。这将对命令对象进行延迟实例化。

0 投票
2 回答
11714 浏览

c# - 获取命令模式中执行方法的结果

目前我正在尝试在一个简单的测试项目中实现事务脚本模式(正是 Martin Fowler使用Command Pattern描述的方式),一切正常,问题是我不知道如何在指定时获得结果在继承自 ICommand 接口的具体类中执行的方法。

让我们给你看一些代码来阐明我有什么功能。我有一个从 ICommand 接口继承的简单 CalculateSalaryCommand 类

和一个名为 CalculateSalaryTS 的简单事务脚本类

如您所见,我将实例传递给具体的命令类,然后在 Execute 方法中我从该实例执行操作。好吧,一切看起来都很好。但是有一个问题我不能返回应该是整数的执行方法的结果。为了解决这个问题,我决定向事务脚本层添加一些代码,每个事务都应该从通用ITransactionResult接口继承,如下所示:

然后 CalculateSalaryTS 类变成了这样:

用法 :

我知道这种方式有其自身的局限性,但在您给我另一个想法来处理这种情况之前,我别无选择。

提前致谢。

0 投票
6 回答
30672 浏览

design-patterns - 回调/命令与 EventListener/Observer 模式

我正在尝试设计一个异步框架,并想知道人们认为回调模式与观察者模式的优缺点。

我正在使用一个似乎同时使用这两种模式的框架。EventListener 模式不是典型的模式,因为它没有侦听器列表。这可以很容易地通过创建一个 CompositeListener 来实现,它在侦听器的优先级上具有自己的语义以及如何处理事件到每个侦听器的分配,例如为每个侦听器与串行通知生成一个新线程。(我实际上认为这是一个好主意,因为它很好地分离了关注点,并且是对标准观察者/听众模式的改进)。

关于什么时候应该使用它们有什么想法吗?

谢谢。

0 投票
3 回答
869 浏览

c# - 实现命令模式和多态

我想实现一个命令模式。我有以下内容:

和程序:

这按预期工作。当我想扩展 State 类时,我的问题就开始了:

现在该操作必须将更改应用于ExtendedState. 所以我想我会创建一个扩展动作,它有两个额外的函数ExtendedState作为参数:

这是我已经不喜欢的东西,因为实现接口的函数变得多余。此外,我需要Execute在我的中创建一个ExtendedState使用新类型而不是 IAction 的新函数(否则将调用未实现的函数)。

我相信它可以以一种很好的 OO 方式完成。你能帮我吗?目的是创建一个可扩展的 State 类和 IAction 接口(甚至可能是通用的,我不知道),所以我可以扩展State但保持通用功能而无需额外编码。

0 投票
1 回答
1029 浏览

c# - 带有命令模式部分的进度条 C# -1

我必须在 EXT.NET 中实现一个进度条。在处理事务时,我有一个命令“Process”。我必须跟踪失败和成功的事务和事务的总数。例如“总共有 60 笔交易。12 笔失败,48 笔成功”)。

我现在的问题是,我可以使用命令模式来实现吗?我不是要代码,但我想知道它是否有意义。

这样做的原因是我必须为分配实现一些设计模式。

http://en.wikipedia.org/wiki/Command_pattern应用程序之一是进度条)

PS:

如果有人有使用命令模式实现的进度条示例,请随时发布:P

0 投票
4 回答
1385 浏览

java - 如何像在 C++ 中一样使用 Java 中的命令模式?

我最近在用 C++ 开发一个游戏,我在其中实现了命令模式来管理键盘输入以控制宇宙飞船。在实例化所有命令时,我会将飞船指针传递给每个构造函数,以便所有命令都使用同一个飞船对象。

这种模式在 C++ 中是有意义的,因为您可以通过引用传递,但在 Java 中,一切都是按值传递。如果我尝试在 Java 中实现相同的东西,我将如何让每个命令指向同一个对象?

在我看到的所有关于 Java 中使用的命令模式的示例中,每个命令的成员变量是副本还是引用都没有区别。