Как добавить методы экспорта в существующую древовидную структуру в соответствии с "хорошими" методами ООП?
У нас есть древовидная структура, состоящая из разных типов узлов, и мне поручено написать некоторый код, который экспортирует дерево в некоторый формат XML.
Каждый узел наследуется от некоторого базового узла, и поэтому они могут наследовать базовый метод экспорта, но для пары типов узлов мне нужно написать собственный метод экспорта, поскольку их данные хранятся "интересным" способом.
Узлы в настоящее время содержат только данные и несколько методов, связанных с управлением деревом. Я чувствую, что лучше избегать добавления методов экспорта к самим узлам, потому что это означает, что узел обрабатывает несколько обязанностей (управление своими родителями / потомками, экспорт)
Процесс экспорта в основном начинается с корневого узла и рекурсивно вызывает export
так что в идеале я мог бы просто реализовать export
метод
Я ищу способ (например, шаблон проектирования), который позволил бы мне написать весь код экспорта в отдельном классе, используя при этом тот факт, что узлы имеют некоторую иерархию наследования.
Это будет написано в Java, если это имеет значение.
1 ответ
В этом случае у вас есть два варианта,
- Реализовать
Export
виртуальный метод базового класса, который может быть переопределен в производных классах по мере необходимости, или - Используйте шаблон посетителя, как предлагается в комментариях.
С моей точки зрения, реализация виртуального метода в базовом классе, вероятно, является самым быстрым подходом, без каких-либо серьезных недостатков дизайна. Однако в долгосрочной перспективе реализация Export
метод может резко измениться: скажем, вам нужно экспортировать узлы в виде объектов JSON, или при заданном наборе условий экспорт должен быть как XML, так и JSON, или просто POCO, или распечатать их в FileStream.
На этом этапе преимущества того, что экспортирующий код находится вне самого класса, становятся более очевидными, поскольку Export
Метод может расти очень быстро, чтобы справиться с этими несколькими сценариями. Класс узла может оставаться независимым от того, что посетитель (может быть XmlVisitor
или же JsonVisitor
) и что он делает, поэтому добавление или изменение процедур экспорта не подразумевает никаких изменений в объектах домена. Им просто нужно взять IVisitor
объект, который знает, как их обрабатывать.