編集 Liosanの答えはよりセクシーです。それに見る。
Markusが言ったように、メッセージはオブジェクトプールの一般的な候補ではありません。彼が述べた理由でそれを気にしないでください。ゲームが特定のタイプのメッセージを大量に送信する場合、おそらくそれは価値があります。しかし、その時点で、直接メソッド呼び出しに切り替えることをお勧めします。
そういえば、
特定の受信者にメッセージを送信できませんが、ゲームではまだ必要ないので、あまり気にしません。
送信したい特定の受信者がわかっている場合、そのオブジェクトへの参照を取得して直接メソッドを呼び出すのは簡単ではないでしょうか。システム間のアクセスを容易にするために、マネージャークラスの背後に特定のオブジェクトを隠すこともできます。
実装には1つの欠点があり、多くのオブジェクトが本当に気にしないメッセージを受け取る可能性があるということです。理想的には、クラスは実際に気にするメッセージのみを受信します。
を使用して、HashMap<Class, LinkedList<Messagable>>
メッセージタイプを、そのタイプのメッセージを受信するオブジェクトのリストに関連付けることができます。
メッセージタイプをサブスクライブすると、次のようになります。
globalMessageQueue.subscribe(PlayerDiedMessage.getClass(), this);
あなたはsubscribe
そのように実装することができます(私にいくつかの間違いを許してください、数年でJavaを書いていない):
private HashMap<Class, LinkedList<? extends Messagable>> subscriberMap;
void subscribe(Class messageType, Messagable receiver) {
LinkedList<Messagable> subscriberList = subscriberMap.get(messageType);
if (subscriberList == null) {
subscriberList = new LinkedList<? extends Messagable>();
subscriberMap.put(messageType, subscriberList);
}
subscriberList.add(receiver);
}
そして、次のようなメッセージをブロードキャストできます。
globalMessageQueue.broadcastMessage(new PlayerDiedMessage(42));
そしてbroadcastMessage
、このように実装することができます:
void broadcastMessage(Message message) {
Class messageType = message.getClass();
LinkedList<? extends Messagable> subscribers = subscriberMap.get(messageType);
for (Messagable receiver : subscribers) {
receiver.onMessage(message);
}
}
メッセージ処理をさまざまな匿名関数に分割できるようにメッセージをサブスクライブすることもできます。
void setupMessageSubscribers() {
globalMessageQueue.subscribe(PlayerDiedMessage.getClass(), new Messagable() {
public void onMessage(Message message) {
PlayerDiedMessage msg = (PlayerDiedMessage)message;
if (msg.livesLeft <= 0) {
doSomething();
}
}
});
globalMessageQueue.subscriber(EnemySpawnedMessage.getClass(), new Messagable() {
public void onMessage(Message message) {
EnemySpawnedMessage msg = (EnemySpawnedMessage)message;
if (msg.isBoss) {
freakOut();
}
}
});
}
少し冗長ですが、整理に役立ちます。すべてについて聞きたいのsubscribeAll
個別のリストを保持する2番目の関数を実装することもできMessagable
ます。