ゲームを構築していて、メニュー、レベルなどを定義できるように、GameState 抽象クラスを使用して整理することにしました。
すべての状態を保持し、必要に応じて変更する GameStateManager というクラスがあります。状態を変更するメソッドにアクセスするためだけに、GameState コンストラクターに GameStateManager のインスタンスを渡すのは正しいですか?
そうでない場合、他の方法はありますか?
のコレクションを持つことができるifのインスタンスをGameStateコンストラクターに渡すことは理にかなっています。GameStateManagerGameStateGameStatesGameStateManagerGameStatesGameState
ただし、そうでない場合は、コンストラクターに渡しても意味がないと思います。の要点は状態を変更することなので、上記の状況を除き、他の状態を変更するために a を使用すべきではなく、 を使用する必要があります。 GameStateManagerGameStateGameStateManagerGameStateGameStateManager
GameStateManagercurrentGameStateを変更する必要があることを に通知する方法を理解しようとしている場合は、から呼び出して current を変更できるstaticメソッドを使用できます。クラスが同じパッケージ内にある限り、それを作成したくない場合は、それを作成できます。それはあなたの目的に合うはずです。GameStateManagerGameStateGameStatepublicprotected static
状態を変更するメソッドにアクセスするためだけに、GameState コンストラクターに GameStateManager のインスタンスを渡すのは正しいですか?
いいえ。
マネージャーのインスタンスと参照は 1 つだけにする必要があります。つまり、インスタンス ベースのシステムを使用する必要があります。例えば:
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 と同じパッケージにあることに基づいて、ここで動作すると思います。
最もクリーンな解決策は、オブザーバー パターンを使用することだと思います:GameStateManagerすべてを知っていますGameStates(彼はオブザーバーnotify()であり、ゲーム状態の変更のロジックを処理できるメソッドを実装する必要があります)。
新しい の作成時にGameState、GameStateManagerは次のように自分自身をオブザーバーとして登録する必要がありますnewGameState.registerObserver(this)。
GameState(サブジェクト) が変更されると、すべてのリスナーに対して通知が呼び出されます (たとえば、1 つの GameStateManager のみ)。このように、GameState は GameStateManager をまったく知る必要はありませんが、それが変更された場合に一部のオブザーバーが何を通知されるかを知っているだけです。
OO で考えると、 にGameStateハードな依存関係 (構成)があるかGameStateManagerどうかを自問する必要がありGameStateManagerますGameStateManager。
GameStateに弱い依存関係 (アグリゲーション)がある場合、GameStateManagerつまり なしGameStateManagerで実行できる場合は、getter/setter を使用して を渡すことができますGameStateManager。