Как добавить методы экспорта в существующую древовидную структуру в соответствии с "хорошими" методами ООП?

У нас есть древовидная структура, состоящая из разных типов узлов, и мне поручено написать некоторый код, который экспортирует дерево в некоторый формат XML.

Каждый узел наследуется от некоторого базового узла, и поэтому они могут наследовать базовый метод экспорта, но для пары типов узлов мне нужно написать собственный метод экспорта, поскольку их данные хранятся "интересным" способом.

Узлы в настоящее время содержат только данные и несколько методов, связанных с управлением деревом. Я чувствую, что лучше избегать добавления методов экспорта к самим узлам, потому что это означает, что узел обрабатывает несколько обязанностей (управление своими родителями / потомками, экспорт)

Процесс экспорта в основном начинается с корневого узла и рекурсивно вызывает exportтак что в идеале я мог бы просто реализовать export метод

Я ищу способ (например, шаблон проектирования), который позволил бы мне написать весь код экспорта в отдельном классе, используя при этом тот факт, что узлы имеют некоторую иерархию наследования.

Это будет написано в Java, если это имеет значение.

1 ответ

Решение

В этом случае у вас есть два варианта,

  • Реализовать Export виртуальный метод базового класса, который может быть переопределен в производных классах по мере необходимости, или
  • Используйте шаблон посетителя, как предлагается в комментариях.

С моей точки зрения, реализация виртуального метода в базовом классе, вероятно, является самым быстрым подходом, без каких-либо серьезных недостатков дизайна. Однако в долгосрочной перспективе реализация Export метод может резко измениться: скажем, вам нужно экспортировать узлы в виде объектов JSON, или при заданном наборе условий экспорт должен быть как XML, так и JSON, или просто POCO, или распечатать их в FileStream.

На этом этапе преимущества того, что экспортирующий код находится вне самого класса, становятся более очевидными, поскольку Export Метод может расти очень быстро, чтобы справиться с этими несколькими сценариями. Класс узла может оставаться независимым от того, что посетитель (может быть XmlVisitor или же JsonVisitor) и что он делает, поэтому добавление или изменение процедур экспорта не подразумевает никаких изменений в объектах домена. Им просто нужно взять IVisitor объект, который знает, как их обрабатывать.

Другие вопросы по тегам