Search code examples
c#strategy-pattern

How to implement the Strategy Pattern?


I have two simiiliar methods for parsing lines. first method

 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;
        }

And second

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;
    }

Is it possible to implement this pattern?


Solution

  • As i think, you can create common Contract (Interface) for this Line Classes, and use for example Generic Method.

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

    Or you can create IParser and inject it into the method

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

    Last sample more similar to the Strategy Pattern.