我正在用 C# 设计一个游戏,我相信你明白了很多 - 但我的问题有点不同,因为我想根据我的理解围绕观察者模式设计一些东西 - 我找不到太多信息.
我所有的数据包都实现了一个名为 IPacket 的基本接口……我希望在收到某种类型的数据包时触发一个事件;无需使用大型开关。
我可能希望得到类似的东西:
networkEvents.PacketRecieved += [...]
谁能指出我这样做的方向?
我正在用 C# 设计一个游戏,我相信你明白了很多 - 但我的问题有点不同,因为我想根据我的理解围绕观察者模式设计一些东西 - 我找不到太多信息.
我所有的数据包都实现了一个名为 IPacket 的基本接口……我希望在收到某种类型的数据包时触发一个事件;无需使用大型开关。
我可能希望得到类似的东西:
networkEvents.PacketRecieved += [...]
谁能指出我这样做的方向?
像这样的东西怎么样:
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 使锁定变得多余。