初始代码:
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;
}
});
}
此接口是通过pass方法作为参数创建的。
private interface Callable<T>
{
public T execute();
}
创建此类来管理命令模式。
private class CallableManager
{
public <T> static void doInTransaction(final Callable<T> callable)
{
preSet();
callable.execute();
postSet();
}
}
如您所见,至少在此示例的代码行中,实现命令模式看起来并不十分有效。在此示例中,我实现了命令模式来避免重复的代码并减少代码行。但是结果是,在此示例中未同时提供它们。请给我一些建议。如何有效使用命令模式?
最佳答案
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");
}
}