В реализации шаблона посетителя с интерфейсами, как показано ниже (не стесняйтесь сказать мне, если вы считаете, что сами интерфейсы неверны), кто должен нести ответственность за отслеживание списка всех посещенных элементов? Посетитель или посещаемый? В частности, трекер также должен следить за тем, чтобы один и тот же элемент не посещался дважды (если граф, который я посещаю, содержит циклические ссылки).
/// <summary>
/// Defines a type that may accept visitors.
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IVisitable<T>
{
// Methods
void Accept(T instance, IVisitor<T> visitor);
}
/// <summary>
/// Defines a type that visits objects.
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IVisitor<T>
{
// Methods
void Visit(IVisitable<T> visitable);
// Properties
bool HasCompleted { get; }
}