Сетевой поток - PullRequest
       32

Сетевой поток

1 голос
/ 23 октября 2011

Я занимаюсь разработкой игры на C #, я уверен, что вы многое поняли, но мой вопрос немного другой в том, что я хочу создать что-то, похожее на шаблон наблюдателя, в моем понимании - и я не могу найти много информации это.

Все мои пакеты реализуют базовый интерфейс, называемый IPacket ... и я надеялся запустить событие, когда был получен пакет определенного типа; без использования массивного переключателя.

Возможно, я надеялся на что-то вроде:

networkEvents.PacketRectained + = [...]

Может ли кто-нибудь указать мне направление, чтобы сделать это?

1 Ответ

5 голосов
/ 23 октября 2011

Что-то вроде этого:

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 делает блокировку лишней.

...