2012-05-04 88 views
3

我有兩種類似的方法來解析行。 第一種方法如何實施戰略模式?

public IList<LasLine> GetLasLines(string section) 
     { 
      var lasLines = new List<LasLine>(); 
      bool startParse = false; // Секція знайдена і почати парсити її 
      foreach(var line in _lines) 
      { 
       if(GetSectionName(line).Equals(section) && !startParse) 
       { 
        startParse = true; 
       } 
       else 
       { 
        if(IsCommentLine(line)) continue; 
        if(IsBeginSection(line)) break; 
        LasLine lasLine; 
        if(!TryParseLasLine(line, out lasLine)) continue; 
        lasLines.Add(lasLine); 
       } 
      } 
      return lasLines; 
     } 

其次

public IList<AsciiLogDataLine> GetAsciiLogData() 
{ 
var asciiLogData = new List<AsciiLogDataLine>(); 
bool startParse = false; 
foreach(var line in _lines) 
{ 
if(GetSectionName(line).Equals(LasSectionName.ASCIISection) && !startParse) 
{ 
startParse = true; 
} 
else 
{ 
    if(IsCommentLine(line)) continue; 
    AsciiLogDataLine asciiLogDataLine; 
    if(!TryParseAsciiLogDataLine(line, out asciiLogDataLine)) continue;       asciiLogData.Add(asciiLogDataLine);   
       } 
    } 
    return asciiLogData; 
    } 

是否有可能實現這種模式?

回答

0

正如我想的那樣,您可以爲這個線類創建共同的Contract(接口),並使用例如Generic Method。

IEnumerable<IDataLine> GetLines<T>(Func<object> parseFunction) 
{ 
    ... 
    var dataLine = parseFunction(line); 
    if (dataLine == null) 
    { 
     continue; 
    } 
    ... 
} 

或者你可以創建IParser,注入方法

IEnumerable<IDataLine> GetLines<T>(IParser parser) 
{ 
    ... 
    if (!parser.CanParse(line)) 
    { 
     continue; 
    } 
    var dataLine = parser.Parse(line); 
    ... 
} 

末樣品更相似的策略模式。