我正在探索java 8中引入的静态和默认方法的可能性。
我的接口有2个默认方法构建命令,我通过ssh在服务器上运行远程执行一些简单的任务。移动鼠标需要2个参数:鼠标的x和y位置。
public interface Robot {
default String moveMouse(int x, int y) {
return constructCmd("java -jar move_mouse.jar " + x + " " + y);
}
default String clickLeft() {
return constructCmd("java -jar click_left.jar");
}
static String constructCmd(String cmd) {
return "export DISPLAY=:1.0\n" +
"cd Desktop\n" +
cmd;
}
}
我有多个枚举值预设的枚举,我可以有效地将所有枚举组合成一个而不是使用界面,但是枚举将包含数百或数千个值,我想保持它有点组织,所以我已经在多个枚举中拆分了。
我希望所有枚举共享相同的方法,所以我想我会在界面中给出默认方法。
public enum Field implements Robot {
AGE_FIELD(778, 232),
NAME_FIELD(662, 280);
public int x;
public int y;
Field(int x, int y) {
this.x = x;
this.y = y;
}
}
所以我可以通过以下方式获取String命令:
Field.AGE_FIELD.clickLeft();
Field.AGE_FIELD.moveMouse(Field.AGE_FIELD.x, Field.AGE_FIELD.y);
然而,moveMouse对我来说看起来非常糟糕,我认为默认情况下应该以某种方式使用枚举值。
对于这样的问题,任何人都有一个很好的解决方案吗?
答案 0 :(得分:4)
问题在于你的架构。一方面,您有一个实际执行鼠标移动的图层(由您的Robot
界面表示)。现在,您需要一个生成鼠标移动的图层并将其发送到Robot
以执行此鼠标移动。让我们调用定义这个图层MouseTarget
的界面(很好地适合你的例子):
public interface MouseTarget {
public int getTargetX();
public int getTargetY();
public default void moveMouseHere(Robot robot) {
robot.moveMouse(this.getTargetX(), this.getTargetY());
}
}
此界面代表一个鼠标移动到一个目标。如您所见,moveMouseHere(Robot robot)
方法需要Robot
将移动发送到(实际工作)。现在,剩下的就是调整Fields
枚举:
public enum Fields implements MouseTarget {
AGE_FIELD(778, 232), NAME_FIELD(662, 280);
public int targetX;
public int targetY;
Fields(int targetX, int targetY) {
this.targetX = targetX;
this.targetY = targetY;
}
@Override
public int getTargetX() {
return (this.targetX);
}
@Override
public int getTargetY() {
return (this.targetY);
}
}
答案 1 :(得分:2)
由于您可能希望有几个Robot
的实现,我显然不会像您那样继续,我宁愿为您的枚举方法提供Robot
实例,而不是实现接口{ {1}},它会更灵活,更容易测试。
枚举Robot
Field
即使它不是严格意义上的Strategy pattern,它也是完全相同的方法。