1

私はC#でゲームを設計していますが、あなたはそれをたくさん手に入れると確信しています-しかし、私の理解のためにオブザーバーパターンの周りに何かを設計したいという点で私の質問は少し異なります-そして私はそれについて多くの情報を見つけることができません。

私のすべてのパケットは、IPacketと呼ばれる基本的なインターフェイスを実装しています...そして、特定のタイプのパケットが受信されたときにイベントを発生させることを望んでいました。大規模なスイッチを使用せずに。

私はおそらく次のようなものを望んでいました:

networkEvents.PacketRecieved + = [...]

誰かがこれを行う方向に私を向けることができますか?

4

1 に答える 1

5

このようなものはどうですか?

public interface IPacket
{

}

public class FooPacket: IPacket {}

public class PacketService
{
    private static readonly ConcurrentDictionary<Type, Action<IPacket>> _Handlers = new ConcurrentDictionary<Type, Action<IPacket>>(new Dictionary<Type, Action<IPacket>>());

    public static void RegisterPacket<T>(Action<T> handler)
        where T: IPacket
    {
        _Handlers[typeof (T)] = packet => handler((T) packet);
    }

    private void ProcessReceivedPacket(IPacket packet)
    {
        Action<IPacket> handler;
        if (!_Handlers.TryGetValue(packet.GetType(), out handler))
        {
            // Error handling here. No packet handler exists for this type of packet.
            return;
        }
        handler(packet);
    }
}

class Program
{
    private static PacketService _PacketService = new PacketService();
    static void Main(string[] args)
    {
        PacketService.RegisterPacket<FooPacket>(HandleFooPacket);
    }

    public static void HandleFooPacket(FooPacket packet)
    {
        // Do something with the packet
    }
}

作成するパッケージのタイプごとに、そのタイプのパケットに固有のハンドラーが登録されます。ConcurrentDictionaryを使用すると、ロックが不要になります。

于 2011-10-22T21:06:23.057 に答える