在不破坏封装的情况下调用不同对象的方法
问题描述:
我有一个对象GameLogic
,它有一个Player
(接口)对象。在不破坏封装的情况下调用不同对象的方法
GameLogic
有一个方法getAvailableMoves()
它用于内部GameLogic
让Player
知道他可以移动。
我目前正在执行一个AIPlayer
(执行Player
),它应该使用Minimax算法作为策略。为了实现这一点,我希望能够从AIPlayer
内部使用GameLogic
的getAvailableMoves()
方法。但是,我希望在不破坏封装的情况下做到这一点。也就是说,我试图避免传递GameLogic
作为参考Player
。
这种情况下适合的解决方案是什么?我假设我应该使用设计模式,但我不确定哪一个。
答
如果你想能够发送消息到一个对象,你的对象通常需要有一些知识(除非你想实现它作为一个事件,这似乎很尴尬)。如果您担心在AIPlayer类和GameLogic之间创建紧密耦合,您可以为该方法创建一个接口,让GameLogic实现它,然后将其传递给AIPlayer。这样,AIPlayer的唯一依赖是在接口上,而不是在特定的GameLogic实现上。
答
方法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;
}
}
您将需要一个服务类。 – SynchroDynamic