在不破坏封装的情况下调用不同对象的方法

时间:2017-11-25 18:29:28

标签: oop design-patterns encapsulation

我有一个对象GameLogic,它有一个Player(接口)对象。

GameLogic有一个方法getAvailableMoves(),可在GameLogic内使用,让Player了解他的可用动作。

我目前正在实施一个AIPlayer(实现Player),它应该使用Minimax算法作为策略。为此,我希望能够在GameLogic内使用getAvailableMoves()的{​​{1}}方法。但是,我想在不打破封装的情况下这样做。也就是说我试图避免将AIPlayer作为对GameLogic的引用。

此方案的适当解决方案是什么?我假设我应该使用设计模式,但我不确定哪个。

2 个答案:

答案 0 :(得分:0)

如果您希望能够向对象发送消息,那么您的对象通常需要了解它(除非您想将其实现为事件,这看起来很尴尬)。如果您担心在AIPlayer类和GameLogic之间创建紧密耦合,您可以为该方法创建一个接口,让GameLogic实现它,然后将其传递给AIPlayer。这样,AIPlayer唯一的依赖是接口,而不是特定的GameLogic实现。

答案 1 :(得分: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;
     }
    }