Java8

2016-10-26 2 views
4
내가 8

Java8

가 나는 명령을 구성 할이 개 기본 방법이있는 인터페이스를했습니다 I가 실행하는 것이 자바에 도입 된 정적 및 기본 방법의 가능성을 탐구하고 있습니다

서버를 통해 ssh를 통해 원격으로 몇 가지 간단한 작업을 수행 할 수 있습니다. 마우스를 움직이려면 두 개의 인수가 필요합니다 : 마우스의 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; 
    } 
} 

값이 사전에 내가 강력하게 그렇게도 그러나 그 열거 값의 수백 또는 수천을 포함하는 것이 무엇 인터페이스를 사용 하나에 모든 열거 형을 결합 수없는, 여러 열거 형을했습니다 그리고 그것이 어느 정도 조직 유지하려면 , 그래서 나는 여러 열거 형에서 영속적 인 것을 나눴다.

모든 enum이 동일한 메소드를 공유하기를 원하기 때문에 인터페이스의 기본 메소드를 제공 할 것이라고 생각했습니다.

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

이 인터페이스는 하나 개의 대상에게 하나의 마우스 움직임을 나타냅니다. 보시다시피 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 인터페이스를 구현하면 훨씬 더 유연하고 쉽게 테스트 할 수 있습니다.

이 엄격하게 Strategy pattern없는 경우에도 열거 Field

public enum Field { 

    ... 

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

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

, 그것은 globably 같은 접근 방식입니다.