问题标签 [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.
java - Guava 中有什么类似于函数式 Java 的效果吗?
我知道纯函数式编程的目标之一是消除可变性,从而排除副作用。但是让我们面对现实吧,即使存在所有的函数式编程库,Java 也不是一种函数式语言。事实上,一些 FP 库似乎知道并期待这一点。例如在函数式 Java 中,有Effect
类。在 Jedi FP 库中,有Command
接口。这允许您 - 除其他外 - 将具有类型安全性的命令模式应用于 an 的元素,Iterable
而无需讨厌的 for 循环样板。
所以问题是,番石榴中是否有类似的东西?
在接受澄清后编辑
我正在开发一个框架,在某些情况下帮助解决大多数 Java FP 库中固有的“垂直问题”。因此,我实际上不会制作如上所示的代码示例:即,显式声明一个新的类实现及其Command
所有垂直噪声 icky-ness,只是为了在声明之后立即应用它。
我更多地考虑实际命令模式的思路,其中可能在其他地方声明了几个可能的命令,并且只有其中一个被传递到想要迭代应用它的代码中。此外,我的框架的目标是让创建函数式接口对象(函数、谓词、命令、其他简单的 lambdas)更加地道,而无需简单地将垂直问题移到其他地方。我早就意识到这不在 Guava 的范围内。但由于其他 FP 库中提供了类似命令的界面,我只是想知道 Guava 中是否存在类似物。
使用我的框架的更完整的代码示例可能是这样的:
java - Java中命令模式用于保存/加载的用法
我正在用 Java 实现一个基本的棋盘游戏,我很难决定解决的利弊。我已经成功地利用命令模式在游戏中启用撤消功能,并且最初打算通过序列化整个游戏模型对象集来实现游戏保存/加载。
但是我意识到,由于游戏是一个棋盘游戏,不涉及随机元素并且总是以相同的状态初始化,我可以通过简单地序列化包含命令堆栈和命令本身的对象来实现保存/加载功能,并且然后重新执行所有命令以将游戏带到保存的位置。
我当前的设计不允许我这样做,因为我的命令包含对构成我的板的图块和块的对象实例的引用,我认为这是最佳 OO 实践。这意味着我还必须序列化这些模型对象,这将破坏仅序列化命令并执行它们的目的。我的问题是,让命令只保存棋盘图块的整数位置是否会被认为是不好的做法。
我的 Command 类代码的相关部分:
我打算将 Tile 引用更改为对称为 TileLocation 的新可序列化类的引用或类似的东西,它将保存一个 X 和 Y 整数,以便板可以找到瓷砖。
c++ - 命令模式队列按时间排序?
我正在更改一些代码以使用命令模式并将命令对象存储在队列中。这些命令需要在特定时间执行,因此我将每秒遍历列表一次以查找要执行的命令。
每个命令对象都会有一个时间,我将根据当前时间检查这个时间(在一个小阈值内)。因此,如果时间匹配,我需要从列表中删除命令对象,然后执行它。通常在任何给定时间都会有不到 10 个命令。我应该使用什么集合数据结构以及如何在迭代列表时删除命令对象?
design-patterns - 命令模式不仅仅是适配器吗?
根据 GoF 命令模式 UML,在我看来,ConcreteCommand只是使Reciever适应通用命令(可能是)接口。我可能被金锤击中了,所以请解释一下区别在哪里或者我做错了什么。
java - Java中命令模式的接口
是否有一个库已经提供了我们在 Java 中的命令模式所需的接口?
例如:
谢谢。
c# - 我对我的案例使用策略模式还是命令模式?
我有两种正在实现的算法:
- 与向量值和
- 使用矩阵值的算法B
算法的共同点:
- 两者都是提供相同输入序列的“求和”算法。算法在是否考虑特定值方面略有不同。它们在每个序列值要执行的计算方面也有所不同。
- 两种算法都被同一个对象引用(例如
Antenna
,使用算法进行传输或接收的“ ”)。 - 在这两种情况下,我都希望能够序列化 Vector 或 Matrix 结果。此外,我应该能够使用从较早一代计算的(反序列化的)向量/矩阵值来初始化任何算法。
我首先尝试使用策略模式来实现上述内容,但很快我意识到策略模式可能不是最好的,因为类型/值不同。更复杂的是,我的 ' Antenna
' 对象可以在任一方向使用任何算法:
我觉得它多次重复了“发送”和“接收”的概念(因为AlgorithmA
实现了 IAlgorithm 的 ' AlgorithmATransmit
' 和 ' AlgorithmAReceive
' 本身具有派生类型,即在同一算法中根据方向略有不同)。
我还希望算法逻辑和序列化数据之间有一个更清晰的分离。
我很高兴听到您对此的意见。谢谢 !
c# - 理解没有 MVVM 的 ICommand 实现
我正在尝试了解如何使用命令。我读了很多关于命令的文章,而且我知道,大多数时候命令都是在 MVVM 模式中使用的。我也知道,有一个 RoutedCommand 类 - 它通常用于在开发时节省时间。
但是 - 我想了解基础知识 - 这正是问题所在。开始了:
在我的应用程序中,我定义了一个类 'MyCommand' :
好吧 - 为了获得静态访问,我决定为所有应用程序命令创建一个类:
就快到了。现在我在我的主窗口中放了两个按钮。其中之一是“绑定”到命令:
这是 MainWindow.cs :
所以 - 让我们运行我的项目。如您所见,我做了一些控制台输出。如果我点击button2,输出是:
CanExecute 调用!执行调用!CanExecute 调用!MyEventHandler 调用
所以,在我看来,这就是发生的事情:1.)按钮上的命令被“激活”。要检查是否应调用执行方法,请调用 CanExecute 方法。2.) 如果 CanExecute 方法返回 true,则调用 Execute 方法。3.) 在执行方法中,我定义应该引发事件“CanExecuteChanged”。调用它将首先检查“CanExecute”,然后调用事件处理程序。
这对我来说不是很清楚。调用事件的唯一方法是在 Execute 方法中。但是在检查 CanExecute 之后通过命令逻辑调用 Execute 方法。调用事件也会检查 CanExecute,但为什么呢?我很困惑。
当我尝试禁用该按钮时,事情变得更加混乱。可以说,有一个“CommandParameter” - 现在“CanExecute”可以使用它。因此,该方法可能返回 false。在这种情况下,按钮被禁用 - 好的。
但是:我如何重新激活它?正如我们已经知道的:我只能在我的命令类中引发 CanExecuteChange 事件。所以 - 由于我们无法单击禁用按钮 - 该命令不会调用 CanExecute(甚至是 Execute)方法。
在我看来,有些重要的东西我看不到——但我真的找不到。
请你帮助我好吗?
winforms - 如何使用 WinForms、MVP 和命令处理菜单
我有一个基于 WinForm 的解决方案,正在使用 MVP 实现。
我们有菜单,每个菜单都应该使用一个命令,并且还有其他机制可以调用命令。
现在.. 从视图的具体实现来看,视图元素(菜单、按钮等)使用 CommandBinder 绑定到命令。
我的问题是如何将 Presenter 链接到命令?
每个命令都应该调用 Presenter 各自的函数吗?每个 Presenter 都应该拥有命令并从那里被调用吗?
android - 传递应用程序活动方法的命令模式?
在阅读了@RomainGuy 的避免内存泄漏文章后,我意识到我当前的 Android 应用程序被传递应用程序的主要活动的错误所困扰。因此,无论何时,我都可以简单地用Activity.getApplicationContext()替换该活动参数。
但是我的应用程序中的某些类仍然需要运行只能是应用程序主活动成员的方法。
因此,我在考虑可能使用命令模式来解决这个限制。
问题是,如果我们看那个例子:
我再次陷入需要绕过活动的死胡同(这次伪装成Object
数据)。
我该如何摆脱这种“鸡与蛋”的局面?
有没有更好的方法来解决这个问题?
design-patterns - 命令模式不是依赖倒置原则的实现吗?
命令模式具有三个主要组件:调用者、命令和接收者。Client 向Invoker提供调用ReceiverM
上 的特定方法所需的信息,而实际调用的是Command对象(由Receiver提供)。M
a) 为了实现CP,我们必须将Invoker 的逻辑与命令的数量分离,这样当我们增加命令的数量时,Invoker类就不必改变。我们通过让Command对象和Invoker依赖于抽象(即接口)来做到这一点。
因此,CP不只是DIP的特定实现吗?
b) 如果CP确实是DIP的实现,那么CP与其他类型的DIP实现究竟有什么不同?也就是说,我们不能说所有其他的DIP实现也有Invoker对象(即更高级别的模块)、Command对象(即为更高级别的模块提供行为的依赖项),而 Receiver 将被视为依赖对象的任何方法(即较低级别的模块)调用?
谢谢你
编辑:
一个)
依赖对象将依赖项保持为一个字段,并将其用于所有后续方法调用。
如果依赖对象不将此依赖项保留为字段,因此它不会将其用于所有后续调用,而是始终接收新的依赖项对象,那么我们是否可以争辩说我们有一个CP而不是DI?
反之亦然——如果 Invoker 总是调用相同的命令对象,那么我们是否可以争辩说我们有DI而不是CP,而不管实际执行的工作命令对象是什么?
b)我理解你试图表达的观点,但我仍然在区分什么是行为和什么是命令时遇到了一些重大问题。在我看来,将命令传递给 Invoker 也可以解释为注入依赖对象完成其工作所需的行为。是真的那么明确还是更主观?因此,我们如何判断一个对象所做的工作是命令还是行为?