2017-11-25 354 views
1

我有一个对象GameLogic,它有一个Player(接口)对象。在不破坏封装的情况下调用不同对象的方法

GameLogic有一个方法getAvailableMoves()它用于内部GameLogicPlayer知道他可以移动。

我目前正在执行一个AIPlayer(执行Player),它应该使用Minimax算法作为策略。为了实现这一点,我希望能够从AIPlayer内部使用GameLogicgetAvailableMoves()方法。但是,我希望在不破坏封装的情况下做到这一点。也就是说,我试图避免传递GameLogic作为参考Player

这种情况下适合的解决方案是什么?我假设我应该使用设计模式,但我不确定哪一个。

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

Player类

 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; 
    } 
    } 
相关问题