Я бы пошел, создав шаблон дизайна фабрики.
Создайте базовый класс для представления GeneralParser и создайте дочерний класс для каждого анализатора, и если в методе синтаксического анализа было что-то общее, пусть это будет в базовом методе Parse GeneralParser и вызовите метод base.parse в методе child.parse.
Я уверен, что у вас есть способ определить, какой синтаксический анализатор использовать, и я думаю, что в настоящее время вы используете управляющие операторы (if, switch ...) и выполняете синтаксический анализ. Что ж, теперь вместо этого позвольте специализированному (дочернему) классу парсера обработать его для вас.
Диаграмма псевдокласса:
GeneralParser
|
|
->XMLParser
->JsonParser
Вот некоторая реализация в C # .Net
public static class ParserFactory
{
public static GeneralParser CreateXMLParser()
{
return new XMLParser();
}
public static GeneralParser CreateJsonParser()
{
return new JSONParser();
}
}
В программном коде вы можете написать что-то вроде этого (псевдокод), потому что это зависит от того, как вы решаете, какой синтаксический анализатор использовать.
// ...
GeneralParser parser;
if( to_be_parsed_as_xml)
{
parser = ParserFactory.CreateXMLParser();
parser.Parse(stream);
}
else if( to_be_parsed_as_json )
{
parser = ParserFactory.CreateJsonParser();
parser.Parse(stream);
}
// ...
Вы можете создать парсер на лету (без сохранения его ссылки), если вам нужны только парсеры для разбора и ничего более.