遇到面向对象Java的问题,这是对的吗?

时间:2013-07-14 22:18:45

标签: java oop

我建立一个游戏,我决定使用GameState抽象类来组织它,所以我可以定义菜单,关卡和东西。

我有一个名为GameStateManager的类,它包含所有状态并在需要时更改它们。 在GameState构造函数中传递一个GameStateManager实例只是为了获取状态变化的方法吗?

如果没有其他方式?

4 个答案:

答案 0 :(得分:0)

  

在GameState构造函数中传递一个GameStateManager实例只是为了获取状态变化的方法是不是正确?

没有

您应该只有一个实例和一个经理参考。这意味着您应该使用基于实例的系统。例如:

GameStateManager instance = GameStateManager.getInstance();

这样你就可以静态访问它了。

这可以通过以下方式完成:

// in GameStateManager.java

private static GameStateManager instance;

protected static GameStateManager getInstance(){
    if(instance == null){
        instance = new GameStateManager(); //private constructor
    }
    return instance;
} 

我认为protected将在此处工作,因为所有GameState实例都与GameStateManager位于同一个包中。

答案 1 :(得分:0)

如果GameState可以拥有GameStateManager的集合,那么传递GameStateGameStates的实例是有意义的,因为您需要GameStateManager 管理 GameStates的{​​{1}}。

但是,如果不是这样,我认为将GameState传递给GameStateManager构造函数是有意义的。 GameState的重点是更改状态,因此,除非出现上述情况,否则GameStateManager不应用于更改其他状态,{{1应该使用。

如果您想知道如何通知GameState当前GameStateManager需要更改,您可以在GameStateManager中使用GameState方法您可以从static拨打电话以更改当前GameStateManager。如果你不想让它GameState,这是有意义的,只要你的类在同一个包中,就可以使它成为GameState。这应该适合你的目的。

答案 2 :(得分:0)

在OO中思考,您需要问问自己GameState是否在GameStateManager上具有硬依赖(组合),即如果没有GameStateManager则无法执行,然后你可以使用构造函数传递GameStateManager

如果GameStateGameStateManager上具有软依赖关系(聚合),即它可以在没有GameStateManager的情况下执行,那么您可以使用getter / setter来传递在GameStateManager

答案 3 :(得分:0)

我认为最干净的解决方案是使用observer patternGameStateManager知道所有GameStates(他是 Observer 并且必须实现{ {1}} - 他可以处理游戏状态变化逻辑的方法。

创建新的notify()后,GameState必须将自己注册为观察者:GameStateManager

newGameState.registerObserver(this)主题)发生更改时,它会调用所有侦听器的通知(例如,只有单个GameStateManager)。这样,GameState根本不需要知道GameStateManager,但只知道如果它改变了,一些观察者会通知什么。