Сетевой поток
Я разрабатываю игру на C#, я уверен, что вы многое понимаете - но мой вопрос немного отличается в том, что я хочу разработать что-то вокруг шаблона наблюдателя, насколько я понимаю, - и я не могу найти много информации о нем,
Все мои пакеты реализуют базовый интерфейс, называемый IPacket... и я надеялся запустить событие, когда был получен пакет определенного типа; без использования массивного переключателя.
Возможно, я надеялся на что-то вроде:
networkEvents.PacketRectained += [...]
Кто-нибудь может указать мне направление, чтобы сделать это?
1 ответ
Решение
Как насчет чего-то вроде этого:
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 делает блокировку лишней.