正如@W92 提到的,使用工厂返回解析策略将是一种常见的方法。单独的策略封装了每种类型所需的解析逻辑。AC# 示例...
var serialNumber = "20202|5666|00020|31";
var factory = new SerialParserFactory();
var parser = factory.GetParser(serialNumber);
IParsingResult result = parser.ParseSerial(serialNumber);
解析器都使用一个方法 ParseSerial 实现了一个公共接口,该方法返回一个 IParsingResult。解析器可以根据需要简单或复杂。
public interface ISerialParser
{
IParsingResult ParseSerial(string serialNumber);
}
public class SerialParserType2: ISerialParser
{
public IParsingResult ParseSerial(string serialNumber)
{
string[] parts = serialNumber.Split("|".ToCharArray());
int[] fields = new int[parts.Length-2];
for (int partIndex = 0; partIndex < parts.Length-1; partIndex++)
{
int value = 0;
if (!int.TryParse(parts[partIndex], out value))
{
value = 0;
}
fields[partIndex] = value;
}
int checkSum = 0;
if (!int.TryParse(parts[parts.Length-1], out checkSum))
{
checkSum = 0;
}
return new Type2Result
{
Fields = fields,
CheckSum = checkSum
};
}
}
和结果一样...
public class Type2Result: IParsingResult
{
public int[] Fields { get; set; }
public int CheckSum { get; set; }
}
在这种情况下,工厂可以很简单......
public class SerialParserFactory
{
public ISerialParser GetParser(string serialNumber)
{
string typeChar = serialNumber.Substring(0, 1);
switch (typeChar)
{
case "2":
return new SerialParserType2();
}
return new NotFoundParser();
}
}