Java8

2016-10-26 4 views
4
私は8

Java8

が、私は、コマンドを構築行う2つのデフォルトのメソッドを持つインターフェイスをした私は上で実行するJavaで導入された静的およびデフォルトメソッドの可能性を模索しています

サーバーをsshで実行して、いくつかの簡単なタスクをリモートで実行します。マウスを動かすには、マウスのxとyの2つの引数が必要です。

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; 
    } 
} 

だから私は、文字列でコマンドを取得することができます:

Field.AGE_FIELD.clickLeft(); 
Field.AGE_FIELD.moveMouse(Field.AGE_FIELD.x, Field.AGE_FIELD.y); 

がしかしあるMoveMouse私には本当に悪い見て、私はデフォルトで列挙型の値を使用して何とか可能であるべきだと思います。

誰もがこのような問題に対して素晴らしい解決策を持っていますか?

+4

これは概念的な問題のようです。あなたが望むのは、void moveMouse()、int getMouseTargetX()、およびint getMouseTargetY()メソッドを持つインターフェースです。現在のデザインでは、特定のx座標とy座標が求められます。私の提案では、オブジェクトにいくつかの属性があると仮定し、x座標とy座標を定義します。私の提案は、既存のシステムを拡張するものに似ています。実際にマウスを動かすコンポーネントを呼び出すコンポーネントは、インターフェイスを使用しますが、実際にはマウスを動かすためには、インターフェイスはコンポーネントに使用されます。 – Turing85

答えて

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()); 
    } 
} 

このインタフェースは、一つのターゲットに1マウスの動きを表しています。ご覧のとおり、moveMouseHere(Robot robot)メソッドは、Robotが(実際の作業を行う)移動を送信すると予想しています。私はむしろ方法にRobotインスタンスを提供する、あなたがそうであるように、私ははっきりと進まないだろう、あなたはRobotのいくつかの実装を持ちたいかもしれとして

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); 
    } 
} 
2

:今、残っているものはすべて、あなたのFields列挙型を適応させることですインターフェイスRobotを実装する代わりに列挙型を使用すると、柔軟性が高くテストが簡単になります。

列挙Field

public enum Field { 

    ... 

    public String moveMouse(Robot robot) { 
     return robot.moveMouse(x, y); 
    } 

    public String clickLeft(Robot robot) { 
     return robot.clickLeft(); 
    } 
} 

それは厳密にStrategy patternない場合でも、それはglobably同じアプローチです。

関連する問題