ゲームを構築していて、メニュー、レベルなどを定義できるように、GameState 抽象クラスを使用して整理することにしました。
すべての状態を保持し、必要に応じて変更する GameStateManager というクラスがあります。状態を変更するメソッドにアクセスするためだけに、GameState コンストラクターに GameStateManager のインスタンスを渡すのは正しいですか?
そうでない場合、他の方法はありますか?
のコレクションを持つことができるifのインスタンスをGameState
コンストラクターに渡すことは理にかなっています。GameStateManager
GameState
GameStates
GameStateManager
GameStates
GameState
ただし、そうでない場合は、コンストラクターに渡しても意味がないと思います。の要点は状態を変更することなので、上記の状況を除き、他の状態を変更するために a を使用すべきではなく、 を使用する必要があります。 GameStateManager
GameState
GameStateManager
GameState
GameStateManager
GameStateManager
currentGameState
を変更する必要があることを に通知する方法を理解しようとしている場合は、から呼び出して current を変更できるstatic
メソッドを使用できます。クラスが同じパッケージ内にある限り、それを作成したくない場合は、それを作成できます。それはあなたの目的に合うはずです。GameStateManager
GameState
GameState
public
protected 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
。