Этот вопрос все еще немного запутан. Я подозреваю, что вы не поняли цель шаблона «Посетитель».
Как обсуждено здесь шаблон посетителя полезен, когда у вас сложная структура данных (например, дерево разбора), которая относительно стабильна (с точки зрения разработки), но вы хотите иметь возможность продолжать добавлять новые операции над всеми его элементами. Это неуклюже со стандартными методами ОО.
Технология, на которой основан шаблон посетителя, - это двойная диспетчеризация, поэтому, когда вы говорите: «Зачем использовать шаблон посетителя, если только для двойной диспетчеризации?» Вы фактически говорите: «Зачем использовать шаблон посетителя?»
Ваш пример кода включает только клиента, поэтому неясно, что на самом деле предлагает ваша новая техника.
Предоставленный код выглядит задом наперед для реального шаблона посетителя. Должно быть:
my_datastructure.accept(analytics_visitor);
где analytics_visitor
наследуется от MyDataStructureVisitor и предоставляет отдельные методы для каждого из типов элементов, которые может содержать структура данных.
Что касается достижений:
«Разделение кода» - неопределенный термин. Шаблон посетителя позволяет определять структуру данных без определения всех операций (предполагаемых методов). Вместо этого они могут быть определены отдельно - со стоимостью более плохой инкапсуляции.)
Непонятно, что значит применить шаблон посетителя к нескольким структурам данных. Каждый класс посетителей связан с одной структурой данных.
Цель состоит не в том, чтобы добавить «информацию» в устаревший код. Это добавление операций к устаревшему коду.