我不明白为什么Command模式在面向对象的设计中很方便.
而不是使用,例如Switch具有Lamp类的引用的Command ,我不能只创建一个Switchable抽象类并调用它的方法?
通过这种方式,我无论如何都要将调用者和接收者分离,而且我不必为每个接收者类创建一个Command对象.
任何人都可以用命令模式的简单例子来解释.我在互联网上提到但我很困惑.
我在应用程序的设计过程中,我想使用命令模式进行撤消/重做.我对命令模式进行了一些研究,但我唯一没有得到的是:命令是否应该有undo和redo方法,或者我应该创建两个单独的命令,一个用于撤销,一个用于重做,并从中调用主要命令本身?
我已经阅读了命令模式,我想我错过了一些东西.Command对象的存在是为了抽象出Receiver对象的细节.在我看来,我们可以简单地停在这里,并保持对Command对象的引用,以在适当的时间执行适当的方法.
那么,为什么需要Invoker呢?这种额外的间接提供了什么优势?我们已经隐藏了命令后面的接收器的细节,那么命令随后被客户端隐藏的动机是什么?
abstraction information-hiding design-patterns command-pattern
我第一次使用命令模式.我有点不确定我应该如何处理依赖项.
在下面的代码中,我们调度一个CreateProductCommand然后排队等待稍后执行的代码.该命令封装了执行所需的所有信息.
在这种情况下,我们可能需要访问某种类型的数据存储来创建产品.我的问题是,如何将此依赖项注入命令以便它可以执行?
public interface ICommand {
void Execute();
}
public class CreateProductCommand : ICommand {
private string productName;
public CreateProductCommand(string productName) {
this.ProductName = productName;
}
public void Execute() {
// save product
}
}
public class Dispatcher {
public void Dispatch<TCommand>(TCommand command) where TCommand : ICommand {
// save command to queue
}
}
public class CommandInvoker {
public void Run() {
// get queue
while (true) {
var command = queue.Dequeue<ICommand>();
command.Execute();
Thread.Sleep(10000);
}
} …Run Code Online (Sandbox Code Playgroud) 我已经创建了一个XML编辑器,我在最后阶段陷入困境:添加撤消/重做功能.
当用户向JTree添加元素,属性或文本时,我只需要添加undo/redo.
我现在仍然很新,但今天在学校我试图(不成功)创建两个栈对象[],称为撤消和重做,并添加执行的动作.
例如,我有:
Action AddElement() {
// some code
public void actionPerformed(ActionEvent e) {
performElementAction();
}
}
Run Code Online (Sandbox Code Playgroud)
performElementAction实际上只是向JTree添加了一个Element.
我想添加一种方法来将此操作添加到我的撤消堆栈中.是否只有一种简单的方法来实现undo.push(执行整个动作)或其他什么?
抱歉听起来像坏人,但那就是我:(
什么是动作设计模式,我之前没有听说过它?我怀疑它与命令设计模式 [维基百科] 相同,但我找不到任何资源.
目前我正在尝试在一个简单的测试项目中实现事务脚本模式(正是Martin Fowler如何使用Command Pattern 描述),一切正常,问题是我不知道如何在指定时得到结果在具体类中执行的方法,它继承自ICommand接口.
让我们向您展示一些代码,以阐明我的功能.我有一个简单的CalculateSalaryCommand类,它继承自ICommand接口
public class CalculateSalaryCommand : ICommand
{
private readonly CalculateSalaryTS _salaryTs;
private readonly int _hour;
private readonly int _salaryPerHour;
public CalculateSalaryCommand(CalculateSalaryTS salaryTs, int hour, int salaryPerHour)
{
_salaryTs = salaryTs;
_hour = hour;
_salaryPerHour = salaryPerHour;
}
public void Execute()
{
_salaryTs.CalculateSalary(_hour, _salaryPerHour);
}
}
Run Code Online (Sandbox Code Playgroud)
和一个名为CalculateSalaryTS的简单Transaction Script类
public class CalculateSalaryTS {
public void CalculateSalary(int _hour, int _salaryPerHour) {
Result = _hour * _salaryPerHour;
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我将实例传递给具体命令类,然后在Execute方法内部执行该实例的操作.好吧,一切都很好看.但有一个问题我无法返回执行方法的结果,应该是一个整数.为了解决这个问题,我决定在Transaction Script层添加一些代码,每个事务应该从一个通用ITransactionResult接口继承,如下所示:
public interface ITransactionResult<TResult>
{
TResult …Run Code Online (Sandbox Code Playgroud) 命令模式可用于实现Transactional behavior(和Undo).
但我通过谷歌搜索找不到这些例子.我只能找到一盏是一些简单的例子switched on或off.
我在哪里可以找到Java这个/这些使用Command Pattern?实现的行为的编码示例(最好是)?
command-pattern ×10
java ×3
oop ×3
.net ×1
abstraction ×1
architecture ×1
c# ×1
transactions ×1
uml ×1
undo ×1
undo-redo ×1