我正在构建一个游戏,我决定使用 GameState 抽象类来组织它,这样我就可以定义菜单、关卡和其他东西。
我有一个名为 GameStateManager 的类,它保存所有状态并在需要时更改它们。将 GameStateManager 的实例传递给 GameState 构造器是否正确,只是为了访问他的状态更改方法?
如果没有,还有其他方法吗?
将 GameStateManager 的实例传递给 GameState 构造器是否正确,只是为了访问他的状态更改方法?
不。
您应该只拥有一个经理实例和一个引用。这意味着您应该使用基于实例的系统。例如:
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 在同一个包中。
将 a的实例GameState
传递给构造函数是有意义的,如果它可以拥有 的集合,因为您需要 a来管理。GameStateManager
GameState
GameStates
GameStateManager
GameStates
GameState
但是,如果不是这种情况,我认为将 传递给构造函数是没有意义的。的全部意义在于改变状态,因此,除非出现上述情况,否则不应使用 a 来更改其他状态,而应使用 the。 GameStateManager
GameState
GameStateManager
GameState
GameStateManager
如果您想弄清楚如何通知GameStateManager
currentGameState
需要更改,您可以有一个static
方法GameStateManager
,您可以调用 fromGameState
来更改 current GameState
。如果你不想做public
,这是有道理的,只要你的类在同一个包中,你就可以做到protected static
。这应该适合您的目的。
在OO中思考,您需要问自己是否对ieGameState
有硬依赖(组合),GameStateManager
如果没有它就无法执行GameStateManager
,那么您可以使用构造函数来传递GameStateManager
。
如果对 ieGameState
具有软依赖(聚合),GameStateManager
即它可以在没有的情况下执行GameStateManager
,那么您可以使用 getter/setter 传递GameStateManager
。
我认为最干净的解决方案是使用观察者模式:GameStateManager
知道所有GameStates
(他是观察者并且必须实现notify()
他可以处理游戏状态更改逻辑的 - 方法)。
在创建新GameState
的 时,GameStateManager
必须像这样将自己注册为观察者newGameState.registerObserver(this)
:
当一个GameState
(主题)改变时,它会为所有的监听器(例如,只有一个 GameStateManager)调用 notify。这样,GameState 根本不需要知道 GameStateManager,而只知道如果它发生了变化,一些观察者需要通知什么。