2017-11-25 21 views
1

Player (인터페이스) 객체가있는 GameLogic 객체가 있습니다.캡슐화를 중단하지 않고 다른 객체의 메소드 호출

GameLogicgetAvailableMoves()입니다.이 코드는 GameLogic 안에 사용되어 Player의 사용 가능한 동작을 알 수 있습니다.

저는 현재 전략 중 Minimax 알고리즘을 사용해야하는 AIPlayer (구현 코드 : Player)을 구현 중입니다. 그런 일이 일어나기 위해서 AIPlayer에서 의 getAvailableMoves() 메서드를 사용할 수 있기를 원합니다. 그러나 캡슐화를 깨지 않고 그렇게하고 싶습니다. 즉, Player에 대한 참조로 GameLogic을 전달하지 않으려 고합니다.

이 시나리오에 적절한 솔루션은 무엇입니까? 나는 디자인 패턴을 사용해야한다고 생각하지만 어떤 패턴인지 모르겠습니다.

+0

당신은 서비스 클래스가 필요합니다. – SynchroDynamic

답변

0

개체에 메시지를 보내려면 개체에 일반적으로 지식이 있어야합니다 (이벤트로 구현하려는 경우를 제외하고는 어색한 것으로 보입니다). AIPlayer 클래스와 GameLogic 사이의 긴밀한 결합을 염려한다면, 그 하나의 메소드에 대해서만 인터페이스를 생성하고, GameLogic에 구현 한 다음 AIPlayer에 전달할 수 있습니다. 그렇게하면 AIPlayer의 유일한 의존성은 특정 GameLogic 구현이 아니라 인터페이스에 있습니다.

0

방법 1 :

플레이어 내부하지만 외부에서 getAvailableMoves를 호출하고 당신이 getAvailableMoves에 매개 변수로 플레이어를 통과 할 필요가 없습니다 :

class GameWorld { 

     main(){ 

     GameLogic gl = new GameLogic(); 
     AIPlayer player = new AIPlayer(); 
     player.move(gl.getAvailableMoves(player)); 

    } 
} 

GameLogic 클래스

class GameLogic { 

     public object getAvailableMoves(Player player){ 
      player.getX(); 
      player.getY(); 

      return availableMoves; 
     } 
     } 

플레이어 클래스

 class Player{ 
      float x; 
      float y; 

     } 

AIPlayer 클래스

 class AIPlayer extends Player { 
      void move(){ 

      } 

     } 

방법 2 :

는 또 다른 방법은 getAvailableMoves 정적하고 내부 플레이어 클래스에서 호출하는 것입니다.

AIPlayer 클래스

class AIPlayer extends Player { 
      void move(){ 
       GameLogic.getAvailableMoves(this); 
      } 

     } 

GameLogic 클래스

class GameLogic { 

public static object getAvailableMoves(Player player){ 
     player.getX(); 
     player.getY(); 

     return availableMoves; 
    } 
    }