visitor или посетитель, данный шаблон решает задачу выноса бизнес логики из класса наружу. Приведу аналогию с принципом которому придерживаются разработчики БСП (да в принципе типовых конфигураций), если разработчик разрабатывая какой-то функционал предполагает, что какая-то чать может быть переопределена прикладными разработчиками, он выносит такие методы в переопределяемые общие модули. Переопределяемый общий модуль, это тот же модуль как и все остальные, просто в имени у него есть слово "Переопределяемый", т.е. у него так же нужно включать возможность изменения если захотим что-то переопределить. По большому счету, все это держится на чистых договоренностях. Шаблон проектирования visitor решает данную задачу тем, что бизнес логика (ту которую в дальнейшем будет переопределяться или вообще отдаваться полностью на откуп прикладных программистов) описывается в самом посетителе.
На объектах 1С схема получается такая:
в предыдущих статьях подробнее рассматривалось как реализовывать квазии-ООП в 1С
В данном случаи обработка ОбработкаСодержащаяСложныеМетоды, некий контейнер методов какого-то бизнес функционала, она на поддержке, в нем метод КакойтоМетод2() переопределяемый из вне. Вот его содержимое:
Процедура КакойтоМетод2(Посетитель) Экспорт
Если Посетитель = Неопределено Тогда
Возврат;
КонецЕсли;
Посетитель.Посетить(Неопределено);
КонецПроцедуры
Тут на самом деле простор для творчества, можно определить какой-то базовый код, до или после вызова
Процедура КакойтоМетод2(Посетитель) Экспорт
Если Посетитель = Неопределено Тогда
Возврат;
КонецЕсли;
// базовый алгоритм
Посетитель.Посетить(Неопределено);
// базовый алгоритм
КонецПроцедуры
или например сделать что бы значение какой-то переменной для дальнейшего использования определялось внешним алгоритмом
Процедура КакойтоМетод2(Посетитель) Экспорт
Если Посетитель = Неопределено Тогда
Возврат;
КонецЕсли;
Переменная = Посетитель.Посетить(Неопределено);
// базовый алгоритм с использованием Переменная
КонецПроцедуры
или сделать так
Процедура КакойтоМетод2(Посетитель) Экспорт
Если Посетитель = Неопределено Тогда
// Алгоритм по умолчанию.
Иначе
Посетитель.Посетить(Неопределено);
КонецЕсли;
КонецПроцедуры
Рассмотрим ту же ситуацию с общем модулем Переопределяемый, если бы основные функции были реализованы в какой-то обработке, она стояла бы на поддержке, а переопределяемые части задавались бы из вне, в итоге ничего в основной конфе не модифицируется.
Пример использования:
ОбработкаОбъект = Обработки.ОбработкаСодержащаяСложныеМетоды.Создать();
ОбработкаОбъект.КакойтоМетод(); // Это вызов типового метода
Посетитель = Обработки.Посититель1.Создать().Имплементация("ПосетительИнтерфейс");
ОбработкаОбъект.КакойтоМетод2(Посетитель); // Вызов переопределяемого метода
Посетитель = Обработки.Посититель2.Создать().Имплементация("ПосетительИнтерфейс");
ОбработкаОбъект.КакойтоМетод2(Посетитель); // Вызов переопределяемого метода, но уже с другим алгоритмом.