我正在解析UDP流中的一些输入。该协议有点像二进制查询字符串。它将发送一个代码字节,告诉您如何读取以下字节。例如,代码值为1可能意味着接下来的4个字节是一个旨在成为ID的int,值为2可能意味着接下来的4个字节是一个意味着是Velocity的int,值3可能意味着一个浮点数对于纬度,值为4可能意味着下一个字节是一个字符串,其长度前缀为int。
是否有使用这些规则解析事物的设计模式?我确信必须有一些方法比代码值上的大开关更好。我在C#中使用了BinaryReader,但我认为这是一种与语言无关的解决方案。
答案 0 :(得分:0)
您可能想要策略模式。每个策略实例都知道如何解析它的数据类型和要使用的字节数以及将处理读取的相关数据的某种回调或构建器对象
interface for ReadStrategy{
Read(Stream stream, MyObject obj);
}
class VelocityReader{
Read(Stream stream, MyObject obj){
//read 4 bytes as int.
int value = stream.ReadInt32();
myObj.setVelocity(value);
}
}
您还需要一个工厂类,它读取每条记录的第一个字节,以了解要使用的策略(可以实现为交换机),或者如果您想使用更多模式,请在策略中添加一个方法来了解如何识别它自己的代码值是什么,并使用Chain of Responsibility
轮询每个策略类型以找到可以处理代码值的第一个。