应用命令模式的真实世界示例

命令模式可用于实现Transactional behavior (和Undo )。
但是我用谷歌搜索找不到这些例子。 我只能找到switched onoff灯泡的一些简单例子。
在哪里可以找到使用Command Pattern实现的/这些行为的编码示例(最好是Java )?

在我们的一个项目中,我们有以下要求:

  1. 在DB中创建记录。
  2. 调用服务以更新相关记录。
  3. 调用另一个服务来记录故障单。

为了以事务方式执行此操作,每个操作都实现为具有撤消操作的命令。 在每个步骤结束时,命令被压入堆栈。 如果操作在某个步骤失败,那么我们从堆栈中弹出命令并在弹出的每个命令上调用undo操作。 每个步骤的撤消操作都在该命令实现中定义,以反转先前的command.execute()。

希望这可以帮助。

 public final class Ping implements Callable { private final InetAddress peer; public Ping(final InetAddress peer) { this.peer = peer; } public Boolean call() { /* do the ping */ ... } } ... final Future result = executorService.submit(new Ping(InetAddress.getByName("google.com"))); System.out.println("google.com is " + (result.get() ? "UP" : "DOWN")); 

命令模式在很多地方使用。

  1. 当然,你到处看到的是一个非常简单的GUI实现示例,交换机。 它也被广泛用于游戏开发。 使用此模式,用户也可以在屏幕上配置他的按钮。
  2. 如果必须将命令传递到另一端,它也在网络中使用。
  3. 当程序员想要存储用户执行的所有命令时,例如有时游戏可以让你重放整个关卡。
  4. 它用于实现回调。

这是一个站点,它提供了用于回调的命令模式的示例。 http://www.javaworld.com/article/2077569/core-java/java-tip-68–learn-how-to-implement-the-command-pattern-in-java.html?page=2

  1. 这是另一个显示命令模式与数据库的链接。 代码在C#中。 http://www.codeproject.com/Articles/154606/Command-Pattern-at-Work-in-a-Database-Application

You have to define undo(), redo() operations along with execute() in Command interface itself

例:

 interface ChangeI { enum State{ READY, DONE, UNDONE, STUCK } ; State getState() ; void execute() ; void undo() ; void redo() ; } 

ConcreteCommand类中定义一个State。 根据execute ()方法之后的当前状态,您必须决定是否应将命令添加到Undo StackRedo Stack并相应地做出决定。

 abstract class AbstractChange implements ChangeI { State state = State.READY ; public State getState() { return state ; } public void execute() { assert state == State.READY ; try { doHook() ; state = State.DONE ; } catch( Failure e ) { state = State.STUCK ; } catch( Throwable e ) { assert false ; } } public void undo() { assert state == State.DONE ; } try { undoHook() ; state = State.UNDONE ; } catch( Failure e ) { state = State.STUCK ; } catch( Throwable e ) { assert false ; } } public void redo() { assert state == State.UNDONE ; try { redoHook() ; state = State.DONE ; } catch( Failure e ) { state = State.STUCK ; } catch( Throwable e ) { assert false ; } } protected abstract void doHook() throws Failure ; protected abstract void undoHook() throws Failure ; protected void redoHook() throws Failure { doHook() ;} ; } 

看看这个undo-redo命令文章,以便更好地理解。