2017-11-25 10 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; 
    } 
    } 
相關問題