我建立一个游戏,我决定使用GameState抽象类来组织它,所以我可以定义菜单,关卡和东西。
我有一个名为GameStateManager的类,它包含所有状态并在需要时更改它们。 在GameState构造函数中传递一个GameStateManager实例只是为了获取状态变化的方法吗?
如果没有其他方式?
答案 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
的集合,那么传递GameState
个GameStates
的实例是有意义的,因为您需要GameStateManager
管理 GameStates
的{{1}}。
但是,如果不是这样,我不认为将GameState
传递给GameStateManager
构造函数是有意义的。 GameState
的重点是更改状态,因此,除非出现上述情况,否则GameStateManager
不应用于更改其他状态,{{1应该使用。
如果您想知道如何通知GameState
当前GameStateManager
需要更改,您可以在GameStateManager
中使用GameState
方法您可以从static
拨打电话以更改当前GameStateManager
。如果你不想让它GameState
,这是有意义的,只要你的类在同一个包中,就可以使它成为GameState
。这应该适合你的目的。
答案 2 :(得分:0)
在OO中思考,您需要问问自己GameState
是否在GameStateManager
上具有硬依赖(组合),即如果没有GameStateManager
则无法执行,然后你可以使用构造函数传递GameStateManager
。
如果GameState
在GameStateManager
上具有软依赖关系(聚合),即它可以在没有GameStateManager
的情况下执行,那么您可以使用getter / setter来传递在GameStateManager
。
答案 3 :(得分:0)
我认为最干净的解决方案是使用observer pattern:GameStateManager
知道所有GameStates
(他是 Observer 并且必须实现{ {1}} - 他可以处理游戏状态变化逻辑的方法。
创建新的notify()
后,GameState
必须将自己注册为观察者:GameStateManager
。
当newGameState.registerObserver(this)
(主题)发生更改时,它会调用所有侦听器的通知(例如,只有单个GameStateManager)。这样,GameState根本不需要知道GameStateManager,但只知道如果它改变了,一些观察者会通知什么。