【问题标题】:Implement Command Pattern Effectively有效实施命令模式
【发布时间】:2019-01-14 19:52:38
【问题描述】:

初始代码:

public void updateState(final int state)
{
    preSet();
    itsState = state;
    postSet();
}
public void setTitle(final String title)
{
    preSet();
    itsTitle = title;
    postSet();
}

在我的命令模式实现之后:

public void updateState(final int state)
{
  CallableManager.doInTransaction(new Callable<Void>()
  {
     @Override
     public Void execute()
     {
       itsHiddenNodes = hiddenNodes;
       return null;
     }
  });
}
public void setTitle(final String title)
{
  CallableManager.doInTransaction(new Callable<Void>()
  {
     @Override
     public Void execute()
     {
       itsTitle = title;
       return null;
     }
  });
}

这个接口是为传递方法作为参数创建的。

private interface Callable<T>
{
    public T execute();
}

创建这个类是为了管理命令模式。

private class CallableManager
{
    public <T> static void doInTransaction(final Callable<T> callable)
    {
        preSet();
        callable.execute();
        postSet();
    }
}

如您所见,实现命令模式看起来并不是很有效,至少对于本示例的代码行而言。对于这个例子,我实现了命令模式来逃避重复代码并减少代码行。但因此,本示例未提供这两种方法。请给我一些建议。如何有效地使用命令模式?

【问题讨论】:

  • 模式不是为了减少代码行数。你为什么要在这里使用这种模式?
  • 我知道,但我希望至少减少代码的重复。
  • 我建议您查看this primer。我想它可能会回答你的问题。
  • @Sha 这正在发生。现在doInTransaction 的逻辑在一个地方,如果你需要改变它,你必须在一个地方改变它。
  • 拥有一个模式却不知道您想用它实现什么,因此很难提出正确的实现。 updateStatesetTitle 背后的想法是什么?

标签: java design-patterns command-pattern


【解决方案1】:

lambda 可以显着减少代码重复。此外,Runnable 似乎是比Callable 更合适的接口,因为您没有返回值。

public class MainJava {
    private int state;
    private String title;

    public static void main(String... args) {
        MainJava mj = new MainJava();
        mj.setState(42);
        mj.setTitle("My Title");
    }

    public void setState(int state) {
        doInTransaction(() -> this.state = state);
    }
    public void setTitle(String title) {
        doInTransaction(() -> this.title = title);
    }

    private void doInTransaction(Runnable runnable) {
        preSet();
        runnable.run();
        postSet();
    }

    private void preSet() {
        System.out.println("preset");
    }
    private void postSet() {
        System.out.println("post-set");
    }
}

【讨论】:

    猜你喜欢
    • 2011-07-23
    • 2019-03-25
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多