13

命令模式可以用来实现Transactional behavior(和Undo)。
但是我无法通过谷歌搜索找到这些示例。我只能找到一些微不足道的灯的例子,即switched onoff
我在哪里可以找到Java使用 ? 实现的这种/这些行为的编码示例(最好在 中)Command Pattern

4

4 回答 4

24

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

  1. 在数据库中创建记录。
  2. 调用服务来更新相关记录。
  3. 调用另一个服务来记录工单。

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

希望这可以帮助。

于 2012-08-28T06:25:13.137 回答
2
public final class Ping implements Callable<Boolean> {

  private final InetAddress peer;

  public Ping(final InetAddress peer) {
    this.peer = peer;
  }

  public Boolean call() {
    /* do the ping */
    ...
  }
}
...
final Future<Boolean> result
    = executorService.submit(new Ping(InetAddress.getByName("google.com")));
System.out.println("google.com is " + (result.get() ? "UP" : "DOWN"));
于 2012-08-28T06:23:55.657 回答
2

命令模式用在很多地方。

  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
于 2015-03-24T11:25:51.703 回答
0

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在你的类中定义一个状态。根据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() ;} ; 
}

请查看此撤消重做命令文章以更好地理解。

于 2016-02-28T17:28:24.103 回答